mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-59956: Clarify GILState-related Code (gh-101161)
The objective of this change is to help make the GILState-related code easier to understand. This mostly involves moving code around and some semantically equivalent refactors. However, there are a also a small number of slight changes in structure and behavior: * tstate_current is moved out of _PyRuntimeState.gilstate * autoTSSkey is moved out of _PyRuntimeState.gilstate * autoTSSkey is initialized earlier * autoTSSkey is re-initialized (after fork) earlier https://github.com/python/cpython/issues/59956
This commit is contained in:
parent
8a2d4f4e8e
commit
6036c3e856
10 changed files with 373 additions and 250 deletions
|
@ -581,8 +581,7 @@ PyEval_AcquireThread(PyThreadState *tstate)
|
|||
|
||||
take_gil(tstate);
|
||||
|
||||
struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
|
||||
if (_PyThreadState_Swap(gilstate, tstate) != NULL) {
|
||||
if (_PyThreadState_Swap(tstate->interp->runtime, tstate) != NULL) {
|
||||
Py_FatalError("non-NULL old thread state");
|
||||
}
|
||||
}
|
||||
|
@ -593,7 +592,7 @@ PyEval_ReleaseThread(PyThreadState *tstate)
|
|||
assert(is_tstate_valid(tstate));
|
||||
|
||||
_PyRuntimeState *runtime = tstate->interp->runtime;
|
||||
PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
|
||||
PyThreadState *new_tstate = _PyThreadState_Swap(runtime, NULL);
|
||||
if (new_tstate != tstate) {
|
||||
Py_FatalError("wrong thread state");
|
||||
}
|
||||
|
@ -643,7 +642,7 @@ PyThreadState *
|
|||
PyEval_SaveThread(void)
|
||||
{
|
||||
_PyRuntimeState *runtime = &_PyRuntime;
|
||||
PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
|
||||
PyThreadState *tstate = _PyThreadState_Swap(runtime, NULL);
|
||||
_Py_EnsureTstateNotNULL(tstate);
|
||||
|
||||
struct _ceval_runtime_state *ceval = &runtime->ceval;
|
||||
|
@ -660,8 +659,7 @@ PyEval_RestoreThread(PyThreadState *tstate)
|
|||
|
||||
take_gil(tstate);
|
||||
|
||||
struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
|
||||
_PyThreadState_Swap(gilstate, tstate);
|
||||
_PyThreadState_Swap(tstate->interp->runtime, tstate);
|
||||
}
|
||||
|
||||
|
||||
|
@ -965,7 +963,7 @@ _Py_HandlePending(PyThreadState *tstate)
|
|||
/* GIL drop request */
|
||||
if (_Py_atomic_load_relaxed_int32(&interp_ceval_state->gil_drop_request)) {
|
||||
/* Give another thread a chance */
|
||||
if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {
|
||||
if (_PyThreadState_Swap(runtime, NULL) != tstate) {
|
||||
Py_FatalError("tstate mix-up");
|
||||
}
|
||||
drop_gil(ceval, interp_ceval_state, tstate);
|
||||
|
@ -974,7 +972,7 @@ _Py_HandlePending(PyThreadState *tstate)
|
|||
|
||||
take_gil(tstate);
|
||||
|
||||
if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
|
||||
if (_PyThreadState_Swap(runtime, tstate) != NULL) {
|
||||
Py_FatalError("orphan tstate");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue