From 10bd340cbd1a040376d2fc716b9fefbb63f73845 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Tue, 12 Aug 2014 18:20:59 +0100 Subject: [PATCH] signal handling --- src/event_dispatcher.c | 36 +++++++++++++++++++++++++ src/event_dispatcher_register_handler.c | 12 ++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/event_dispatcher.c b/src/event_dispatcher.c index e3114e9..3f43845 100644 --- a/src/event_dispatcher.c +++ b/src/event_dispatcher.c @@ -21,6 +21,8 @@ */ #include +#include +#include #include "trbase.h" #include "trdata.h" @@ -28,6 +30,35 @@ #include "tr/event_handler.h" #include "tr/event_dispatcher.h" +volatile TR_EventDispatcher _TR_controlDispatcher; + +static +void +terminate(int signum) +{ + signal(signum, SIG_IGN); + /* + * \todo do logging here + */ + puts("signal ... go"); + TR_eventDispatcherShutdown(_TR_controlDispatcher); +} + +static +void +init_signals(void) +{ + signal(SIGTERM, terminate); + signal(SIGHUP, SIG_IGN); + signal(SIGINT, terminate); + signal(SIGQUIT, terminate); + signal(SIGABRT, terminate); + signal(SIGALRM, SIG_IGN); + signal(SIGURG, SIG_IGN); + + signal(SIGPIPE, SIG_IGN); +} + static int eventDispatcherCtor(void * _this, va_list * params) { @@ -41,6 +72,11 @@ eventDispatcherCtor(void * _this, va_list * params) { this->heartbeat = 0; this->nextbeat = 0; + if (! _TR_controlDispatcher) { + _TR_controlDispatcher = this; + init_signals(); + } + return 0; } diff --git a/src/event_dispatcher_register_handler.c b/src/event_dispatcher_register_handler.c index 8ec260b..5c46539 100644 --- a/src/event_dispatcher_register_handler.c +++ b/src/event_dispatcher_register_handler.c @@ -39,13 +39,17 @@ doRegister(const void * _node, const void * data) handler_queue_hv = TR_hashGetByVal(dispatcher->handler, node->hash); if (handler_queue_hv) { - handler_queue = (TR_Queue)handler_queue_hv->value; + handler_queue = *(TR_Queue *)handler_queue_hv->value; } else { handler_queue = TR_new(TR_Queue); handler_queue->free_msgs = 0; - TR_hashAdd( - dispatcher->handler, - TR_new(TR_HashValue, node->key, node->nkey, &handler_queue, sizeof(TR_Queue))); + handler_queue_hv = TR_new( + TR_HashValue, + node->key, + node->nkey, + &handler_queue, + sizeof(TR_Queue)); + TR_hashAdd(dispatcher->handler, handler_queue_hv); } TR_queuePut(handler_queue, current_handler);