mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +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
|
@ -138,6 +138,19 @@
|
|||
#endif
|
||||
|
||||
|
||||
static void
|
||||
check_invalid_reentrancy(void)
|
||||
{
|
||||
#if defined(Py_DEBUG) && defined(Py_GIL_DISABLED)
|
||||
// In the free-threaded build, the interpreter must not be re-entered if
|
||||
// the world-is-stopped. If so, that's a bug somewhere (quite likely in
|
||||
// the painfully complex typeobject code).
|
||||
PyInterpreterState *interp = _PyInterpreterState_GET();
|
||||
assert(!interp->stoptheworld.world_stopped);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef Py_DEBUG
|
||||
static void
|
||||
dump_item(_PyStackRef item)
|
||||
|
@ -995,6 +1008,7 @@ PyObject* _Py_HOT_FUNCTION DONT_SLP_VECTORIZE
|
|||
_PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)
|
||||
{
|
||||
_Py_EnsureTstateNotNULL(tstate);
|
||||
check_invalid_reentrancy();
|
||||
CALL_STAT_INC(pyeval_calls);
|
||||
|
||||
#if USE_COMPUTED_GOTOS && !Py_TAIL_CALL_INTERP
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue