Browse Source

signal handling

1.0.0
Georg Hopp 11 years ago
parent
commit
10bd340cbd
  1. 36
      src/event_dispatcher.c
  2. 12
      src/event_dispatcher_register_handler.c

36
src/event_dispatcher.c

@ -21,6 +21,8 @@
*/ */
#include <stdint.h> #include <stdint.h>
#include <signal.h>
#include <stdio.h>
#include "trbase.h" #include "trbase.h"
#include "trdata.h" #include "trdata.h"
@ -28,6 +30,35 @@
#include "tr/event_handler.h" #include "tr/event_handler.h"
#include "tr/event_dispatcher.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 static
int int
eventDispatcherCtor(void * _this, va_list * params) { eventDispatcherCtor(void * _this, va_list * params) {
@ -41,6 +72,11 @@ eventDispatcherCtor(void * _this, va_list * params) {
this->heartbeat = 0; this->heartbeat = 0;
this->nextbeat = 0; this->nextbeat = 0;
if (! _TR_controlDispatcher) {
_TR_controlDispatcher = this;
init_signals();
}
return 0; return 0;
} }

12
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); handler_queue_hv = TR_hashGetByVal(dispatcher->handler, node->hash);
if (handler_queue_hv) { if (handler_queue_hv) {
handler_queue = (TR_Queue)handler_queue_hv->value;
handler_queue = *(TR_Queue *)handler_queue_hv->value;
} else { } else {
handler_queue = TR_new(TR_Queue); handler_queue = TR_new(TR_Queue);
handler_queue->free_msgs = 0; 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); TR_queuePut(handler_queue, current_handler);

Loading…
Cancel
Save