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