[Python-checkins] bpo-36301: Add _PyRuntimeState.preconfig (GH-12506)

Victor Stinner webhook-mailer at python.org
Sat Mar 23 07:06:04 EDT 2019


https://github.com/python/cpython/commit/6d5ee973f0600a3a9444f569dcf0dd346bfa2a11
commit: 6d5ee973f0600a3a9444f569dcf0dd346bfa2a11
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2019年03月23日T12:05:43+01:00
summary:
bpo-36301: Add _PyRuntimeState.preconfig (GH-12506)
_PyPreConfig_Write() now writes the applied pre-configuration into
_PyRuntimeState.preconfig.
files:
M Include/internal/pycore_pystate.h
M Python/coreconfig.c
M Python/preconfig.c
M Python/pystate.c
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index 911e7ee33baf..27c6eea6aa8c 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 1881f00bf2f5..540e608fb01f 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 <locale.h> /* setlocale() */
 #ifdef HAVE_LANGINFO_H
@@ -1358,6 +1359,17 @@ _PyCoreConfig_ReadPreConfig(_PyCoreConfig *config)
 }
 
 
+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 d856c124f3e9..13e5e1e85790 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 36566b767155..6fe3dd1ff3fa 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);
 }
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /