diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c index 7c1b1cf89..1e900261c 100644 --- a/libdaemon/server/daemon-server.c +++ b/libdaemon/server/daemon-server.c @@ -551,9 +551,14 @@ static void _reap(daemon_state s, int waiting) while (ts) { if (waiting || !ts->active) { - if (ts->client.thread_id && - (errno = pthread_join(ts->client.thread_id, &rv))) - ERROR(&s, "pthread_join failed: %s", strerror(errno)); + if (ts->client.thread_id) { + if ((errno = pthread_kill(ts->client.thread_id, SIGTERM)) && + (errno != ESRCH)) + ERROR(&s, "pthread_kill failed for pid %ld", + (long)ts->client.thread_id); + if ((errno = pthread_join(ts->client.thread_id, &rv))) + ERROR(&s, "pthread_join failed: %s", strerror(errno)); + } last->next = ts->next; free(ts); } else @@ -659,19 +664,13 @@ void daemon_start(daemon_state s) if (sigprocmask(SIG_SETMASK, NULL, &old_set)) perror("sigprocmask error"); - while (!failed) { + while (!failed && !_shutdown_requested) { _reset_timeout(s); FD_ZERO(&in); FD_SET(s.socket_fd, &in); if (sigprocmask(SIG_SETMASK, &new_set, NULL)) perror("sigprocmask error"); - if (_shutdown_requested && !s.threads->next) { - if (sigprocmask(SIG_SETMASK, &old_set, NULL)) - perror("sigprocmask error"); - INFO(&s, "%s shutdown requested", s.name); - break; - } ret = pselect(s.socket_fd + 1, &in, NULL, NULL, _get_timeout(s), &old_set); if (sigprocmask(SIG_SETMASK, &old_set, NULL)) perror("sigprocmask error"); @@ -679,6 +678,7 @@ void daemon_start(daemon_state s) if (ret < 0) { if ((errno != EINTR) && (errno != EAGAIN)) perror("select error"); + _reap(s, 0); continue; } @@ -698,6 +698,9 @@ void daemon_start(daemon_state s) } } + if (_shutdown_requested) + INFO(&s, "%s shutdown requested", s.name); + INFO(&s, "%s waiting for client threads to finish", s.name); _reap(s, 1); out: