Skip to content

Commit

Permalink
pythongh-116604: Fix test_gc on free-threaded build (python#116662)
Browse files Browse the repository at this point in the history
The free-threaded GC only does full collections, so it uses a threshold that
is a maximum of a fixed value (default 2000) and proportional to the number of
live objects. If there were many live objects after the previous collection,
then the threshold may be larger than 10,000 causing
`test_indirect_calls_with_gc_disabled` to fail.

This manually sets the threshold to `(1000, 0, 0)` for the test. The `0`
disables the proportional scaling.
  • Loading branch information
colesbury authored Mar 13, 2024
1 parent 186af3c commit 8e2aab7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
10 changes: 10 additions & 0 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,16 @@ def disable_gc():
if have_gc:
gc.enable()

@contextlib.contextmanager
def gc_threshold(*args):
import gc
old_threshold = gc.get_threshold()
gc.set_threshold(*args)
try:
yield
finally:
gc.set_threshold(*old_threshold)


def python_is_optimized():
"""Find if Python was built with optimizations."""
Expand Down
4 changes: 3 additions & 1 deletion Lib/test/test_gc.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from test.support.import_helper import import_module
from test.support.os_helper import temp_dir, TESTFN, unlink
from test.support.script_helper import assert_python_ok, make_script
from test.support import threading_helper
from test.support import threading_helper, gc_threshold

import gc
import sys
Expand Down Expand Up @@ -1330,6 +1330,7 @@ def callback(ignored):
# with an empty __dict__.
self.assertEqual(x, None)

@gc_threshold(1000, 0, 0)
def test_bug1055820d(self):
# Corresponds to temp2d.py in the bug report. This is very much like
# test_bug1055820c, but uses a __del__ method instead of a weakref
Expand Down Expand Up @@ -1397,6 +1398,7 @@ def __del__(self):
# empty __dict__.
self.assertEqual(x, None)

@gc_threshold(1000, 0, 0)
def test_indirect_calls_with_gc_disabled(self):
junk = []
i = 0
Expand Down

0 comments on commit 8e2aab7

Please sign in to comment.