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]

Reply via email to