]> granicus.if.org Git - python/commitdiff
test_eintr: try to debug hang on FreeBSD
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 2 Sep 2015 15:19:04 +0000 (17:19 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 2 Sep 2015 15:19:04 +0000 (17:19 +0200)
Lib/test/eintrdata/eintr_tester.py

index f75588051498afbc415662e6c74bbae5a171d6d9..73711a47b0ee69011613f410087ea8d2f3da03fa 100644 (file)
@@ -8,6 +8,7 @@ Signals are generated in-process using setitimer(ITIMER_REAL), which allows
 sub-second periodicity (contrarily to signal()).
 """
 
+import faulthandler
 import io
 import os
 import select
@@ -36,10 +37,17 @@ class EINTRBaseTest(unittest.TestCase):
         cls.orig_handler = signal.signal(signal.SIGALRM, lambda *args: None)
         signal.setitimer(signal.ITIMER_REAL, cls.signal_delay,
                          cls.signal_period)
+        if hasattr(faulthandler, 'dump_traceback_later'):
+            # Most tests take less than 30 seconds, so 15 minutes should be
+            # enough. dump_traceback_later() is implemented with a thread, but
+            # pthread_sigmask() is used to mask all signaled on this thread.
+            faulthandler.dump_traceback_later(15 * 60, exit=True)
 
     @classmethod
     def stop_alarm(cls):
         signal.setitimer(signal.ITIMER_REAL, 0, 0)
+        if hasattr(faulthandler, 'cancel_dump_traceback_later'):
+            faulthandler.cancel_dump_traceback_later()
 
     @classmethod
     def tearDownClass(cls):