]> granicus.if.org Git - python/commitdiff
Issue #11998, issue #8407: workaround _tkinter issue in test_signal
authorVictor Stinner <victor.stinner@haypocalc.com>
Wed, 4 May 2011 10:38:03 +0000 (12:38 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Wed, 4 May 2011 10:38:03 +0000 (12:38 +0200)
The _tkinter module loads the Tcl library which creates a thread waiting events
in select(). This thread receives signals blocked by all other threads. We
cannot test blocked signals if the _tkinter module is loaded.

Lib/test/test_signal.py

index 0a43fa742f2c5b6ec898a825487d4f115b3dec7e..338d6ab203d7b588d17cca2b0bfcc4b01d70d509 100644 (file)
@@ -517,6 +517,15 @@ class PthreadSigmaskTests(unittest.TestCase):
         # function.
         faulthandler.cancel_dump_tracebacks_later()
 
+        # Issue #11998: The _tkinter module loads the Tcl library which creates
+        # a thread waiting events in select(). This thread receives signals
+        # blocked by all other threads. We cannot test blocked signals if the
+        # _tkinter module is loaded.
+        can_test_blocked_signals = ('_tkinter' not in sys.modules)
+        if not can_test_blocked_signals:
+            print("WARNING: _tkinter is loaded, cannot test signals "
+                  "blocked by pthread_sigmask() (issue #11998)")
+
         # Install our signal handler
         old_handler = signal.signal(signum, handler)
         self.addCleanup(signal.signal, signum, old_handler)
@@ -530,7 +539,8 @@ class PthreadSigmaskTests(unittest.TestCase):
         # Block and then raise SIGUSR1. The signal is blocked: the signal
         # handler is not called, and the signal is now pending
         signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
-        os.kill(pid, signum)
+        if can_test_blocked_signals:
+            os.kill(pid, signum)
 
         # Check the new mask
         blocked = read_sigmask()
@@ -538,8 +548,11 @@ class PthreadSigmaskTests(unittest.TestCase):
         self.assertEqual(set(old_mask) ^ set(blocked), {signum})
 
         # Unblock SIGUSR1
-        with self.assertRaises(ZeroDivisionError):
-            # unblock the pending signal calls immediatly the signal handler
+        if can_test_blocked_signals:
+            with self.assertRaises(ZeroDivisionError):
+                # unblock the pending signal calls immediatly the signal handler
+                signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
+        else:
             signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
         with self.assertRaises(ZeroDivisionError):
             os.kill(pid, signum)