mirror of
https://github.com/python/cpython.git
synced 2025-09-03 15:31:08 +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
|
@ -675,12 +675,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
|
|||
const PyConfig *src_config,
|
||||
PyThreadState **tstate_p)
|
||||
{
|
||||
/* Auto-thread-state API */
|
||||
PyStatus status = _PyGILState_Init(runtime);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
PyStatus status;
|
||||
PyInterpreterState *interp = PyInterpreterState_New();
|
||||
if (interp == NULL) {
|
||||
return _PyStatus_ERR("can't make main interpreter");
|
||||
|
@ -692,6 +687,12 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
|
|||
return status;
|
||||
}
|
||||
|
||||
/* Auto-thread-state API */
|
||||
status = _PyGILState_Init(interp);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
const _PyInterpreterConfig config = _PyInterpreterConfig_LEGACY_INIT;
|
||||
init_interp_settings(interp, &config);
|
||||
|
||||
|
@ -1795,10 +1796,8 @@ finalize_interp_clear(PyThreadState *tstate)
|
|||
static void
|
||||
finalize_interp_delete(PyInterpreterState *interp)
|
||||
{
|
||||
if (_Py_IsMainInterpreter(interp)) {
|
||||
/* Cleanup auto-thread-state */
|
||||
_PyGILState_Fini(interp);
|
||||
}
|
||||
/* Cleanup auto-thread-state */
|
||||
_PyGILState_Fini(interp);
|
||||
|
||||
/* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can
|
||||
fail when it is being awaited by another running daemon thread (see
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue