[PATCH STABLE] worker: wait worker pid explicitly
Jun Wu
quark at fb.com
Fri Jul 22 19:50:48 UTC 2016
# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1469216267 -3600
# Fri Jul 22 20:37:47 2016 +0100
# Node ID 74d799c4781183b539aedd93530f0e5fa06839cc
# Parent d3df009ab1175a6792549b51ae66486dd98f398b
# Available At https://bitbucket.org/quark-zju/hg-draft
# hg pull https://bitbucket.org/quark-zju/hg-draft -r 74d799c47811
worker: wait worker pid explicitly
Before this patch, waitforworkers uses os.wait() to collect child workers, and
only wait len(pids) processes. This can have serious issues if other code
spawns new processes and does not reap them: 1. worker.py may get wrong exit
code and kill innocent workers. 2. worker.py may continue without waiting for
all workers to complete.
This patch fixes the issue by using waitpid to wait worker pid explicitly.
diff --git a/mercurial/worker.py b/mercurial/worker.py
--- a/mercurial/worker.py
+++ b/mercurial/worker.py
@@ -112,8 +112,8 @@ def _posixworker(ui, func, staticargs, a
if err.errno != errno.ESRCH:
raise
def waitforworkers():
- for _pid in pids:
- st = _exitstatus(os.wait()[1])
+ for pid in pids:
+ st = _exitstatus(os.waitpid(pid, 0)[1])
if st and not problem[0]:
problem[0] = st
killworkers()
More information about the Mercurial-devel
mailing list