Skip to content

Commit 1a6eead

Browse files
committed
Add test_register_max_threads
Mirrors test_enable_max_threads but uses register(SIGUSR1, ...) + os.kill round-trip, matching the existing test_register_* pattern.
1 parent d6f11fa commit 1a6eead

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

Lib/test/test_faulthandler.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,41 @@ def test_register_threads(self):
895895
def test_register_chain(self):
896896
self.check_register(chain=True)
897897

898+
@unittest.skipIf(not hasattr(faulthandler, "register"),
899+
"need faulthandler.register")
900+
def test_register_max_threads(self):
901+
# register(max_threads=N) caps the thread dump produced when
902+
# the registered signal fires.
903+
code = dedent("""
904+
import faulthandler
905+
import os
906+
import signal
907+
import threading
908+
909+
NTHREADS = 6
910+
CAP = 3
911+
912+
ready = threading.Barrier(NTHREADS + 1)
913+
stop = threading.Event()
914+
915+
def worker():
916+
ready.wait()
917+
stop.wait()
918+
919+
for _ in range(NTHREADS):
920+
threading.Thread(target=worker, daemon=True).start()
921+
ready.wait()
922+
faulthandler.register(signal.SIGUSR1, all_threads=True,
923+
max_threads=CAP)
924+
os.kill(os.getpid(), signal.SIGUSR1)
925+
""").strip()
926+
proc = script_helper.assert_python_ok('-c', code)
927+
output = proc.err
928+
# Cap of 3 means the dump is truncated with "..." on its own line.
929+
self.assertIn(b"\n...\n", output)
930+
# Cap of 3 means exactly 3 thread headers in the dump.
931+
self.assertEqual(output.count(b"Thread 0x"), 3)
932+
898933
@contextmanager
899934
def check_stderr_none(self):
900935
stderr = sys.stderr

0 commit comments

Comments
 (0)