]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-36301: Add _PyRuntimeState.preconfig (GH-12506)
authorVictor Stinner <vstinner@redhat.com>
Sat, 23 Mar 2019 11:05:43 +0000 (12:05 +0100)
committerGitHub <noreply@github.com>
Sat, 23 Mar 2019 11:05:43 +0000 (12:05 +0100)
_PyPreConfig_Write() now writes the applied pre-configuration into
_PyRuntimeState.preconfig.

Include/internal/pycore_pystate.h
Python/coreconfig.c
Python/preconfig.c
Python/pystate.c

index 911e7ee33baf2e570c44f55ebc23153af39e20cd..27c6eea6aa8ccac2db5167809f66eac6cb4b7a14 100644 (file)
@@ -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;
 
index 1881f00bf2f5ad1679bf35f96edbed464404be28..540e608fb01f8d9f6b55950fc3d037c609056783 100644 (file)
@@ -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 @@ 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);
index d856c124f3e9b41343842da0a13616f3177455ca..13e5e1e85790a2d4b9dc445797432c5f053c06ad 100644 (file)
@@ -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();
 }
index 36566b767155b318408798080e12dd4882317872..6fe3dd1ff3fa2d55f0835648e7ead5e959820954 100644 (file)
@@ -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);
 }