gh-117657: TSAN fix race on `gstate->young.count` (#118313)

This commit is contained in:
Alex Turner 2024-04-29 21:26:26 +01:00 committed by GitHub
parent 79688b5b0e
commit 2ba1aed596
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 13 deletions

View File

@ -1044,9 +1044,20 @@ record_deallocation(PyThreadState *tstate)
} }
static void 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); _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 refcounts for all queued objects
merge_all_queued_objects(interp, state); merge_all_queued_objects(interp, state);
process_delayed_frees(interp); process_delayed_frees(interp);
@ -1115,7 +1126,6 @@ error:
static Py_ssize_t static Py_ssize_t
gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason) gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
{ {
int i;
Py_ssize_t m = 0; /* # objects collected */ Py_ssize_t m = 0; /* # objects collected */
Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */ Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */
PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ 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); 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; PyInterpreterState *interp = tstate->interp;
struct collection_state state = { struct collection_state state = {
@ -1177,7 +1178,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
.gcstate = gcstate, .gcstate = gcstate,
}; };
gc_collect_internal(interp, &state); gc_collect_internal(interp, &state, generation);
m = state.collected; m = state.collected;
n = state.uncollectable; n = state.uncollectable;

View File

@ -27,7 +27,6 @@ race:_PyObject_GC_TRACK
race:_PyParkingLot_Park race:_PyParkingLot_Park
race:_PyType_HasFeature race:_PyType_HasFeature
race:assign_version_tag race:assign_version_tag
race:gc_collect_main
race:gc_restore_tid race:gc_restore_tid
race:initialize_new_array race:initialize_new_array
race:insertdict race:insertdict