Skip to content

[3.13] gh-117657: Fix TSAN race in free-threaded GC (GH-119883) #119903

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions Python/gc_free_threading.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ worklist_pop(struct worklist *worklist)
PyObject *op = (PyObject *)worklist->head;
if (op != NULL) {
worklist->head = op->ob_tid;
op->ob_tid = 0;
_Py_atomic_store_uintptr_relaxed(&op->ob_tid, 0);
}
return op;
}
Expand Down Expand Up @@ -189,6 +189,7 @@ merge_refcount(PyObject *op, Py_ssize_t extra)
static void
gc_restore_tid(PyObject *op)
{
assert(_PyInterpreterState_GET()->stoptheworld.world_stopped);
mi_segment_t *segment = _mi_ptr_segment(op);
if (_Py_REF_IS_MERGED(op->ob_ref_shared)) {
op->ob_tid = 0;
Expand Down Expand Up @@ -676,7 +677,6 @@ call_weakref_callbacks(struct collection_state *state)
Py_DECREF(temp);
}

gc_restore_tid(op);
Py_DECREF(op); // drop worklist reference
}
}
Expand Down Expand Up @@ -986,7 +986,6 @@ cleanup_worklist(struct worklist *worklist)
{
PyObject *op;
while ((op = worklist_pop(worklist)) != NULL) {
gc_restore_tid(op);
gc_clear_unreachable(op);
Py_DECREF(op);
}
Expand Down
3 changes: 0 additions & 3 deletions Tools/tsan/suppressions_free_threading.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ race_top:_PyImport_ReleaseLock
race_top:_PyParkingLot_Park
race_top:_PyType_HasFeature
race_top:assign_version_tag
race_top:gc_restore_tid
race_top:insertdict
race_top:lookup_tp_dict
race_top:mi_heap_visit_pages
Expand Down Expand Up @@ -65,7 +64,6 @@ race_top:list_get_item_ref
race_top:make_pending_calls
race_top:set_add_entry
race_top:should_intern_string
race_top:worklist_pop
race_top:_PyEval_IsGILEnabled
race_top:llist_insert_tail
race_top:_Py_slot_tp_getattr_hook
Expand All @@ -87,7 +85,6 @@ race_top:sock_close
race_top:tstate_delete_common
race_top:tstate_is_freed
race_top:type_modified_unlocked
race_top:update_refs
race_top:write_thread_id
race_top:PyThreadState_Clear

Expand Down
Loading