[PATCH 1 of 8 V5] worker: move killworkers and waitforworkers up

Jun Wu quark at fb.com
Tue Nov 15 02:39:04 UTC 2016


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1469735397 -3600
#      Thu Jul 28 20:49:57 2016 +0100
# Node ID 7a81772420713713fb372966a9018c20083beaed
# Parent  d1a0a64f6e16432333bea0476098c46a61222b9b
# Available At https://bitbucket.org/quark-zju/hg-draft
#              hg pull https://bitbucket.org/quark-zju/hg-draft -r 7a8177242071
worker: move killworkers and waitforworkers up

We need to use them in the SIGCHLD handler and SIGCHLD handler should be
installed before fork.

diff --git a/mercurial/worker.py b/mercurial/worker.py
--- a/mercurial/worker.py
+++ b/mercurial/worker.py
@@ -90,4 +90,18 @@ def _posixworker(ui, func, staticargs, a
     signal.signal(signal.SIGINT, signal.SIG_IGN)
     pids, problem = [], [0]
+    def killworkers():
+        # if one worker bails, there's no good reason to wait for the rest
+        for p in pids:
+            try:
+                os.kill(p, signal.SIGTERM)
+            except OSError as err:
+                if err.errno != errno.ESRCH:
+                    raise
+    def waitforworkers():
+        for _pid in pids:
+            st = _exitstatus(os.wait()[1])
+            if st and not problem[0]:
+                problem[0] = st
+                killworkers()
     for pargs in partition(args, workers):
         pid = os.fork()
@@ -107,18 +121,4 @@ def _posixworker(ui, func, staticargs, a
     os.close(wfd)
     fp = os.fdopen(rfd, 'rb', 0)
-    def killworkers():
-        # if one worker bails, there's no good reason to wait for the rest
-        for p in pids:
-            try:
-                os.kill(p, signal.SIGTERM)
-            except OSError as err:
-                if err.errno != errno.ESRCH:
-                    raise
-    def waitforworkers():
-        for _pid in pids:
-            st = _exitstatus(os.wait()[1])
-            if st and not problem[0]:
-                problem[0] = st
-                killworkers()
     t = threading.Thread(target=waitforworkers)
     t.start()


More information about the Mercurial-devel mailing list