udevd: process all SIGCHLD events every time the handler is invoked
authorTom Gundersen <teg@jklm.no>
Mon, 18 May 2015 15:07:04 +0000 (17:07 +0200)
committerTom Gundersen <teg@jklm.no>
Mon, 18 May 2015 21:49:35 +0000 (23:49 +0200)
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

index 892637f..a9e82de 100644 (file)
@@ -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);