From f29328d6557f1ebb3df5c0b491fb3dd3d970d356 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Mon, 18 May 2015 17:07:04 +0200 Subject: [PATCH] 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. --- src/udev/udevd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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);