]> source.dussan.org Git - rspamd.git/commitdiff
Implement watching for async symbols.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Jun 2015 13:33:48 +0000 (09:33 -0400)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Jun 2015 13:34:04 +0000 (09:34 -0400)
src/libserver/symbols_cache.c
src/libserver/task.c

index 40a54ad0618868653a5dc6a4f290fb6ac1e9a654..b74f2c7d787a2e3880d569fc1ef1e43368f7b75e 100644 (file)
@@ -850,6 +850,19 @@ rspamd_symbols_cache_metric_limit (struct rspamd_task *task,
        return FALSE;
 }
 
+static void
+rspamd_symbols_cache_watcher_cb (gpointer sessiond, gpointer ud)
+{
+       struct rspamd_task *task = sessiond;
+       struct cache_item *item = ud;
+       struct cache_savepoint *checkpoint;
+
+       checkpoint = task->checkpoint;
+
+       /* Specify that we are done with this item */
+       setbit (checkpoint->processed_bits, item->id * 2 + 1);
+}
+
 static gboolean
 rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
                struct symbols_cache *cache,
@@ -867,6 +880,9 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
                setbit (checkpoint->processed_bits, item->id * 2);
                t1 = rspamd_get_ticks ();
                pending_before = rspamd_session_events_pending (task->s);
+               /* Watch for events appeared */
+               rspamd_session_watch_start (task->s, rspamd_symbols_cache_watcher_cb,
+                               item);
 
                if (item->symbol != NULL &&
                                G_UNLIKELY (check_debug_symbol (task->cfg, item->symbol))) {
@@ -879,10 +895,10 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
                }
 
                t2 = rspamd_get_ticks ();
-               pending_after = rspamd_session_events_pending (task->s);
-
                diff = (t2 - t1) * 1000000;
                rspamd_set_counter (item, diff);
+               rspamd_session_watch_stop (task->s);
+               pending_after = rspamd_session_events_pending (task->s);
 
                if (pending_before == pending_after) {
                        /* No new events registered */
index e063f0f5bc682ed0fd2294d3b2e7819aca3b290e..1638a46f3b26983ed1abbb7a0ffeee48c2b4c7b0 100644 (file)
@@ -135,6 +135,11 @@ rspamd_task_fin (void *arg)
                return TRUE;
        }
 
+       if (RSPAMD_TASK_IS_PROCESSED (task)) {
+               rspamd_task_reply (task);
+               return TRUE;
+       }
+
        /* One more iteration */
        return FALSE;
 }