mirror of https://github.com/yandex/odyssey.git
odissey: add basic signal handler coroutine
This commit is contained in:
parent
93c07b11f5
commit
1c55e37dcb
|
@ -1 +1 @@
|
|||
Subproject commit ace516cedd34cf537dbf23afd7095ccbb038d6df
|
||||
Subproject commit d5ac45b6513e006b5da362b5dfa32d2608cf166d
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue