]> granicus.if.org Git - python/commitdiff
Issue #12392: fix thread initialization on FreeBSD 6
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 24 Jun 2011 18:52:27 +0000 (20:52 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 24 Jun 2011 18:52:27 +0000 (20:52 +0200)
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.

Lib/test/test_signal.py
Python/thread_pthread.h

index 8a5a4083a07ba5639a702a5776d97b9e9f38602b..f23031668d69236a92a6a5787e7dd43e81b1dcc9 100644 (file)
@@ -295,6 +295,31 @@ class WakeupSignalTests(unittest.TestCase):
 
         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
 
index 09a0887bd45cb522cbb3a64f772850cbe9f6df76..fe9dde6f52123d96023ae57874e5447a7db9c2e4 100644 (file)
@@ -144,7 +144,10 @@ typedef struct {
  * 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)
 {