From 6d5ee973f0600a3a9444f569dcf0dd346bfa2a11 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 23 Mar 2019 12:05:43 +0100 Subject: [PATCH] bpo-36301: Add _PyRuntimeState.preconfig (GH-12506) _PyPreConfig_Write() now writes the applied pre-configuration into _PyRuntimeState.preconfig. --- Include/internal/pycore_pystate.h | 2 ++ Python/coreconfig.c | 22 ++++++++++++++++++++++ Python/preconfig.c | 9 +++++++++ Python/pystate.c | 3 +++ 4 files changed, 36 insertions(+) diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 911e7ee33ba..27c6eea6aa8 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,6 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define" #endif +#include "cpython/coreconfig.h" #include "pystate.h" #include "pythread.h" @@ -176,6 +177,7 @@ typedef struct pyruntimestate { struct _ceval_runtime_state ceval; struct _gilstate_runtime_state gilstate; + _PyPreConfig preconfig; // XXX Consolidate globals found via the check-c-globals script. } _PyRuntimeState; diff --git a/Python/coreconfig.c b/Python/coreconfig.c index 1881f00bf2f..540e608fb01 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -5,6 +5,7 @@ #include "pycore_getopt.h" #include "pycore_pylifecycle.h" #include "pycore_pymem.h" +#include "pycore_pystate.h" /* _PyRuntime */ #include "pycore_pathconfig.h" #include /* setlocale() */ #ifdef HAVE_LANGINFO_H @@ -1358,6 +1359,17 @@ done: } +static _PyInitError +_PyCoreConfig_GetPreConfig(_PyCoreConfig *config) +{ + /* Read config written by _PyPreConfig_Write() */ + if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) { + return _Py_INIT_NO_MEMORY(); + } + return _Py_INIT_OK(); +} + + /* Read the configuration into _PyCoreConfig from: * Environment variables @@ -1374,6 +1386,11 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) return err; } + err = _PyCoreConfig_GetPreConfig(config); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCoreConfig_GetGlobalConfig(config); if (preconfig != NULL) { @@ -2117,6 +2134,11 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args, { _PyInitError err; + err = _Py_PreInitialize(); + if (_Py_INIT_FAILED(err)) { + return err; + } + _PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT}; err = _PyPreCmdline_Init(&cmdline.precmdline, args); diff --git a/Python/preconfig.c b/Python/preconfig.c index d856c124f3e..13e5e1e8579 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -862,5 +862,14 @@ _PyPreConfig_Write(_PyPreConfig *config) /* Set LC_CTYPE to the user preferred locale */ _Py_SetLocaleFromEnv(LC_CTYPE); + /* Write the new pre-configuration into _PyRuntime */ + PyMemAllocatorEx old_alloc; + _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, config); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); + if (res < 0) { + return _Py_INIT_NO_MEMORY(); + } + return _Py_INIT_OK(); } diff --git a/Python/pystate.c b/Python/pystate.c index 36566b76715..6fe3dd1ff3f 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -41,6 +41,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) _PyGC_Initialize(&runtime->gc); _PyEval_Initialize(&runtime->ceval); + runtime->preconfig = _PyPreConfig_INIT; runtime->gilstate.check_enabled = 1; @@ -97,6 +98,8 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) runtime->xidregistry.mutex = NULL; } + _PyPreConfig_Clear(&runtime->preconfig); + PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); }