X Tutup
Skip to content

Commit 484f20d

Browse files
authored
bpo-36444: Add _PyCoreConfig._init_main (pythonGH-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.
1 parent 8b9dbc0 commit 484f20d

File tree

9 files changed

+42
-41
lines changed

9 files changed

+42
-41
lines changed

Include/cpython/coreconfig.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ typedef struct {
365365
If set to -1 (default), inherit Py_FrozenFlag value. */
366366
int _frozen;
367367

368+
/* If non-zero, use "main" Python initialization */
369+
int _init_main;
370+
368371
} _PyCoreConfig;
369372

370373
#ifdef MS_WINDOWS
@@ -398,7 +401,8 @@ typedef struct {
398401
.buffered_stdio = -1, \
399402
._install_importlib = 1, \
400403
._check_hash_pycs_mode = "default", \
401-
._frozen = -1}
404+
._frozen = -1, \
405+
._init_main = 1}
402406
/* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
403407

404408

Include/cpython/pylifecycle.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
2020
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
2121
const _PyCoreConfig *coreconfig);
2222

23-
PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
24-
const _PyCoreConfig *config,
25-
PyInterpreterState **interp);
2623
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
2724

2825

@@ -32,7 +29,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
3229
/* Initialization and finalization */
3330

3431
PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
35-
const _PyCoreConfig *config);
32+
const _PyCoreConfig *config,
33+
PyInterpreterState **interp_p);
3634
PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err);
3735

3836
/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level

Lib/test/test_embed.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
338338
'_install_importlib': 1,
339339
'_check_hash_pycs_mode': 'default',
340340
'_frozen': 0,
341+
'_init_main': 1,
341342
}
342343
if MS_WINDOWS:
343344
DEFAULT_PRE_CONFIG.update({

Modules/main.c

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,6 @@ pymain_init_preconfig(const _PyArgv *args)
5353
}
5454

5555

56-
static _PyInitError
57-
pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args,
58-
PyInterpreterState **interp_p)
59-
{
60-
_PyInitError err = _PyCoreConfig_Read(config, args);
61-
if (_Py_INIT_FAILED(err)) {
62-
return err;
63-
}
64-
65-
return _Py_InitializeCore(config, interp_p);
66-
}
67-
68-
6956
static _PyInitError
7057
pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
7158
{
@@ -91,18 +78,22 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
9178
}
9279

9380
_PyCoreConfig config = _PyCoreConfig_INIT;
94-
err = pymain_init_coreconfig(&config, args, interp_p);
95-
_PyCoreConfig_Clear(&config);
81+
82+
err = _PyCoreConfig_Read(&config, args);
9683
if (_Py_INIT_FAILED(err)) {
97-
return err;
84+
goto done;
9885
}
9986

100-
err = _Py_InitializeMainInterpreter(*interp_p);
87+
err = _Py_InitializeFromConfig(&config, interp_p);
10188
if (_Py_INIT_FAILED(err)) {
102-
return err;
89+
goto done;
10390
}
10491

105-
return _Py_INIT_OK();
92+
err = _Py_INIT_OK();
93+
94+
done:
95+
_PyCoreConfig_Clear(&config);
96+
return err;
10697
}
10798

10899

Programs/_freeze_importlib.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ main(int argc, char *argv[])
8484
/* Don't install importlib, since it could execute outdated bytecode. */
8585
config._install_importlib = 0;
8686
config._frozen = 1;
87+
config._init_main = 0;
8788

88-
_PyInitError err = _Py_InitializeFromConfig(&config);
89+
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
8990
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
9091
memory: program_name is a constant string. */
9192
if (_Py_INIT_FAILED(err)) {

Programs/_testembed.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ static int test_init_from_config(void)
529529
Py_FrozenFlag = 0;
530530
config._frozen = 1;
531531

532-
err = _Py_InitializeFromConfig(&config);
532+
err = _Py_InitializeFromConfig(&config, NULL);
533533
/* Don't call _PyCoreConfig_Clear() since all strings are static */
534534
if (_Py_INIT_FAILED(err)) {
535535
_Py_ExitInitError(err);
@@ -638,7 +638,7 @@ static int test_init_isolated(void)
638638
config.program_name = L"./_testembed";
639639

640640
test_init_env_dev_mode_putenvs();
641-
err = _Py_InitializeFromConfig(&config);
641+
err = _Py_InitializeFromConfig(&config, NULL);
642642
if (_Py_INIT_FAILED(err)) {
643643
_Py_ExitInitError(err);
644644
}
@@ -669,7 +669,7 @@ static int test_preinit_isolated1(void)
669669
config.program_name = L"./_testembed";
670670

671671
test_init_env_dev_mode_putenvs();
672-
err = _Py_InitializeFromConfig(&config);
672+
err = _Py_InitializeFromConfig(&config, NULL);
673673
if (_Py_INIT_FAILED(err)) {
674674
_Py_ExitInitError(err);
675675
}
@@ -706,7 +706,7 @@ static int test_preinit_isolated2(void)
706706
config.program_name = L"./_testembed";
707707

708708
test_init_env_dev_mode_putenvs();
709-
err = _Py_InitializeFromConfig(&config);
709+
err = _Py_InitializeFromConfig(&config, NULL);
710710
if (_Py_INIT_FAILED(err)) {
711711
_Py_ExitInitError(err);
712712
}
@@ -723,7 +723,7 @@ static int test_init_dev_mode(void)
723723
putenv("PYTHONMALLOC=");
724724
config.dev_mode = 1;
725725
config.program_name = L"./_testembed";
726-
_PyInitError err = _Py_InitializeFromConfig(&config);
726+
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
727727
if (_Py_INIT_FAILED(err)) {
728728
_Py_ExitInitError(err);
729729
}

Python/coreconfig.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
610610
COPY_WSTR_ATTR(run_filename);
611611
COPY_ATTR(_check_hash_pycs_mode);
612612
COPY_ATTR(_frozen);
613+
COPY_ATTR(_init_main);
613614

614615
#undef COPY_ATTR
615616
#undef COPY_STR_ATTR
@@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
715716
SET_ITEM_INT(_install_importlib);
716717
SET_ITEM_STR(_check_hash_pycs_mode);
717718
SET_ITEM_INT(_frozen);
719+
SET_ITEM_INT(_init_main);
718720

719721
return dict;
720722

Python/frozenmain.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv)
8282
if (argc >= 1)
8383
Py_SetProgramName(argv_copy[0]);
8484

85-
err = _Py_InitializeFromConfig(&config);
85+
err = _Py_InitializeFromConfig(&config, NULL);
8686
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
8787
memory: program_name is a constant string. */
8888
if (_Py_INIT_FAILED(err)) {

Python/pylifecycle.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ _Py_SetLocaleFromEnv(int category)
458458
/* Global initializations. Can be undone by Py_Finalize(). Don't
459459
call this twice without an intervening Py_Finalize() call.
460460
461-
Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx
461+
Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
462462
must have a corresponding call to Py_Finalize.
463463
464464
Locking: you must hold the interpreter lock while calling these APIs.
@@ -832,7 +832,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config,
832832
* to the Python C API (unless the API is explicitly listed as being
833833
* safe to call without calling Py_Initialize first)
834834
*/
835-
_PyInitError
835+
static _PyInitError
836836
_Py_InitializeCore(const _PyCoreConfig *src_config,
837837
PyInterpreterState **interp_p)
838838
{
@@ -981,20 +981,27 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp)
981981
#undef _INIT_DEBUG_PRINT
982982

983983
_PyInitError
984-
_Py_InitializeFromConfig(const _PyCoreConfig *config)
984+
_Py_InitializeFromConfig(const _PyCoreConfig *config,
985+
PyInterpreterState **interp_p)
985986
{
986987
PyInterpreterState *interp = NULL;
987988
_PyInitError err;
988989
err = _Py_InitializeCore(config, &interp);
989990
if (_Py_INIT_FAILED(err)) {
990991
return err;
991992
}
993+
if (interp_p) {
994+
*interp_p = interp;
995+
}
992996
config = &interp->core_config;
993997

994-
err = _Py_InitializeMainInterpreter(interp);
995-
if (_Py_INIT_FAILED(err)) {
996-
return err;
998+
if (config->_init_main) {
999+
err = _Py_InitializeMainInterpreter(interp);
1000+
if (_Py_INIT_FAILED(err)) {
1001+
return err;
1002+
}
9971003
}
1004+
9981005
return _Py_INIT_OK();
9991006
}
10001007

@@ -1007,13 +1014,10 @@ Py_InitializeEx(int install_sigs)
10071014
return;
10081015
}
10091016

1010-
_PyInitError err;
10111017
_PyCoreConfig config = _PyCoreConfig_INIT;
10121018
config.install_signal_handlers = install_sigs;
10131019

1014-
err = _Py_InitializeFromConfig(&config);
1015-
_PyCoreConfig_Clear(&config);
1016-
1020+
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
10171021
if (_Py_INIT_FAILED(err)) {
10181022
_Py_ExitInitError(err);
10191023
}

0 commit comments

Comments
 (0)
X Tutup