mercurial/worker.py
changeset 30414 5069a8a40b1b
parent 30413 9c25a1a8c685
child 30415 e8fb03cfbbde
--- a/mercurial/worker.py	Tue Nov 15 02:10:40 2016 +0000
+++ b/mercurial/worker.py	Tue Nov 15 02:12:16 2016 +0000
@@ -98,9 +98,20 @@
                 if err.errno != errno.ESRCH:
                     raise
     def waitforworkers(blocking=True):
-        for pid in pids:
-            p, st = os.waitpid(pid, 0 if blocking else os.WNOHANG)
+        for pid in pids.copy():
+            p = st = 0
+            while True:
+                try:
+                    p, st = os.waitpid(pid, (0 if blocking else os.WNOHANG))
+                except OSError as e:
+                    if e.errno == errno.EINTR:
+                        continue
+                    elif e.errno == errno.ECHILD:
+                        break # ignore ECHILD
+                    else:
+                        raise
             if p:
+                pids.remove(p)
                 st = _exitstatus(st)
             if st and not problem[0]:
                 problem[0] = st