odissey: add basic signal handler coroutine

This commit is contained in:
Dmitry Simonenko 2017-06-14 15:14:53 +03:00
parent 93c07b11f5
commit 1c55e37dcb
3 changed files with 45 additions and 2 deletions

@ -1 +1 @@
Subproject commit ace516cedd34cf537dbf23afd7095ccbb038d6df
Subproject commit d5ac45b6513e006b5da362b5dfa32d2608cf166d

View File

@ -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)

View File

@ -11,6 +11,7 @@
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <unistd.h>
#include <signal.h>
#include <machinarium.h>
@ -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;