1+ import faulthandler
12import json
23import os
34import queue
@@ -151,6 +152,8 @@ def run(self):
151152def run_tests_multiprocess (regrtest ):
152153 output = queue .Queue ()
153154 pending = MultiprocessIterator (regrtest .tests )
155+ test_timeout = regrtest .ns .timeout
156+ use_timeout = (test_timeout is not None )
154157
155158 workers = [MultiprocessThread (pending , output , regrtest .ns )
156159 for i in range (regrtest .ns .use_mp )]
@@ -170,11 +173,14 @@ def get_running(workers):
170173
171174 finished = 0
172175 test_index = 1
173- timeout = max (PROGRESS_UPDATE , PROGRESS_MIN_TIME )
176+ get_timeout = max (PROGRESS_UPDATE , PROGRESS_MIN_TIME )
174177 try :
175178 while finished < regrtest .ns .use_mp :
179+ if use_timeout :
180+ faulthandler .dump_traceback_later (test_timeout , exit = True )
181+
176182 try :
177- item = output .get (timeout = timeout )
183+ item = output .get (timeout = get_timeout )
178184 except queue .Empty :
179185 running = get_running (workers )
180186 if running and not regrtest .ns .pgo :
@@ -215,6 +221,9 @@ def get_running(workers):
215221 regrtest .interrupted = True
216222 pending .interrupted = True
217223 print ()
224+ finally :
225+ if use_timeout :
226+ faulthandler .cancel_dump_traceback_later ()
218227
219228 running = [worker .current_test for worker in workers ]
220229 running = list (filter (bool , running ))
0 commit comments