summaryrefslogtreecommitdiffstats
path: root/Python/pylifecycle.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-03-20 01:20:13 (GMT)
committerGitHub <noreply@github.com>2019-03-20 01:20:13 (GMT)
commitf29084d611a6ca504c99a0967371374febf0ccc3 (patch)
tree4026d6cf02a675a3b34aa5e6b6d9e832cb1830a5 /Python/pylifecycle.c
parent0d765e3849f1010276bb349b557b79ed94befa0b (diff)
downloadcpython-f29084d611a6ca504c99a0967371374febf0ccc3.zip
cpython-f29084d611a6ca504c99a0967371374febf0ccc3.tar.gz
cpython-f29084d611a6ca504c99a0967371374febf0ccc3.tar.bz2
bpo-36301: Add _PyRuntime.pre_initialized (GH-12457)
* Add _PyRuntime.pre_initialized: set to 1 when Python is pre-initialized * Add _Py_PreInitialize() and _Py_PreInitializeFromPreConfig(). * _PyCoreConfig_Read() now calls _Py_PreInitialize(). * Move _PyPreConfig_GetGlobalConfig() and _PyCoreConfig_GetGlobalConfig() calls from main.c to preconfig.c and coreconfig.c.
Diffstat (limited to 'Python/pylifecycle.c')
-rw-r--r--Python/pylifecycle.c46
1 files changed, 42 insertions, 4 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index df9570b..994a94f 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -714,19 +714,57 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p,
}
+_PyInitError
+_Py_PreInitializeFromPreConfig(_PyPreConfig *config)
+{
+ if (config != NULL) {
+ _PyInitError err = _PyPreConfig_Write(config);
+ if (_Py_INIT_FAILED(err)) {
+ return err;
+ }
+ }
+
+ _PyRuntime.pre_initialized = 1;
+ return _Py_INIT_OK();
+}
+
+
static _PyInitError
-pyinit_preconfig(_PyPreConfig *preconfig, const _PyPreConfig *src_preconfig)
+pyinit_preconfig(_PyPreConfig *config, const _PyPreConfig *src_config)
{
- if (_PyPreConfig_Copy(preconfig, src_preconfig) < 0) {
+ _PyInitError err;
+
+ err = _PyRuntime_Initialize();
+ if (_Py_INIT_FAILED(err)) {
+ return err;
+ }
+
+ if (_PyPreConfig_Copy(config, src_config) < 0) {
return _Py_INIT_ERR("failed to copy pre config");
}
- _PyInitError err = _PyPreConfig_Read(preconfig);
+ err = _PyPreConfig_Read(config);
if (_Py_INIT_FAILED(err)) {
return err;
}
- return _PyPreConfig_Write(preconfig);
+ return _Py_PreInitializeFromPreConfig(config);
+}
+
+
+_PyInitError
+_Py_PreInitialize(void)
+{
+ _PyInitError err = _PyRuntime_Initialize();
+ if (_Py_INIT_FAILED(err)) {
+ return err;
+ }
+
+ if (_PyRuntime.pre_initialized) {
+ return _Py_INIT_OK();
+ }
+
+ return _Py_PreInitializeFromPreConfig(NULL);
}