]> source.dussan.org Git - rspamd.git/commitdiff
Add preliminary support of async events in libstat
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 6 Jan 2016 16:19:48 +0000 (16:19 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 6 Jan 2016 16:19:48 +0000 (16:19 +0000)
src/libstat/stat_config.c
src/libstat/stat_internal.h

index 1646ce3b75395e96787b563d5458a401cf1ad516..ac4d70fc81d363ab573fb0db9b0d9f32a2379490 100644 (file)
@@ -110,6 +110,7 @@ rspamd_stat_init (struct rspamd_config *cfg, struct event_base *ev_base)
        stat_ctx->cfg = cfg;
        stat_ctx->statfiles = g_ptr_array_new ();
        stat_ctx->classifiers = g_ptr_array_new ();
+       stat_ctx->async_elts = g_queue_new ();
        stat_ctx->ev_base = ev_base;
        REF_RETAIN (stat_ctx->cfg);
 
@@ -197,6 +198,8 @@ rspamd_stat_close (void)
        struct rspamd_classifier *cl;
        struct rspamd_statfile *st;
        struct rspamd_stat_ctx *st_ctx;
+       struct rspamd_stat_async_elt *aelt;
+       GList *cur;
        guint i, j;
        gint id;
 
@@ -218,6 +221,19 @@ rspamd_stat_close (void)
                g_slice_free1 (sizeof (*cl), cl);
        }
 
+       cur = st_ctx->async_elts->head;
+
+       while (cur) {
+               aelt = cur->data;
+
+               if (aelt->cleanup) {
+                       aelt->cleanup (aelt, aelt->ud);
+               }
+
+               cur = g_list_next (cur);
+       }
+
+       g_queue_free (stat_ctx->async_elts);
        g_ptr_array_free (st_ctx->statfiles, TRUE);
        g_ptr_array_free (st_ctx->classifiers, TRUE);
        REF_RELEASE (stat_ctx->cfg);
index 7e5804b8bfd0bf14f570921326f84d8780421ed9..31257938d629e8b2a9a0933dde72d605b5550e6b 100644 (file)
@@ -65,6 +65,13 @@ typedef struct token_node_s {
        gdouble values[];
 } rspamd_token_t;
 
+struct rspamd_stat_async_elt {
+       void (*handler)(struct rspamd_stat_async_elt *elt, gpointer ud);
+       void (*cleanup)(struct rspamd_stat_async_elt *elt, gpointer ud);
+       struct event ev;
+       gpointer ud;
+};
+
 struct rspamd_stat_ctx {
        /* Subroutines for all objects */
        struct rspamd_stat_classifier *classifiers_subrs;
@@ -79,6 +86,7 @@ struct rspamd_stat_ctx {
        /* Runtime configuration */
        GPtrArray *statfiles; /* struct rspamd_statfile */
        GPtrArray *classifiers; /* struct rspamd_classifier */
+       GQueue *async_elts; /* struct rspamd_stat_async_elt */
        struct rspamd_config *cfg;
        /* Global tokenizer */
        struct rspamd_stat_tokenizer *tokenizer;