bpo-36444: Add _PyCoreConfig._init_main (GH-12572)

* Add _PyCoreConfig._init_main: if equals to zero,
  _Py_InitializeFromConfig() doesn't call
  _Py_InitializeMainInterpreter().
* Add interp_p parameter to _Py_InitializeFromConfig().
* pymain_init() now calls _Py_InitializeFromConfig().
* Make _Py_InitializeCore() private.
This commit is contained in:
Victor Stinner 2019-03-27 02:04:16 +01:00 committed by GitHub
parent 8b9dbc017a
commit 484f20d2ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 47 additions and 46 deletions

View file

@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
COPY_WSTR_ATTR(run_filename);
COPY_ATTR(_check_hash_pycs_mode);
COPY_ATTR(_frozen);
COPY_ATTR(_init_main);
#undef COPY_ATTR
#undef COPY_STR_ATTR
@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
SET_ITEM_INT(_install_importlib);
SET_ITEM_STR(_check_hash_pycs_mode);
SET_ITEM_INT(_frozen);
SET_ITEM_INT(_init_main);
return dict;

View file

@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv)
if (argc >= 1)
Py_SetProgramName(argv_copy[0]);
err = _Py_InitializeFromConfig(&config);
err = _Py_InitializeFromConfig(&config, NULL);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
if (_Py_INIT_FAILED(err)) {

View file

@ -458,7 +458,7 @@ _Py_SetLocaleFromEnv(int category)
/* Global initializations. Can be undone by Py_Finalize(). Don't
call this twice without an intervening Py_Finalize() call.
Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx
Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
must have a corresponding call to Py_Finalize.
Locking: you must hold the interpreter lock while calling these APIs.
@ -832,7 +832,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config,
* to the Python C API (unless the API is explicitly listed as being
* safe to call without calling Py_Initialize first)
*/
_PyInitError
static _PyInitError
_Py_InitializeCore(const _PyCoreConfig *src_config,
PyInterpreterState **interp_p)
{
@ -981,7 +981,8 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp)
#undef _INIT_DEBUG_PRINT
_PyInitError
_Py_InitializeFromConfig(const _PyCoreConfig *config)
_Py_InitializeFromConfig(const _PyCoreConfig *config,
PyInterpreterState **interp_p)
{
PyInterpreterState *interp = NULL;
_PyInitError err;
@ -989,12 +990,18 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config)
if (_Py_INIT_FAILED(err)) {
return err;
}
if (interp_p) {
*interp_p = interp;
}
config = &interp->core_config;
err = _Py_InitializeMainInterpreter(interp);
if (_Py_INIT_FAILED(err)) {
return err;
if (config->_init_main) {
err = _Py_InitializeMainInterpreter(interp);
if (_Py_INIT_FAILED(err)) {
return err;
}
}
return _Py_INIT_OK();
}
@ -1007,13 +1014,10 @@ Py_InitializeEx(int install_sigs)
return;
}
_PyInitError err;
_PyCoreConfig config = _PyCoreConfig_INIT;
config.install_signal_handlers = install_sigs;
err = _Py_InitializeFromConfig(&config);
_PyCoreConfig_Clear(&config);
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}