mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
bpo-44336: Prevent tests hanging on child process handles on Windows (GH-26578)
Replace the child process `typeperf.exe` with a daemon thread that reads the performance counters directly. This prevents the issues that arise from inherited handles in grandchild processes (see issue37531 for discussion). We only use the load tracker when running tests in multiprocess mode. This prevents inadvertent interactions with tests expecting a single threaded environment. Displaying load is really only helpful for buildbots running in multiprocess mode anyway.
This commit is contained in:
parent
9ac2de922a
commit
19058b9f62
2 changed files with 114 additions and 182 deletions
|
@ -533,7 +533,24 @@ class Regrtest:
|
|||
|
||||
if self.ns.use_mp:
|
||||
from test.libregrtest.runtest_mp import run_tests_multiprocess
|
||||
run_tests_multiprocess(self)
|
||||
# If we're on windows and this is the parent runner (not a worker),
|
||||
# track the load average.
|
||||
if sys.platform == 'win32' and self.worker_test_name is None:
|
||||
from test.libregrtest.win_utils import WindowsLoadTracker
|
||||
|
||||
try:
|
||||
self.win_load_tracker = WindowsLoadTracker()
|
||||
except PermissionError as error:
|
||||
# Standard accounts may not have access to the performance
|
||||
# counters.
|
||||
print(f'Failed to create WindowsLoadTracker: {error}')
|
||||
|
||||
try:
|
||||
run_tests_multiprocess(self)
|
||||
finally:
|
||||
if self.win_load_tracker is not None:
|
||||
self.win_load_tracker.close()
|
||||
self.win_load_tracker = None
|
||||
else:
|
||||
self.run_tests_sequential()
|
||||
|
||||
|
@ -695,28 +712,11 @@ class Regrtest:
|
|||
self.list_cases()
|
||||
sys.exit(0)
|
||||
|
||||
# If we're on windows and this is the parent runner (not a worker),
|
||||
# track the load average.
|
||||
if sys.platform == 'win32' and self.worker_test_name is None:
|
||||
from test.libregrtest.win_utils import WindowsLoadTracker
|
||||
self.run_tests()
|
||||
self.display_result()
|
||||
|
||||
try:
|
||||
self.win_load_tracker = WindowsLoadTracker()
|
||||
except FileNotFoundError as error:
|
||||
# Windows IoT Core and Windows Nano Server do not provide
|
||||
# typeperf.exe for x64, x86 or ARM
|
||||
print(f'Failed to create WindowsLoadTracker: {error}')
|
||||
|
||||
try:
|
||||
self.run_tests()
|
||||
self.display_result()
|
||||
|
||||
if self.ns.verbose2 and self.bad:
|
||||
self.rerun_failed_tests()
|
||||
finally:
|
||||
if self.win_load_tracker is not None:
|
||||
self.win_load_tracker.close()
|
||||
self.win_load_tracker = None
|
||||
if self.ns.verbose2 and self.bad:
|
||||
self.rerun_failed_tests()
|
||||
|
||||
self.finalize()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue