sub-second periodicity (contrarily to signal()).
"""
+import faulthandler
import io
import os
import select
@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):
import os
import signal
+import subprocess
+import sys
import unittest
from test import support
# 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__":