comparison mercurial/worker.py @ 18708:86524a70c0f6

worker: fix a race in SIGINT handling This is almost impossible to trigger due to the tiny time window involved.
author Bryan O'Sullivan <bryano@fb.com>
date Wed, 20 Feb 2013 11:31:31 -0800
parents d1a2b086d058
children 9955fc5ee24b
comparison
equal deleted inserted replaced
18707:d1a2b086d058 18708:86524a70c0f6
73 return func(*staticargs + (args,)) 73 return func(*staticargs + (args,))
74 74
75 def _posixworker(ui, func, staticargs, args): 75 def _posixworker(ui, func, staticargs, args):
76 rfd, wfd = os.pipe() 76 rfd, wfd = os.pipe()
77 workers = _numworkers(ui) 77 workers = _numworkers(ui)
78 oldhandler = signal.getsignal(signal.SIGINT)
79 signal.signal(signal.SIGINT, signal.SIG_IGN)
78 for pargs in partition(args, workers): 80 for pargs in partition(args, workers):
79 pid = os.fork() 81 pid = os.fork()
80 if pid == 0: 82 if pid == 0:
83 signal.signal(signal.SIGINT, oldhandler)
81 try: 84 try:
82 os.close(rfd) 85 os.close(rfd)
83 for i, item in func(*(staticargs + (pargs,))): 86 for i, item in func(*(staticargs + (pargs,))):
84 os.write(wfd, '%d %s\n' % (i, item)) 87 os.write(wfd, '%d %s\n' % (i, item))
85 os._exit(0) 88 os._exit(0)
86 except KeyboardInterrupt: 89 except KeyboardInterrupt:
87 os._exit(255) 90 os._exit(255)
88 os.close(wfd) 91 os.close(wfd)
89 fp = os.fdopen(rfd, 'rb', 0) 92 fp = os.fdopen(rfd, 'rb', 0)
90 oldhandler = signal.getsignal(signal.SIGINT)
91 signal.signal(signal.SIGINT, signal.SIG_IGN)
92 def cleanup(): 93 def cleanup():
93 # python 2.4 is too dumb for try/yield/finally 94 # python 2.4 is too dumb for try/yield/finally
94 signal.signal(signal.SIGINT, oldhandler) 95 signal.signal(signal.SIGINT, oldhandler)
95 problem = None 96 problem = None
96 for i in xrange(workers): 97 for i in xrange(workers):