Issue #8407: signal.sigwait() releases the GIL
Initial patch by Charles-François Natali.
This commit is contained in:
parent
589f89e2ad
commit
10c30d6764
|
@ -607,6 +607,25 @@ class PendingSignalsTests(unittest.TestCase):
|
|||
signal.alarm(1)
|
||||
self.assertEqual(signal.sigwait([signal.SIGALRM]), signal.SIGALRM)
|
||||
|
||||
@unittest.skipUnless(hasattr(signal, 'sigwait'),
|
||||
'need signal.sigwait()')
|
||||
@unittest.skipIf(threading is None, "test needs threading module")
|
||||
def test_sigwait_thread(self):
|
||||
signum = signal.SIGUSR1
|
||||
old_handler = signal.signal(signum, self.handler)
|
||||
self.addCleanup(signal.signal, signum, old_handler)
|
||||
|
||||
def kill_later():
|
||||
time.sleep(1)
|
||||
os.kill(os.getpid(), signum)
|
||||
|
||||
killer = threading.Thread(target=kill_later)
|
||||
killer.start()
|
||||
try:
|
||||
self.assertEqual(signal.sigwait([signum]), signum)
|
||||
finally:
|
||||
killer.join()
|
||||
|
||||
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
|
||||
'need signal.pthread_sigmask()')
|
||||
def test_pthread_sigmask_arguments(self):
|
||||
|
|
|
@ -662,7 +662,9 @@ signal_sigwait(PyObject *self, PyObject *args)
|
|||
if (iterable_to_sigset(signals, &set))
|
||||
return NULL;
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
err = sigwait(&set, &signum);
|
||||
Py_END_ALLOW_THREADS
|
||||
if (err) {
|
||||
errno = err;
|
||||
return PyErr_SetFromErrno(PyExc_OSError);
|
||||
|
|
Loading…
Reference in New Issue