/* 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;
/* 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 {
} _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;
}
_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);
return status;
}
- runtime->pre_initialized = 1;
+ runtime->preinitializing = 0;
+ runtime->preinitialized = 1;
return _PyStatus_OK();
}
}
_PyRuntimeState *runtime = &_PyRuntime;
- if (runtime->pre_initialized) {
+ if (runtime->preinitialized) {
/* Already initialized: do nothing */
return _PyStatus_OK();
}