mirror of https://github.com/python/cpython
threading_cleanup() failure marks test as ENV_CHANGED (#2500)
If threading_cleanup() fails to cleanup threads, set a a new support.environment_altered flag to true, flag uses by save_env which is used by regrtest to check if a test altered the environment. At the end, the test file fails with ENV_CHANGED instead of SUCCESS, to report that it altered the environment.
This commit is contained in:
parent
729780a810
commit
21a0a6c9f8
|
@ -103,6 +103,9 @@ def runtest(ns, test):
|
|||
faulthandler.dump_traceback_later(ns.timeout, exit=True)
|
||||
try:
|
||||
support.match_tests = ns.match_tests
|
||||
# reset the environment_altered flag to detect if a test altered
|
||||
# the environment
|
||||
support.environment_altered = False
|
||||
if ns.failfast:
|
||||
support.failfast = True
|
||||
if output_on_failure:
|
||||
|
|
|
@ -268,7 +268,13 @@ class saved_test_environment:
|
|||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
saved_values = self.saved_values
|
||||
del self.saved_values
|
||||
support.gc_collect() # Some resources use weak references
|
||||
|
||||
# Some resources use weak references
|
||||
support.gc_collect()
|
||||
|
||||
# Read support.environment_altered, set by support helper functions
|
||||
self.changed |= support.environment_altered
|
||||
|
||||
for name, get, restore in self.resource_info():
|
||||
current = get()
|
||||
original = saved_values.pop(name)
|
||||
|
|
|
@ -2011,6 +2011,14 @@ def modules_cleanup(oldmodules):
|
|||
#=======================================================================
|
||||
# Threading support to prevent reporting refleaks when running regrtest.py -R
|
||||
|
||||
# Flag used by saved_test_environment of test.libregrtest.save_env,
|
||||
# to check if a test modified the environment. The flag should be set to False
|
||||
# before running a new test.
|
||||
#
|
||||
# For example, threading_cleanup() sets the flag is the function fails
|
||||
# to cleanup threads.
|
||||
environment_altered = False
|
||||
|
||||
# NOTE: we use thread._count() rather than threading.enumerate() (or the
|
||||
# moral equivalent thereof) because a threading.Thread object is still alive
|
||||
# until its __bootstrap() method has returned, even after it has been
|
||||
|
@ -2026,6 +2034,8 @@ def threading_setup():
|
|||
return 1, ()
|
||||
|
||||
def threading_cleanup(*original_values):
|
||||
global environment_altered
|
||||
|
||||
if not _thread:
|
||||
return
|
||||
_MAX_COUNT = 100
|
||||
|
@ -2037,6 +2047,8 @@ def threading_cleanup(*original_values):
|
|||
time.sleep(0.01)
|
||||
gc_collect()
|
||||
else:
|
||||
environment_altered = True
|
||||
|
||||
dt = time.monotonic() - t0
|
||||
print("Warning -- threading_cleanup() failed to cleanup %s threads "
|
||||
"after %.0f sec (count: %s, dangling: %s)"
|
||||
|
|
Loading…
Reference in New Issue