sigaction (signo, &sig, NULL);
}
+static void
+rspamd_worker_default_signal (int signo)
+{
+ struct sigaction sig;
+
+ sigemptyset (&sig.sa_mask);
+ sigaddset (&sig.sa_mask, signo);
+ sig.sa_handler = SIG_DFL;
+ sig.sa_flags = 0;
+ sigaction (signo, &sig, NULL);
+}
+
+static void
+rspamd_sigh_free (void *p)
+{
+ struct rspamd_worker_signal_handler *sigh = p;
+ struct rspamd_worker_signal_cb *cb, *tmp;
+
+ DL_FOREACH_SAFE (sigh->cb, cb, tmp) {
+ DL_DELETE (sigh->cb, cb);
+ g_free (cb);
+ }
+
+ event_del (&sigh->ev);
+ rspamd_worker_default_signal (sigh->signo);
+ g_free (sigh);
+}
+
void
rspamd_worker_set_signal_handler (int signo, struct rspamd_worker *worker,
struct event_base *base,
DL_APPEND (sigh->cb, cb);
}
-static void
+void
rspamd_worker_init_signals (struct rspamd_worker *worker, struct event_base *base)
{
struct sigaction signals;
worker->srv->pid = getpid ();
worker->signal_events = g_hash_table_new_full (g_direct_hash, g_direct_equal,
- NULL, g_free);
+ NULL, rspamd_sigh_free);
ev_base = event_init ();
sigprocmask (SIG_BLOCK, &set, NULL);
}
+void
+rspamd_worker_unblock_signals (void)
+{
+ sigset_t set;
+
+ sigemptyset (&set);
+ sigaddset (&set, SIGTERM);
+ sigaddset (&set, SIGINT);
+ sigaddset (&set, SIGHUP);
+ sigaddset (&set, SIGUSR1);
+ sigaddset (&set, SIGUSR2);
+ sigprocmask (SIG_UNBLOCK, &set, NULL);
+}
+
void
rspamd_hard_terminate (struct rspamd_main *rspamd_main)
{
struct rspamd_worker;
struct rspamd_worker_signal_handler;
+/**
+ * Init basic signals for a worker
+ * @param worker
+ * @param base
+ */
+void rspamd_worker_init_signals (struct rspamd_worker *worker, struct event_base *base);
/**
* Prepare worker's startup
* @param worker worker structure
*/
void rspamd_worker_block_signals (void);
+/**
+ * Unblock signals
+ */
+void rspamd_worker_unblock_signals (void);
+
/**
* Kill rspamd main and all workers
* @param rspamd_main
/* Here we assume that we can block on writing results */
rspamd_socket_blocking (cbdata->sp[1]);
event_reinit (cbdata->ev_base);
+ g_hash_table_remove_all (w->signal_events);
+ rspamd_worker_unblock_signals ();
rspamd_lua_execute_lua_subprocess (L, cbdata);
/* Wait for parent to reply and exit */