mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-127266: avoid data races when updating type slots (gh-131174)
In the free-threaded build, avoid data races caused by updating type slots or type flags after the type was initially created. For those (typically rare) cases, use the stop-the-world mechanism. Remove the use of atomics when reading or writing type flags. The use of atomics is not sufficient to avoid races (since flags are sometimes read without a lock and without atomics) and are no longer required.
This commit is contained in:
parent
22f0730d40
commit
e414a2d81c
10 changed files with 233 additions and 112 deletions
|
@ -620,6 +620,12 @@ given type object has a specified feature.
|
|||
#define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0)
|
||||
#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18)
|
||||
|
||||
// Flag values for ob_flags (16 bits available, if SIZEOF_VOID_P > 4).
|
||||
#define _Py_IMMORTAL_FLAGS (1 << 0)
|
||||
#define _Py_STATICALLY_ALLOCATED_FLAG (1 << 2)
|
||||
#if defined(Py_GIL_DISABLED) && defined(Py_DEBUG)
|
||||
#define _Py_TYPE_REVEALED_FLAG (1 << 3)
|
||||
#endif
|
||||
|
||||
#define Py_CONSTANT_NONE 0
|
||||
#define Py_CONSTANT_FALSE 1
|
||||
|
@ -776,11 +782,7 @@ PyType_HasFeature(PyTypeObject *type, unsigned long feature)
|
|||
// PyTypeObject is opaque in the limited C API
|
||||
flags = PyType_GetFlags(type);
|
||||
#else
|
||||
# ifdef Py_GIL_DISABLED
|
||||
flags = _Py_atomic_load_ulong_relaxed(&type->tp_flags);
|
||||
# else
|
||||
flags = type->tp_flags;
|
||||
# endif
|
||||
flags = type->tp_flags;
|
||||
#endif
|
||||
return ((flags & feature) != 0);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue