Mercurial > public > mercurial-scm > hg
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): |