From: Martin Mares Date: Thu, 9 Feb 2012 15:52:53 +0000 (+0100) Subject: All sleeps should be interruptible by SIGINT and SIGTERM X-Git-Tag: v1.2~4 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=90a35de87906dfe3e2bcb769caca3a087d391aa2;p=arexx.git All sleeps should be interruptible by SIGINT and SIGTERM --- diff --git a/arexxd.c b/arexxd.c index 005c2a3..3baaefd 100644 --- a/arexxd.c +++ b/arexxd.c @@ -486,6 +486,7 @@ static void set_clock(void) /*** Main ***/ +static sigset_t term_sigs; static volatile sig_atomic_t want_shutdown; static void sigterm_handler(int sig __attribute__((unused))) @@ -493,6 +494,13 @@ static void sigterm_handler(int sig __attribute__((unused))) want_shutdown = 1; } +static void interruptible_sleep(int seconds) +{ + sigprocmask(SIG_UNBLOCK, &term_sigs, NULL); + sleep(seconds); + sigprocmask(SIG_BLOCK, &term_sigs, NULL); +} + static const struct option long_options[] = { { "debug", 0, NULL, 'd' }, { "log-dir", 1, NULL, 'l' }, @@ -566,7 +574,6 @@ int main(int argc, char **argv) sigaction(SIGTERM, &sa, NULL); sigaction(SIGINT, &sa, NULL); - sigset_t term_sigs; sigemptyset(&term_sigs); sigaddset(&term_sigs, SIGTERM); sigaddset(&term_sigs, SIGINT); @@ -579,7 +586,7 @@ int main(int argc, char **argv) inited = 1; log_error("Data logger not connected, waiting until it appears"); } - sleep(30); + interruptible_sleep(30); continue; } log_info("Listening"); @@ -611,18 +618,16 @@ int main(int argc, char **argv) want_sleep = 1; if (err > 0 && parse_packet(reply)) want_sleep = 0; - sigprocmask(SIG_UNBLOCK, &term_sigs, NULL); if (want_sleep) { - sleep(4); + interruptible_sleep(4); want_stats = 1; } - sigprocmask(SIG_BLOCK, &term_sigs, NULL); } log_info("Disconnecting data logger"); release_device(); inited = 0; - sleep(10); + interruptible_sleep(10); } log_info("Terminated");