diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 0f92f67b977..8e5a022b4a0 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -190,8 +190,11 @@ struct _gilstate_runtime_state { /* Full Python runtime state */ typedef struct pyruntimestate { - /* Is Python pre-initialized? Set to 1 by Py_PreInitialize() */ - int pre_initialized; + /* Is running Py_PreInitialize()? */ + int preinitializing; + + /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ + int preinitialized; /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ int core_initialized; @@ -199,6 +202,8 @@ typedef struct pyruntimestate { /* Is Python fully initialized? Set to 1 by Py_Initialize() */ int initialized; + /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize() + is called again. */ PyThreadState *finalizing; struct pyinterpreters { @@ -241,7 +246,7 @@ typedef struct pyruntimestate { } _PyRuntimeState; #define _PyRuntimeState_INIT \ - {.pre_initialized = 0, .core_initialized = 0, .initialized = 0} + {.preinitialized = 0, .core_initialized = 0, .initialized = 0} /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ PyAPI_DATA(_PyRuntimeState) _PyRuntime; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ea89b3a626b..1bc7f608a13 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -725,11 +725,15 @@ _Py_PreInitializeFromPyArgv(const PyPreConfig *src_config, const _PyArgv *args) } _PyRuntimeState *runtime = &_PyRuntime; - if (runtime->pre_initialized) { + if (runtime->preinitialized) { /* If it's already configured: ignored the new configuration */ return _PyStatus_OK(); } + /* Note: preinitialized remains 1 on error, it is only set to 0 + at exit on success. */ + runtime->preinitializing = 1; + PyPreConfig config; _PyPreConfig_InitFromPreConfig(&config, src_config); @@ -743,7 +747,8 @@ _Py_PreInitializeFromPyArgv(const PyPreConfig *src_config, const _PyArgv *args) return status; } - runtime->pre_initialized = 1; + runtime->preinitializing = 0; + runtime->preinitialized = 1; return _PyStatus_OK(); } @@ -783,7 +788,7 @@ _Py_PreInitializeFromConfig(const PyConfig *config, } _PyRuntimeState *runtime = &_PyRuntime; - if (runtime->pre_initialized) { + if (runtime->preinitialized) { /* Already initialized: do nothing */ return _PyStatus_OK(); }