From 6fd49e152ae173e4f89d5d547b828fa8af4072f2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 May 2011 12:38:03 +0200 Subject: Issue #11998, issue #8407: workaround _tkinter issue in test_signal 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 | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 0a43fa7..338d6ab 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -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) -- cgit v0.12