◐ Shell
clean mode source ↗

[3.14] GH-148726: Forward-port generational GC (another way) by sergey-miryanov · Pull Request #148772 · python/cpython

Expand Up @@ -7,7 +7,7 @@ Py_GIL_DISABLED) 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, run_test_script from test.support.script_helper import assert_python_ok, make_script from test.support import threading_helper, gc_threshold
import gc Expand Down Expand Up @@ -399,11 +399,19 @@ def test_collect_generations(self): # each call to collect(N) x = [] gc.collect(0) # x is now in the old gen # x is now in gen 1 a, b, c = gc.get_count() # We don't check a since its exact values depends on gc.collect(1) # x is now in gen 2 d, e, f = gc.get_count() gc.collect(2) # x is now in gen 3 g, h, i = gc.get_count() # We don't check a, d, g since their exact values depends on # internal implementation details of the interpreter. self.assertEqual((b, c), (1, 0)) self.assertEqual((e, f), (0, 1)) self.assertEqual((h, i), (0, 0))
def test_trashcan(self): class Ouch: Expand Down Expand Up @@ -870,10 +878,42 @@ def test_get_objects_generations(self): self.assertTrue( any(l is element for element in gc.get_objects(generation=0)) ) gc.collect() self.assertFalse( any(l is element for element in gc.get_objects(generation=1)) ) self.assertFalse( any(l is element for element in gc.get_objects(generation=2)) ) gc.collect(generation=0) self.assertFalse( any(l is element for element in gc.get_objects(generation=0)) ) self.assertTrue( any(l is element for element in gc.get_objects(generation=1)) ) self.assertFalse( any(l is element for element in gc.get_objects(generation=2)) ) gc.collect(generation=1) self.assertFalse( any(l is element for element in gc.get_objects(generation=0)) ) self.assertFalse( any(l is element for element in gc.get_objects(generation=1)) ) self.assertTrue( any(l is element for element in gc.get_objects(generation=2)) ) gc.collect(generation=2) self.assertFalse( any(l is element for element in gc.get_objects(generation=0)) ) self.assertFalse( any(l is element for element in gc.get_objects(generation=1)) ) self.assertTrue( any(l is element for element in gc.get_objects(generation=2)) ) del l gc.collect()
Expand Down Expand Up @@ -1181,17 +1221,6 @@ def test_tuple_untrack_counts(self): self.assertTrue(new_count - count > (n // 2))

class IncrementalGCTests(unittest.TestCase): @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi") @requires_gil_enabled("Free threading does not support incremental GC") def test_incremental_gc_handles_fast_cycle_creation(self): # Run this test in a fresh process. The number of alive objects (which can # be from unit tests run before this one) can influence how quickly cyclic # garbage is found. script = support.findfile("_test_gc_fast_cycles.py") run_test_script(script)

class GCCallbackTests(unittest.TestCase): def setUp(self): # Save gc state and disable it. Expand Down