1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-01 00:51:24 +03:00

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.
This commit is contained in:
Tom Gundersen 2015-05-18 17:07:04 +02:00
parent b2d21d9318
commit f29328d655

View File

@ -1042,12 +1042,12 @@ static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *si, voi
pid = waitpid(-1, &status, WNOHANG); pid = waitpid(-1, &status, WNOHANG);
if (pid <= 0) if (pid <= 0)
return 1; break;
worker = hashmap_get(manager->workers, UINT_TO_PTR(pid)); worker = hashmap_get(manager->workers, UINT_TO_PTR(pid));
if (!worker) { if (!worker) {
log_warning("worker ["PID_FMT"] is unknown, ignoring", pid); log_warning("worker ["PID_FMT"] is unknown, ignoring", pid);
return 1; continue;
} }
if (WIFEXITED(status)) { 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))); log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
} else if (WIFSTOPPED(status)) { } else if (WIFSTOPPED(status)) {
log_info("worker ["PID_FMT"] stopped", pid); log_info("worker ["PID_FMT"] stopped", pid);
return 1; continue;
} else if (WIFCONTINUED(status)) { } else if (WIFCONTINUED(status)) {
log_info("worker ["PID_FMT"] continued", pid); log_info("worker ["PID_FMT"] continued", pid);
return 1; continue;
} else } else
log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status); log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);