mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-99113: Add PyInterpreterConfig.own_gil (gh-104204)
We also add PyInterpreterState.ceval.own_gil to record if the interpreter actually has its own GIL. Note that for now we don't actually respect own_gil; all interpreters still share the one GIL. However, PyInterpreterState.ceval.own_gil does reflect PyInterpreterConfig.own_gil. That lie is a temporary one that we will fix when the GIL really becomes per-interpreter.
This commit is contained in:
parent
66558d2a16
commit
f3e7eb48f8
11 changed files with 79 additions and 18 deletions
|
@ -500,9 +500,18 @@ PyEval_ThreadsInitialized(void)
|
|||
}
|
||||
|
||||
PyStatus
|
||||
_PyEval_InitGIL(PyThreadState *tstate)
|
||||
_PyEval_InitGIL(PyThreadState *tstate, int own_gil)
|
||||
{
|
||||
assert(tstate->interp->ceval.gil == NULL);
|
||||
if (!own_gil) {
|
||||
PyInterpreterState *main_interp = _PyInterpreterState_Main();
|
||||
assert(tstate->interp != main_interp);
|
||||
struct _gil_runtime_state *gil = main_interp->ceval.gil;
|
||||
assert(gil_created(gil));
|
||||
tstate->interp->ceval.gil = gil;
|
||||
tstate->interp->ceval.own_gil = 0;
|
||||
return _PyStatus_OK();
|
||||
}
|
||||
|
||||
/* XXX per-interpreter GIL */
|
||||
struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil;
|
||||
|
@ -512,8 +521,11 @@ _PyEval_InitGIL(PyThreadState *tstate)
|
|||
and destroy it. */
|
||||
assert(gil_created(gil));
|
||||
tstate->interp->ceval.gil = gil;
|
||||
// XXX For now we lie.
|
||||
tstate->interp->ceval.own_gil = 1;
|
||||
return _PyStatus_OK();
|
||||
}
|
||||
assert(own_gil);
|
||||
|
||||
assert(!gil_created(gil));
|
||||
|
||||
|
@ -521,6 +533,7 @@ _PyEval_InitGIL(PyThreadState *tstate)
|
|||
create_gil(gil);
|
||||
assert(gil_created(gil));
|
||||
tstate->interp->ceval.gil = gil;
|
||||
tstate->interp->ceval.own_gil = 1;
|
||||
take_gil(tstate);
|
||||
return _PyStatus_OK();
|
||||
}
|
||||
|
@ -530,6 +543,14 @@ _PyEval_FiniGIL(PyInterpreterState *interp)
|
|||
{
|
||||
if (interp->ceval.gil == NULL) {
|
||||
/* It was already finalized (or hasn't been initialized yet). */
|
||||
assert(!interp->ceval.own_gil);
|
||||
return;
|
||||
}
|
||||
else if (!interp->ceval.own_gil) {
|
||||
PyInterpreterState *main_interp = _PyInterpreterState_Main();
|
||||
assert(interp != main_interp);
|
||||
assert(interp->ceval.gil == main_interp->ceval.gil);
|
||||
interp->ceval.gil = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue