[Python-checkins] cpython: Issue #8407: signal.sigwait() releases the GIL

victor.stinner python-checkins at python.org
Fri Jun 10 01:40:14 CEST 2011


http://hg.python.org/cpython/rev/a5c8b6ebe895
changeset:   70750:a5c8b6ebe895
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Fri Jun 10 01:39:53 2011 +0200
summary:
  Issue #8407: signal.sigwait() releases the GIL

Initial patch by Charles-François Natali.

files:
  Lib/test/test_signal.py |  19 +++++++++++++++++++
  Modules/signalmodule.c  |   2 ++
  2 files changed, 21 insertions(+), 0 deletions(-)


diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -607,6 +607,25 @@
         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):
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -662,7 +662,9 @@
     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);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list