summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLukáš Nykrýn <lnykryn@redhat.com>2016-07-16 21:04:13 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-07-16 15:04:13 -0400
commitccc2c98e1b0c06861577632440b996ca16cefd53 (patch)
treec5c2739229963c31b6ff9bbcc6a0205d086477dc /src/core
parent7fbbf283c8b1cebf29d14acf9ff6587ad525cbc2 (diff)
manager: don't skip sigchld handler for main and control pid for services (#3738)
During stop when service has one "regular" pid one main pid and one control pid and the sighld for the regular one is processed first the unit_tidy_watch_pids will skip the main and control pid and does not remove them from u->pids(). But then we skip the sigchld event because we already did one in the iteration and there are two pids in u->pids. v2: Use general unit_main_pid() and unit_control_pid() instead of reaching directly to service structure.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/manager.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/core/manager.c b/src/core/manager.c
index 902c2a0a27..c69b797430 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -1729,7 +1729,10 @@ static void invoke_sigchld_event(Manager *m, Unit *u, const siginfo_t *si) {
unit_unwatch_pid(u, si->si_pid);
if (UNIT_VTABLE(u)->sigchld_event) {
- if (set_size(u->pids) <= 1 || iteration != u->sigchldgen) {
+ if (set_size(u->pids) <= 1 ||
+ iteration != u->sigchldgen ||
+ unit_main_pid(u) == si->si_pid ||
+ unit_control_pid(u) == si->si_pid) {
UNIT_VTABLE(u)->sigchld_event(u, si->si_pid, si->si_code, si->si_status);
u->sigchldgen = iteration;
} else