mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
make entering of context thread safe
This commit is contained in:
parent
b8d3fddba6
commit
68f8ec6a2d
1 changed files with 14 additions and 5 deletions
|
|
@ -195,16 +195,20 @@ _PyContext_Enter(PyThreadState *ts, PyObject *octx)
|
|||
{
|
||||
ENSURE_Context(octx, -1)
|
||||
PyContext *ctx = (PyContext *)octx;
|
||||
#ifdef Py_GIL_DISABLED
|
||||
int already_entered = _Py_atomic_exchange_int(&ctx->ctx_entered, 1);
|
||||
#else
|
||||
int already_entered = ctx->ctx_entered;
|
||||
ctx->ctx_entered = 1;
|
||||
#endif
|
||||
|
||||
if (ctx->ctx_entered) {
|
||||
if (already_entered) {
|
||||
_PyErr_Format(ts, PyExc_RuntimeError,
|
||||
"cannot enter context: %R is already entered", ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ctx->ctx_prev = (PyContext *)ts->context; /* borrow */
|
||||
ctx->ctx_entered = 1;
|
||||
|
||||
ts->context = Py_NewRef(ctx);
|
||||
context_switched(ts);
|
||||
return 0;
|
||||
|
|
@ -225,8 +229,14 @@ _PyContext_Exit(PyThreadState *ts, PyObject *octx)
|
|||
{
|
||||
ENSURE_Context(octx, -1)
|
||||
PyContext *ctx = (PyContext *)octx;
|
||||
#ifdef Py_GIL_DISABLED
|
||||
int already_entered = _Py_atomic_exchange_int(&ctx->ctx_entered, 0);
|
||||
#else
|
||||
int already_entered = ctx->ctx_entered;
|
||||
ctx->ctx_entered = 0;
|
||||
#endif
|
||||
|
||||
if (!ctx->ctx_entered) {
|
||||
if (!already_entered) {
|
||||
PyErr_Format(PyExc_RuntimeError,
|
||||
"cannot exit context: %R has not been entered", ctx);
|
||||
return -1;
|
||||
|
|
@ -243,7 +253,6 @@ _PyContext_Exit(PyThreadState *ts, PyObject *octx)
|
|||
Py_SETREF(ts->context, (PyObject *)ctx->ctx_prev);
|
||||
|
||||
ctx->ctx_prev = NULL;
|
||||
ctx->ctx_entered = 0;
|
||||
context_switched(ts);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue