From 1c55e37dcbb5a361248baddb72efe66e4c6f84c0 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Wed, 14 Jun 2017 15:14:53 +0300 Subject: [PATCH] odissey: add basic signal handler coroutine --- lib/machinarium | 2 +- src/od_instance.c | 6 +++++- src/od_pooler.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/machinarium b/lib/machinarium index ace516ce..d5ac45b6 160000 --- a/lib/machinarium +++ b/lib/machinarium @@ -1 +1 @@ -Subproject commit ace516cedd34cf537dbf23afd7095ccbb038d6df +Subproject commit d5ac45b6513e006b5da362b5dfa32d2608cf166d diff --git a/src/od_instance.c b/src/od_instance.c index a85bbf85..10af227e 100644 --- a/src/od_instance.c +++ b/src/od_instance.c @@ -54,7 +54,11 @@ void od_instance_init(od_instance_t *instance) od_scheme_init(&instance->scheme); od_config_init(&instance->config, &instance->log, &instance->scheme); - signal(SIGPIPE, SIG_IGN); + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGPIPE); + sigprocmask(SIG_BLOCK, &mask, NULL); } void od_instance_free(od_instance_t *instance) diff --git a/src/od_pooler.c b/src/od_pooler.c index a4d7477f..f1d76b8c 100644 --- a/src/od_pooler.c +++ b/src/od_pooler.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -161,6 +162,36 @@ od_pooler_main(od_pooler_t *pooler) } } +static inline void +od_signalizer(void *arg) +{ + od_pooler_t *pooler = arg; + od_instance_t *instance = pooler->system->instance; + + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + + int rc; + rc = machine_signal_init(&mask); + if (rc == -1) { + od_error(&instance->log, "failed to init signal handler"); + return; + } + + for (;;) + { + rc = machine_signal_wait(UINT32_MAX); + if (rc == -1) + break; + switch (rc) { + case SIGINT: + od_log(&instance->log, "pooler: SIGINT"); + break; + } + } +} + static inline void od_pooler(void *arg) { @@ -169,6 +200,14 @@ od_pooler(void *arg) od_log(&instance->log, "pooler: started"); + /* start signal handler coroutine */ + int64_t coroutine_id; + coroutine_id = machine_coroutine_create(od_signalizer, pooler); + if (coroutine_id == -1) { + od_error(&instance->log, "failed to start signal handler"); + return; + } + /* start router coroutine */ int rc; od_router_t *router;