Skip to content

Commit

Permalink
pythongh-117657: TSAN fix race on gstate->young.count (python#118313)
Browse files Browse the repository at this point in the history
  • Loading branch information
SonicField authored Apr 29, 2024
1 parent 79688b5 commit 2ba1aed
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 13 deletions.
25 changes: 13 additions & 12 deletions Python/gc_free_threading.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -1115,7 +1126,6 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state)
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 */
Expand Down Expand Up @@ -1161,23 +1171,14 @@ 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 = {
.interp = interp,
.gcstate = gcstate,
};

gc_collect_internal(interp, &state);
gc_collect_internal(interp, &state, generation);

m = state.collected;
n = state.uncollectable;
Expand Down
1 change: 0 additions & 1 deletion Tools/tsan/suppressions_free_threading.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2ba1aed

Please sign in to comment.