https://github.com/python/cpython/commit/cab7ace9f46531672350be7db3265606c19c0ad7
commit: cab7ace9f46531672350be7db3265606c19c0ad7
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-10-13T22:43:39Z
summary:
gh-157649: Use more warmups in test_cext to check for refleaks (#159378)
Use 3 warmups instead of 1 before checking for reference leaks. Also,
always call gc.collect() before reading sys.gettotalrefcount().
files:
M Lib/test/test_cext/runtests.py
diff --git a/Lib/test/test_cext/runtests.py b/Lib/test/test_cext/runtests.py
index e8288ee5e11e44b..6700b410b7d7a78 100644
--- a/Lib/test/test_cext/runtests.py
+++ b/Lib/test/test_cext/runtests.py
@@ -19,6 +19,36 @@ def run_tests(testmod, verbose=True):
print(flush=True)
+def run_refleak_tests(testmod):
+ # Run tests and check for reference leaks
+ warmups = 3
+ runs = 3
+ repcount = warmups + runs
+ refcount = array.array('q', [0] * repcount)
+ rep_range = tuple(range(repcount))
+
+ for i in rep_range:
+ print(f"Run #{i + 1}", flush=True)
+ run_tests(testmod)
+ gc.collect()
+ refcount[i] = sys.gettotalrefcount()
+
+ # Compute differences
+ previous = None
+ for i in rep_range:
+ value = refcount[i]
+ if previous is not None:
+ refcount[i] = value - previous
+ previous = value
+
+ deltas = list(refcount[warmups:])
+ if all(delta >= 1 for delta in deltas):
+ print(f'ERROR: Tests leaked {deltas} references')
+ sys.exit(1)
+ elif any(deltas):
+ print(f'WARNING: Tests leaked {deltas} references (this is fine)')
+
+
def main():
if len(sys.argv) < 2:
print("usage: python runtests.py TEST_MODULE_NAME")
@@ -45,21 +75,7 @@ def main():
print()
if hasattr(sys, 'gettotalrefcount'):
- # First run to warm up Python. For example, test_datetime() imports
- # the datetime module.
- run_tests(testmod, verbose=False)
-
- refcount = array.array('q', [0, 0])
- gc.collect()
-
- # Check for reference leak
- refcount[0] = sys.gettotalrefcount()
- run_tests(testmod)
- refcount[1] = sys.gettotalrefcount()
-
- diff = refcount[1] - refcount[0]
- if diff >= 1:
- raise AssertionError(f'Tests leaked {diff} references')
+ run_refleak_tests(testmod)
else:
run_tests(testmod)
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]