diff -r 9c25a1a8c685 -r 5069a8a40b1b mercurial/worker.py --- 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