mercurial/worker.py
changeset 31134 13bbcd56c57a
parent 30944 48dea083f66d
parent 30882 a91c62752d08
child 31701 9d3d56aa1a9f
equal deleted inserted replaced
31133:6483e49204ee 31134:13bbcd56c57a
   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)