Mercurial > public > mercurial-scm > hg
comparison mercurial/worker.py @ 30410:7a5d6e2fd2d5
worker: move killworkers and waitforworkers up
We need to use them in the SIGCHLD handler and SIGCHLD handler should be
installed before fork.
author | Jun Wu <quark@fb.com> |
---|---|
date | Thu, 28 Jul 2016 20:49:57 +0100 |
parents | 78a58dcf8853 |
children | 47de34f79f93 |
comparison
equal
deleted
inserted
replaced
30409:0852161588c6 | 30410:7a5d6e2fd2d5 |
---|---|
87 rfd, wfd = os.pipe() | 87 rfd, wfd = os.pipe() |
88 workers = _numworkers(ui) | 88 workers = _numworkers(ui) |
89 oldhandler = signal.getsignal(signal.SIGINT) | 89 oldhandler = signal.getsignal(signal.SIGINT) |
90 signal.signal(signal.SIGINT, signal.SIG_IGN) | 90 signal.signal(signal.SIGINT, signal.SIG_IGN) |
91 pids, problem = [], [0] | 91 pids, problem = [], [0] |
92 def killworkers(): | |
93 # if one worker bails, there's no good reason to wait for the rest | |
94 for p in pids: | |
95 try: | |
96 os.kill(p, signal.SIGTERM) | |
97 except OSError as err: | |
98 if err.errno != errno.ESRCH: | |
99 raise | |
100 def waitforworkers(): | |
101 for _pid in pids: | |
102 st = _exitstatus(os.wait()[1]) | |
103 if st and not problem[0]: | |
104 problem[0] = st | |
105 killworkers() | |
92 for pargs in partition(args, workers): | 106 for pargs in partition(args, workers): |
93 pid = os.fork() | 107 pid = os.fork() |
94 if pid == 0: | 108 if pid == 0: |
95 signal.signal(signal.SIGINT, oldhandler) | 109 signal.signal(signal.SIGINT, oldhandler) |
96 try: | 110 try: |
104 # on lock.py's pid checks to avoid release callbacks | 118 # on lock.py's pid checks to avoid release callbacks |
105 pids.append(pid) | 119 pids.append(pid) |
106 pids.reverse() | 120 pids.reverse() |
107 os.close(wfd) | 121 os.close(wfd) |
108 fp = os.fdopen(rfd, 'rb', 0) | 122 fp = os.fdopen(rfd, 'rb', 0) |
109 def killworkers(): | |
110 # if one worker bails, there's no good reason to wait for the rest | |
111 for p in pids: | |
112 try: | |
113 os.kill(p, signal.SIGTERM) | |
114 except OSError as err: | |
115 if err.errno != errno.ESRCH: | |
116 raise | |
117 def waitforworkers(): | |
118 for _pid in pids: | |
119 st = _exitstatus(os.wait()[1]) | |
120 if st and not problem[0]: | |
121 problem[0] = st | |
122 killworkers() | |
123 t = threading.Thread(target=waitforworkers) | 123 t = threading.Thread(target=waitforworkers) |
124 t.start() | 124 t.start() |
125 def cleanup(): | 125 def cleanup(): |
126 signal.signal(signal.SIGINT, oldhandler) | 126 signal.signal(signal.SIGINT, oldhandler) |
127 t.join() | 127 t.join() |