aboutsummaryrefslogtreecommitdiffstats
path: root/src/worker.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-10-25 13:58:09 +0200
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-10-25 13:58:34 +0200
commit8ee425e85963a1fcb1c38f516c51fc3ac98c0528 (patch)
treeccbe65bdc7407987a0b66be5ee2153b7f468bfad /src/worker.c
parente3788b3fbf3b4ec6c07ac41676148a22edb908e4 (diff)
downloadrspamd-8ee425e85963a1fcb1c38f516c51fc3ac98c0528.tar.gz
rspamd-8ee425e85963a1fcb1c38f516c51fc3ac98c0528.zip
[Fix] Fix on_finish scripts and async handlers
Diffstat (limited to 'src/worker.c')
-rw-r--r--src/worker.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/worker.c b/src/worker.c
index fcf4e2c73..fcb9d9fe3 100644
--- a/src/worker.c
+++ b/src/worker.c
@@ -73,7 +73,19 @@ worker_t normal_worker = {
G_STRFUNC, \
__VA_ARGS__)
-static void
+static gboolean
+rspamd_worker_finalize (gpointer user_data)
+{
+ struct rspamd_task *task = user_data;
+ struct timeval tv = {.tv_sec = 0, .tv_usec = 0};
+
+ msg_info_task ("finishing actions has been processed, terminating");
+ event_base_loopexit (task->ev_base, &tv);
+
+ return TRUE;
+}
+
+static gboolean
rspamd_worker_call_finish_handlers (struct rspamd_worker *worker)
{
struct rspamd_task *task;
@@ -88,7 +100,7 @@ rspamd_worker_call_finish_handlers (struct rspamd_worker *worker)
task->resolver = ctx->resolver;
task->ev_base = ctx->ev_base;
task->s = rspamd_session_create (task->task_pool,
- NULL,
+ rspamd_worker_finalize,
NULL,
(event_finalizer_t) rspamd_task_free,
task);
@@ -96,8 +108,13 @@ rspamd_worker_call_finish_handlers (struct rspamd_worker *worker)
DL_FOREACH (cfg->finish_callbacks, sc) {
lua_call_finish_script (cfg->lua_state, sc, task);
}
+
+ if (rspamd_session_pending (task->s)) {
+ return TRUE;
+ }
}
+ return FALSE;
}
/*
@@ -558,13 +575,17 @@ init_worker (struct rspamd_config *cfg)
return ctx;
}
-static void
+static gboolean
rspamd_worker_on_terminate (struct rspamd_worker *worker)
{
if (worker->nconns == 0) {
msg_info ("performing finishing actions");
- rspamd_worker_call_finish_handlers (worker);
+ if (rspamd_worker_call_finish_handlers (worker)) {
+ return TRUE;
+ }
}
+
+ return FALSE;
}
/*