]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116397: Move the _PyGC_ClearAllFreeLists to the safe point (gh-116414)
authorDonghee Na <donghee.na@python.org>
Wed, 6 Mar 2024 23:29:39 +0000 (08:29 +0900)
committerGitHub <noreply@github.com>
Wed, 6 Mar 2024 23:29:39 +0000 (08:29 +0900)
Python/gc_free_threading.c

index 18893c6c391ffff31dd204be6687e950895af87c..c7883cd38644e17188792664faa7954e02b11cfb 100644 (file)
@@ -1058,6 +1058,8 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state)
     // Handle any objects that may have resurrected after the finalization.
     _PyEval_StopTheWorld(interp);
     err = handle_resurrected_objects(state);
+    // Clear free lists in all threads
+    _PyGC_ClearAllFreeLists(interp);
     _PyEval_StartTheWorld(interp);
 
     if (err < 0) {
@@ -1160,8 +1162,9 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
             n+m, n, d);
     }
 
-    // Clear free lists in all threads
-    _PyGC_ClearAllFreeLists(interp);
+    // Clear the current thread's free-list again.
+    _PyThreadStateImpl *tstate_impl = (_PyThreadStateImpl *)tstate;
+    _PyObject_ClearFreeLists(&tstate_impl->freelists, 0);
 
     if (_PyErr_Occurred(tstate)) {
         if (reason == _Py_GC_REASON_SHUTDOWN) {