equal
deleted
inserted
replaced
118 # updated (maybe interrupted just after waitpid) |
118 # updated (maybe interrupted just after waitpid) |
119 pids.discard(pid) |
119 pids.discard(pid) |
120 break |
120 break |
121 else: |
121 else: |
122 raise |
122 raise |
123 if p: |
123 if not p: |
124 pids.discard(p) |
124 # skip subsequent steps, because child process should |
125 st = _exitstatus(st) |
125 # be still running in this case |
|
126 continue |
|
127 pids.discard(p) |
|
128 st = _exitstatus(st) |
126 if st and not problem[0]: |
129 if st and not problem[0]: |
127 problem[0] = st |
130 problem[0] = st |
128 def sigchldhandler(signum, frame): |
131 def sigchldhandler(signum, frame): |
129 waitforworkers(blocking=False) |
132 waitforworkers(blocking=False) |
130 if problem[0]: |
133 if problem[0]: |
143 |
146 |
144 # make sure we use os._exit in all code paths. otherwise the worker |
147 # make sure we use os._exit in all code paths. otherwise the worker |
145 # may do some clean-ups which could cause surprises like deadlock. |
148 # may do some clean-ups which could cause surprises like deadlock. |
146 # see sshpeer.cleanup for example. |
149 # see sshpeer.cleanup for example. |
147 try: |
150 try: |
148 scmutil.callcatch(ui, workerfunc) |
151 try: |
|
152 scmutil.callcatch(ui, workerfunc) |
|
153 finally: |
|
154 ui.flush() |
149 except KeyboardInterrupt: |
155 except KeyboardInterrupt: |
150 os._exit(255) |
156 os._exit(255) |
151 except: # never return, therefore no re-raises |
157 except: # never return, therefore no re-raises |
152 try: |
158 try: |
153 ui.traceback() |
159 ui.traceback() |
|
160 ui.flush() |
154 finally: |
161 finally: |
155 os._exit(255) |
162 os._exit(255) |
156 else: |
163 else: |
157 os._exit(0) |
164 os._exit(0) |
158 pids.add(pid) |
165 pids.add(pid) |