changeset 30433:f2d13eb85198

worker: kill workers after all zombie processes are reaped Since we now wait child processes in non-blocking way (changed by 7bc25549e084 and e8fb03cfbbde), we don't have to kill them in the middle of the waitpid() loop. This change will help solving a possible race of waitpid()-pids.discard() sequence and another SIGCHLD. waitforworkers() is called by cleanup(), in which case we do killworkers() beforehand so we can remove killworkers() from waitforworkers().
author Yuya Nishihara <yuya@tcha.org>
date Thu, 17 Nov 2016 21:08:58 +0900
parents 237b2883cbd8
children 03f7aa2bd0e3
files mercurial/worker.py
diffstat 1 files changed, 2 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/worker.py	Thu Nov 17 20:44:05 2016 +0900
+++ b/mercurial/worker.py	Thu Nov 17 21:08:58 2016 +0900
@@ -119,9 +119,10 @@
                 st = _exitstatus(st)
             if st and not problem[0]:
                 problem[0] = st
-                killworkers()
     def sigchldhandler(signum, frame):
         waitforworkers(blocking=False)
+        if problem[0]:
+            killworkers()
     oldchldhandler = signal.signal(signal.SIGCHLD, sigchldhandler)
     for pargs in partition(args, workers):
         pid = os.fork()