|
7 | 7 | Py_GIL_DISABLED) |
8 | 8 | from test.support.import_helper import import_module |
9 | 9 | from test.support.os_helper import temp_dir, TESTFN, unlink |
10 | | -from test.support.script_helper import assert_python_ok, make_script |
| 10 | +from test.support.script_helper import assert_python_ok, make_script, run_test_script |
11 | 11 | from test.support import threading_helper, gc_threshold |
12 | 12 |
|
13 | 13 | import gc |
@@ -1127,64 +1127,14 @@ def test_something(self): |
1127 | 1127 |
|
1128 | 1128 |
|
1129 | 1129 | class IncrementalGCTests(unittest.TestCase): |
1130 | | - |
1131 | | - def setUp(self): |
1132 | | - # Reenable GC as it is disabled module-wide |
1133 | | - gc.enable() |
1134 | | - |
1135 | | - def tearDown(self): |
1136 | | - gc.disable() |
1137 | | - |
1138 | 1130 | @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi") |
1139 | 1131 | @requires_gil_enabled("Free threading does not support incremental GC") |
1140 | | - # Use small increments to emulate longer running process in a shorter time |
1141 | | - @gc_threshold(200, 10) |
1142 | 1132 | def test_incremental_gc_handles_fast_cycle_creation(self): |
1143 | | - |
1144 | | - class LinkedList: |
1145 | | - |
1146 | | - #Use slots to reduce number of implicit objects |
1147 | | - __slots__ = "next", "prev", "surprise" |
1148 | | - |
1149 | | - def __init__(self, next=None, prev=None): |
1150 | | - self.next = next |
1151 | | - if next is not None: |
1152 | | - next.prev = self |
1153 | | - self.prev = prev |
1154 | | - if prev is not None: |
1155 | | - prev.next = self |
1156 | | - |
1157 | | - def make_ll(depth): |
1158 | | - head = LinkedList() |
1159 | | - for i in range(depth): |
1160 | | - head = LinkedList(head, head.prev) |
1161 | | - return head |
1162 | | - |
1163 | | - head = make_ll(1000) |
1164 | | - count = 1000 |
1165 | | - |
1166 | | - # There will be some objects we aren't counting, |
1167 | | - # e.g. the gc stats dicts. This test checks |
1168 | | - # that the counts don't grow, so we try to |
1169 | | - # correct for the uncounted objects |
1170 | | - # This is just an estimate. |
1171 | | - CORRECTION = 20 |
1172 | | - |
1173 | | - enabled = gc.isenabled() |
1174 | | - gc.enable() |
1175 | | - olds = [] |
1176 | | - initial_heap_size = _testinternalcapi.get_tracked_heap_size() |
1177 | | - for i in range(20_000): |
1178 | | - newhead = make_ll(20) |
1179 | | - count += 20 |
1180 | | - newhead.surprise = head |
1181 | | - olds.append(newhead) |
1182 | | - if len(olds) == 20: |
1183 | | - new_objects = _testinternalcapi.get_tracked_heap_size() - initial_heap_size |
1184 | | - self.assertLess(new_objects, 27_000, f"Heap growing. Reached limit after {i} iterations") |
1185 | | - del olds[:] |
1186 | | - if not enabled: |
1187 | | - gc.disable() |
| 1133 | + # Run this test in a fresh process. The number of alive objects (which can |
| 1134 | + # be from unit tests run before this one) can influence how quickly cyclic |
| 1135 | + # garbage is found. |
| 1136 | + script = support.findfile("_test_gc_fast_cycles.py") |
| 1137 | + run_test_script(script) |
1188 | 1138 |
|
1189 | 1139 |
|
1190 | 1140 | class GCCallbackTests(unittest.TestCase): |
|
0 commit comments