Hi Kim,
On Thu, 12 Apr 2018, Kim Gybels wrote:
> The poll provided in compat/poll.c is not interrupted by receiving
> SIGCHLD. Use a timeout for cleaning up dead children in a timely manner.
Maybe say "When using this poll emulation, use a timeout ..."?
> diff --git a/daemon.c b/daemon.c
> index fe833ea7de..6dc95c1b2f 100644
> --- a/daemon.c
> +++ b/daemon.c
> @@ -1147,6 +1147,7 @@ static int service_loop(struct socketlist *socklist)
> {
> struct pollfd *pfd;
> int i;
> + int poll_timeout = -1;
Just reuse the line above:
int poll_timeout = -1, i;
> @@ -1161,8 +1162,13 @@ static int service_loop(struct socketlist *socklist)
> int i;
>
> check_dead_children();
> -
> - if (poll(pfd, socklist->nr, -1) < 0) {
> +#ifdef NO_POLL
> + poll_timeout = live_children ? 100 : -1;
> +#endif
> + int ret = poll(pfd, socklist->nr, poll_timeout);
> + if (ret == 0) {
> + continue;
> + } else if (ret < 0) {
I would find it a bit easier on the eyes if this did not use curlies, and
dropped the unnecessary `else` (`continue` will take care of that):
if (!ret)
continue;
if (ret < 0)
[...]
Thank you for working on this!
Ciao,
Dscho