mercurial/worker.py
changeset 30414 5069a8a40b1b
parent 30413 9c25a1a8c685
child 30415 e8fb03cfbbde
equal deleted inserted replaced
30413:9c25a1a8c685 30414:5069a8a40b1b
    96                 os.kill(p, signal.SIGTERM)
    96                 os.kill(p, signal.SIGTERM)
    97             except OSError as err:
    97             except OSError as err:
    98                 if err.errno != errno.ESRCH:
    98                 if err.errno != errno.ESRCH:
    99                     raise
    99                     raise
   100     def waitforworkers(blocking=True):
   100     def waitforworkers(blocking=True):
   101         for pid in pids:
   101         for pid in pids.copy():
   102             p, st = os.waitpid(pid, 0 if blocking else os.WNOHANG)
   102             p = st = 0
       
   103             while True:
       
   104                 try:
       
   105                     p, st = os.waitpid(pid, (0 if blocking else os.WNOHANG))
       
   106                 except OSError as e:
       
   107                     if e.errno == errno.EINTR:
       
   108                         continue
       
   109                     elif e.errno == errno.ECHILD:
       
   110                         break # ignore ECHILD
       
   111                     else:
       
   112                         raise
   103             if p:
   113             if p:
       
   114                 pids.remove(p)
   104                 st = _exitstatus(st)
   115                 st = _exitstatus(st)
   105             if st and not problem[0]:
   116             if st and not problem[0]:
   106                 problem[0] = st
   117                 problem[0] = st
   107                 killworkers()
   118                 killworkers()
   108     for pargs in partition(args, workers):
   119     for pargs in partition(args, workers):