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)
|
signal.alarm(1)
|
||||||
self.assertEqual(signal.sigwait([signal.SIGALRM]), signal.SIGALRM)
|
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'),
|
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
|
||||||
'need signal.pthread_sigmask()')
|
'need signal.pthread_sigmask()')
|
||||||
def test_pthread_sigmask_arguments(self):
|
def test_pthread_sigmask_arguments(self):
|
||||||
|
|
|
@ -662,7 +662,9 @@ signal_sigwait(PyObject *self, PyObject *args)
|
||||||
if (iterable_to_sigset(signals, &set))
|
if (iterable_to_sigset(signals, &set))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
err = sigwait(&set, &signum);
|
err = sigwait(&set, &signum);
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
if (err) {
|
if (err) {
|
||||||
errno = err;
|
errno = err;
|
||||||
return PyErr_SetFromErrno(PyExc_OSError);
|
return PyErr_SetFromErrno(PyExc_OSError);
|
||||||
|
|
Loading…
Reference in New Issue