mirror of
https://github.com/python/cpython.git
synced 2025-08-01 23:53:15 +00:00
Issue #25122: try to debug test_eintr hang on FreeBSD
* 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
This commit is contained in:
parent
024364a89a
commit
f11d0d2c0d
2 changed files with 19 additions and 1 deletions
|
@ -8,6 +8,7 @@ Signals are generated in-process using setitimer(ITIMER_REAL), which allows
|
||||||
sub-second periodicity (contrarily to signal()).
|
sub-second periodicity (contrarily to signal()).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import faulthandler
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import select
|
import select
|
||||||
|
@ -36,12 +37,19 @@ class EINTRBaseTest(unittest.TestCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
cls.orig_handler = signal.signal(signal.SIGALRM, lambda *args: None)
|
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,
|
signal.setitimer(signal.ITIMER_REAL, cls.signal_delay,
|
||||||
cls.signal_period)
|
cls.signal_period)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def stop_alarm(cls):
|
def stop_alarm(cls):
|
||||||
signal.setitimer(signal.ITIMER_REAL, 0, 0)
|
signal.setitimer(signal.ITIMER_REAL, 0, 0)
|
||||||
|
if hasattr(faulthandler, 'cancel_dump_traceback_later'):
|
||||||
|
faulthandler.cancel_dump_traceback_later()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
from test import support
|
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
|
# Run the tester in a sub-process, to make sure there is only one
|
||||||
# thread (for reliable signal delivery).
|
# thread (for reliable signal delivery).
|
||||||
tester = support.findfile("eintr_tester.py", subdir="eintrdata")
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue