]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117657: TSAN fix race on `gstate->young.count` (#118313)
authorAlex Turner <nerdscentral@googlemail.com>
Mon, 29 Apr 2024 20:26:26 +0000 (21:26 +0100)
committerGitHub <noreply@github.com>
Mon, 29 Apr 2024 20:26:26 +0000 (20:26 +0000)
Python/gc_free_threading.c
Tools/tsan/suppressions_free_threading.txt

index 8c0940d8f066a7aa30d92170b8a98ca158b67ec0..ef6aaad12523116d8c31475761d7e0843192b9e2 100644 (file)
@@ -1044,9 +1044,20 @@ record_deallocation(PyThreadState *tstate)
 }
 
 static void
-gc_collect_internal(PyInterpreterState *interp, struct collection_state *state)
+gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, int generation)
 {
     _PyEval_StopTheWorld(interp);
+
+    // update collection and allocation counters
+    if (generation+1 < NUM_GENERATIONS) {
+        state->gcstate->old[generation].count += 1;
+    }
+
+    state->gcstate->young.count = 0;
+    for (int i = 1; i <= generation; ++i) {
+        state->gcstate->old[i-1].count = 0;
+    }
+
     // merge refcounts for all queued objects
     merge_all_queued_objects(interp, state);
     process_delayed_frees(interp);
@@ -1115,7 +1126,6 @@ error:
 static Py_ssize_t
 gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
 {
-    int i;
     Py_ssize_t m = 0; /* # objects collected */
     Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
     PyTime_t t1 = 0;   /* initialize to prevent a compiler warning */
@@ -1161,15 +1171,6 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
         PyDTrace_GC_START(generation);
     }
 
-    /* update collection and allocation counters */
-    if (generation+1 < NUM_GENERATIONS) {
-        gcstate->old[generation].count += 1;
-    }
-    gcstate->young.count = 0;
-    for (i = 1; i <= generation; i++) {
-        gcstate->old[i-1].count = 0;
-    }
-
     PyInterpreterState *interp = tstate->interp;
 
     struct collection_state state = {
@@ -1177,7 +1178,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
         .gcstate = gcstate,
     };
 
-    gc_collect_internal(interp, &state);
+    gc_collect_internal(interp, &state, generation);
 
     m = state.collected;
     n = state.uncollectable;
index 4b1a2fdf6dd43aa09129cbcbd2bda3b7ad17c647..4f6648a7573184002512492c27b3372d3a37cd2b 100644 (file)
@@ -27,7 +27,6 @@ race:_PyObject_GC_TRACK
 race:_PyParkingLot_Park
 race:_PyType_HasFeature
 race:assign_version_tag
-race:gc_collect_main
 race:gc_restore_tid
 race:initialize_new_array
 race:insertdict