mercurial/worker.py
changeset 30410 7a5d6e2fd2d5
parent 30396 78a58dcf8853
child 30411 47de34f79f93
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()