]> granicus.if.org Git - python/commitdiff
Issue #25122: try to debug test_eintr hang on FreeBSD
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 15 Sep 2015 10:15:59 +0000 (12:15 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 15 Sep 2015 10:15:59 +0000 (12:15 +0200)
* Add verbose mode to test_eintr
* Always enable verbose mode in test_eintr
* Use faulthandler.dump_traceback_later() with a timeout of 15 minutes in
  eintr_tester.py

Lib/test/eintrdata/eintr_tester.py
Lib/test/test_eintr.py

index 0616df66c71f6e9dfbefb7137dbda3d0a233fbb1..b96f09b691980eb194fe006b07fd41f37fe57cc2 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,12 +37,19 @@ class EINTRBaseTest(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         cls.orig_handler = signal.signal(signal.SIGALRM, lambda *args: None)
+        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(5 * 60, exit=True)
         signal.setitimer(signal.ITIMER_REAL, cls.signal_delay,
                          cls.signal_period)
 
     @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):
index 111ead365c0621c83e5092dd2be1a06521301d35..1d1d16e0ebc6964b494baa851369e5790afa6687 100644 (file)
@@ -1,5 +1,7 @@
 import os
 import signal
+import subprocess
+import sys
 import unittest
 
 from test import support
@@ -14,7 +16,15 @@ class EINTRTests(unittest.TestCase):
         # Run the tester in a sub-process, to make sure there is only one
         # thread (for reliable signal delivery).
         tester = support.findfile("eintr_tester.py", subdir="eintrdata")
-        script_helper.assert_python_ok(tester)
+
+        # FIXME: Issue #25122, always run in verbose mode to debug hang on FreeBSD
+        if True: #support.verbose:
+            args = [sys.executable, tester]
+            with subprocess.Popen(args, stdout=sys.stderr) as proc:
+                exitcode = proc.wait()
+            self.assertEqual(exitcode, 0)
+        else:
+            script_helper.assert_python_ok(tester)
 
 
 if __name__ == "__main__":