From 5cae5b510f3fab0d4ed0ac303b7a7f3b99e9ffe7 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Thu, 6 Apr 2017 12:22:50 +0200 Subject: irmd: Prevent impatient user deadlock on shutdown --- src/irmd/main.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/irmd') diff --git a/src/irmd/main.c b/src/irmd/main.c index 41beb049..f9acb238 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -1584,6 +1584,14 @@ void irmd_sig_handler(int sig, case SIGINT: case SIGTERM: case SIGHUP: + pthread_rwlock_rdlock(&irmd.state_lock); + if (irmd.state == IRMD_NULL) { + log_info("Patience is bitter, but its fruit is sweet."); + pthread_rwlock_unlock(&irmd.state_lock); + return; + } + pthread_rwlock_unlock(&irmd.state_lock); + log_info("IRMd shutting down..."); pthread_rwlock_wrlock(&irmd.state_lock); @@ -2293,6 +2301,12 @@ int main(int argc, char ** argv) { struct sigaction sig_act; + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGINT); + sigaddset(&sigset, SIGQUIT); + sigaddset(&sigset, SIGHUP); + sigaddset(&sigset, SIGPIPE); bool use_stdout = false; @@ -2348,8 +2362,12 @@ int main(int argc, pthread_cancel(irmd.shm_sanitize); pthread_join(irmd.shm_sanitize, NULL); + pthread_sigmask(SIG_BLOCK, &sigset, NULL); + irm_fini(); + pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); + log_fini(); log_info("Bye."); -- cgit v1.2.3