From: Tom Gundersen Date: Mon, 18 May 2015 15:07:04 +0000 (+0200) Subject: udevd: process all SIGCHLD events every time the handler is invoked X-Git-Tag: v220~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f29328d6557f1ebb3df5c0b491fb3dd3d970d356;p=thirdparty%2Fsystemd.git udevd: process all SIGCHLD events every time the handler is invoked We were returning rather than continuing in some cases. The intention was always to fully process all pending events before returning from the SIGCHLD handler. Restore this behaviour. --- diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 892637f052d..a9e82de4cd5 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1042,12 +1042,12 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi pid = waitpid(-1, &status, WNOHANG); if (pid <= 0) - return 1; + break; worker = hashmap_get(manager->workers, UINT_TO_PTR(pid)); if (!worker) { log_warning("worker ["PID_FMT"] is unknown, ignoring", pid); - return 1; + continue; } if (WIFEXITED(status)) { @@ -1059,10 +1059,10 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status))); } else if (WIFSTOPPED(status)) { log_info("worker ["PID_FMT"] stopped", pid); - return 1; + continue; } else if (WIFCONTINUED(status)) { log_info("worker ["PID_FMT"] continued", pid); - return 1; + continue; } else log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);