Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 10c30d6

Browse files
author
Victor Stinner
committed
Issue #8407: signal.sigwait() releases the GIL
Initial patch by Charles-François Natali.
1 parent 589f89e commit 10c30d6

2 files changed

Lines changed: 21 additions & 0 deletions

File tree

Lib/test/test_signal.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,25 @@ def test_sigwait(self):
607607
signal.alarm(1)
608608
self.assertEqual(signal.sigwait([signal.SIGALRM]), signal.SIGALRM)
609609

610+
@unittest.skipUnless(hasattr(signal, 'sigwait'),
611+
'need signal.sigwait()')
612+
@unittest.skipIf(threading is None, "test needs threading module")
613+
def test_sigwait_thread(self):
614+
signum = signal.SIGUSR1
615+
old_handler = signal.signal(signum, self.handler)
616+
self.addCleanup(signal.signal, signum, old_handler)
617+
618+
def kill_later():
619+
time.sleep(1)
620+
os.kill(os.getpid(), signum)
621+
622+
killer = threading.Thread(target=kill_later)
623+
killer.start()
624+
try:
625+
self.assertEqual(signal.sigwait([signum]), signum)
626+
finally:
627+
killer.join()
628+
610629
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
611630
'need signal.pthread_sigmask()')
612631
def test_pthread_sigmask_arguments(self):

Modules/signalmodule.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,9 @@ signal_sigwait(PyObject *self, PyObject *args)
662662
if (iterable_to_sigset(signals, &set))
663663
return NULL;
664664

665+
Py_BEGIN_ALLOW_THREADS
665666
err = sigwait(&set, &signum);
667+
Py_END_ALLOW_THREADS
666668
if (err) {
667669
errno = err;
668670
return PyErr_SetFromErrno(PyExc_OSError);

0 commit comments

Comments
 (0)