mirror of https://github.com/reiseburo/hermann
Add Hermann signal handler into chain to allow us to send SIGINT, etc. up the chain.
This commit is contained in:
parent
3a6c02f023
commit
f0254cdefe
|
@ -80,6 +80,38 @@ void fprintf_hermann_instance_config(HermannInstanceConfig *config,
|
||||||
topic, brokers, partition, isInitialized, isRkSet, isRktSet );
|
topic, brokers, partition, isInitialized, isRkSet, isRktSet );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hermann_signal_handler(int signum) {
|
||||||
|
/* Set our global run state to false */
|
||||||
|
KLAXON = 1; // We're going down
|
||||||
|
|
||||||
|
/* Invoke Ruby's handler */
|
||||||
|
#ifdef TRACE
|
||||||
|
fprintf(stderr, "hermann_signal_handler invoked with signal %d\n", signum);
|
||||||
|
#endif
|
||||||
|
ruby_vm_sighandler(signum);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* During processing loops, unless we have access to rb_blocking_thread, we need to include
|
||||||
|
* our own signal handler for interrupts. This will allow us to detect sigint and stop the run
|
||||||
|
* loops, primarily for consumers.
|
||||||
|
*/
|
||||||
|
static void hook_into_sighandler_chain() {
|
||||||
|
struct sigaction our_signal_handler_def;
|
||||||
|
struct sigaction old_signal_handler_def;
|
||||||
|
|
||||||
|
/* retrieve and store Ruby's signal handler */
|
||||||
|
sigaction(SIGINT, NULL, &old_signal_handler_def);
|
||||||
|
ruby_vm_sighandler = old_signal_handler_def.sa_handler;
|
||||||
|
|
||||||
|
/* set our handler */
|
||||||
|
memset(&our_signal_handler_def, 0, sizeof(our_signal_handler_def));
|
||||||
|
our_signal_handler_def.sa_handler = hermann_signal_handler;
|
||||||
|
sigemptyset(&our_signal_handler_def.sa_mask);
|
||||||
|
sigaction(SIGINT, &our_signal_handler_def, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Message delivery report callback.
|
* Message delivery report callback.
|
||||||
* Called once for each message.
|
* Called once for each message.
|
||||||
|
@ -364,7 +396,7 @@ void consumer_consume_loop(HermannInstanceConfig* consumerConfig) {
|
||||||
fprintf(stderr, "consumer_consume_loop");
|
fprintf(stderr, "consumer_consume_loop");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (consumerConfig->run) {
|
while (consumerConfig->run && !KLAXON) {
|
||||||
if (rd_kafka_consume_callback(consumerConfig->rkt, consumerConfig->partition,
|
if (rd_kafka_consume_callback(consumerConfig->rkt, consumerConfig->partition,
|
||||||
1000/*timeout*/,
|
1000/*timeout*/,
|
||||||
msg_consume,
|
msg_consume,
|
||||||
|
@ -893,6 +925,9 @@ void Init_hermann_lib() {
|
||||||
fprintf(stderr, "init_hermann_lib\n");
|
fprintf(stderr, "init_hermann_lib\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Chain our signal handler with Ruby VM's */
|
||||||
|
hook_into_sighandler_chain();
|
||||||
|
|
||||||
/* Define the module */
|
/* Define the module */
|
||||||
hermann_module = rb_define_module("Hermann");
|
hermann_module = rb_define_module("Hermann");
|
||||||
lib_module = rb_define_module_under(hermann_module, "Lib");
|
lib_module = rb_define_module_under(hermann_module, "Lib");
|
||||||
|
|
|
@ -50,6 +50,14 @@ static VALUE hermann_module;
|
||||||
|
|
||||||
static int DEBUG = 0;
|
static int DEBUG = 0;
|
||||||
|
|
||||||
|
// Hold the system signal handler
|
||||||
|
static void (*ruby_vm_sighandler)(int) = NULL;
|
||||||
|
|
||||||
|
// Global klaxon announcing we're going down
|
||||||
|
// 0 - normal operation
|
||||||
|
// 1 - we're going down
|
||||||
|
static int KLAXON = 0;
|
||||||
|
|
||||||
// Should we expect rb_thread_blocking_region to be present?
|
// Should we expect rb_thread_blocking_region to be present?
|
||||||
// #define RB_THREAD_BLOCKING_REGION
|
// #define RB_THREAD_BLOCKING_REGION
|
||||||
#undef RB_THREAD_BLOCKING_REGION
|
#undef RB_THREAD_BLOCKING_REGION
|
||||||
|
|
Loading…
Reference in New Issue