--- 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