[Python-checkins] cpython: Issue #12392: fix thread initialization on FreeBSD 6

victor.stinner python-checkins at python.org
Fri Jun 24 20:53:28 CEST 2011


http://hg.python.org/cpython/rev/024827a9db64
changeset:   70943:024827a9db64
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Fri Jun 24 20:52:27 2011 +0200
summary:
  Issue #12392: fix thread initialization on FreeBSD 6

On FreeBSD6, pthread_kill() doesn't work on the main thread before the creation
of the first thread. Create therefore a dummy thread (no-op) a startup to
initialize the pthread library.

Add also a test for this use case, test written by Charles-François Natali.

files:
  Lib/test/test_signal.py |  25 +++++++++++++++++++++++++
  Python/thread_pthread.h |   5 ++++-
  2 files changed, 29 insertions(+), 1 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
@@ -295,6 +295,31 @@
 
         self.check_signum(signum1, signum2)
 
+    @unittest.skipUnless(hasattr(signal, 'pthread_kill'),
+                         'need signal.pthread_kill()')
+    def test_pthread_kill_main_thread(self):
+        # Test that a signal can be sent to the main thread with pthread_kill()
+        # before any other thread has been created (see issue #12392).
+        code = """if True:
+            import threading
+            import signal
+            import sys
+
+            def handler(signum, frame):
+                sys.exit(3)
+
+            signal.signal(signal.SIGUSR1, handler)
+            signal.pthread_kill(threading.get_ident(), signal.SIGUSR1)
+            sys.exit(1)
+        """
+
+        with spawn_python('-c', code) as process:
+            stdout, stderr = process.communicate()
+            exitcode = process.wait()
+            if exitcode != 3:
+                raise Exception("Child error (exit code %s): %s" %
+                                (exitcode, stdout))
+
     def setUp(self):
         import fcntl
 
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -144,7 +144,10 @@
  * Initialization.
  */
 
-#ifdef _HAVE_BSDI
+/* On FreeBSD6, pthread_kill() doesn't work on the main thread before
+   the creation of the first thread */
+#if defined(_HAVE_BSDI) \
+    || (defined(__FreeBSD__) && __FreeBSD_version < 700000)
 static
 void _noop(void)
 {

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


More information about the Python-checkins mailing list