gh-117657: Enable test_opcache under TSAN (GH-129831)
Fix a few thread-safety bugs to enable test_opcache when run with TSAN: * Use relaxed atomics when clearing `ht->_spec_cache.getitem` (gh-115999) * Add temporary suppression for type slot modifications (gh-127266) * Use atomic load when reading `*dictptr`
This commit is contained in:
@@ -13,6 +13,7 @@ TSAN_TESTS = [
|
|||||||
'test_importlib',
|
'test_importlib',
|
||||||
'test_io',
|
'test_io',
|
||||||
'test_logging',
|
'test_logging',
|
||||||
|
'test_opcache',
|
||||||
'test_queue',
|
'test_queue',
|
||||||
'test_signal',
|
'test_signal',
|
||||||
'test_socket',
|
'test_socket',
|
||||||
|
|||||||
@@ -1612,7 +1612,7 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method)
|
|||||||
else {
|
else {
|
||||||
PyObject **dictptr = _PyObject_ComputedDictPointer(obj);
|
PyObject **dictptr = _PyObject_ComputedDictPointer(obj);
|
||||||
if (dictptr != NULL) {
|
if (dictptr != NULL) {
|
||||||
dict = *dictptr;
|
dict = FT_ATOMIC_LOAD_PTR_ACQUIRE(*dictptr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dict = NULL;
|
dict = NULL;
|
||||||
|
|||||||
@@ -1085,7 +1085,8 @@ type_modified_unlocked(PyTypeObject *type)
|
|||||||
if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
|
if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
|
||||||
// This field *must* be invalidated if the type is modified (see the
|
// This field *must* be invalidated if the type is modified (see the
|
||||||
// comment on struct _specialization_cache):
|
// comment on struct _specialization_cache):
|
||||||
((PyHeapTypeObject *)type)->_spec_cache.getitem = NULL;
|
FT_ATOMIC_STORE_PTR_RELAXED(
|
||||||
|
((PyHeapTypeObject *)type)->_spec_cache.getitem, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1166,7 +1167,8 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) {
|
|||||||
if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
|
if (PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
|
||||||
// This field *must* be invalidated if the type is modified (see the
|
// This field *must* be invalidated if the type is modified (see the
|
||||||
// comment on struct _specialization_cache):
|
// comment on struct _specialization_cache):
|
||||||
((PyHeapTypeObject *)type)->_spec_cache.getitem = NULL;
|
FT_ATOMIC_STORE_PTR_RELAXED(
|
||||||
|
((PyHeapTypeObject *)type)->_spec_cache.getitem, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,5 +49,8 @@ race_top:rangeiter_next
|
|||||||
# gh-129748: test.test_free_threading.test_slots.TestSlots.test_object
|
# gh-129748: test.test_free_threading.test_slots.TestSlots.test_object
|
||||||
race_top:mi_block_set_nextx
|
race_top:mi_block_set_nextx
|
||||||
|
|
||||||
|
# gh-127266: type slot updates are not thread-safe (test_opcache.test_load_attr_method_lazy_dict)
|
||||||
|
race_top:update_one_slot
|
||||||
|
|
||||||
# https://gist.github.com/mpage/6962e8870606cfc960e159b407a0cb40
|
# https://gist.github.com/mpage/6962e8870606cfc960e159b407a0cb40
|
||||||
thread:pthread_create
|
thread:pthread_create
|
||||||
|
|||||||
Reference in New Issue
Block a user