From 60b04c9f6fb87522a62ab6b95db9f8a09aef42d4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 25 Jul 2018 19:23:53 +0200 Subject: bpo-34228: Allow PYTHONTRACEMALLOC=0 (GH-8467) PYTHONTRACEMALLOC=0 environment variable and -X tracemalloc=0 command line option are now allowed to disable explicitly tracemalloc at startup. --- Include/pystate.h | 1 + Lib/test/test_tracemalloc.py | 12 +++++++++-- .../2018-07-25-19-02-39.bpo-34228.0Ibztw.rst | 3 +++ Modules/main.c | 23 +++++++++++++++------- 4 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-07-25-19-02-39.bpo-34228.0Ibztw.rst diff --git a/Include/pystate.h b/Include/pystate.h index fe14832..2c70505 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -232,6 +232,7 @@ typedef struct { .install_signal_handlers = -1, \ .ignore_environment = -1, \ .use_hash_seed = -1, \ + .tracemalloc = -1, \ .coerce_c_locale = -1, \ .utf8_mode = -1, \ .argc = -1, \ diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index b0a0e1b..491cd05 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -15,6 +15,7 @@ except ImportError: EMPTY_STRING_SIZE = sys.getsizeof(b'') +INVALID_NFRAME = (-1, 2**30) def get_frames(nframe, lineno_delta): @@ -833,6 +834,13 @@ class TestCommandLine(unittest.TestCase): stdout = stdout.rstrip() self.assertEqual(stdout, b'False') + def test_env_var_disabled(self): + # tracing at startup + code = 'import tracemalloc; print(tracemalloc.is_tracing())' + ok, stdout, stderr = assert_python_ok('-c', code, PYTHONTRACEMALLOC='0') + stdout = stdout.rstrip() + self.assertEqual(stdout, b'False') + def test_env_var_enabled_at_startup(self): # tracing at startup code = 'import tracemalloc; print(tracemalloc.is_tracing())' @@ -861,7 +869,7 @@ class TestCommandLine(unittest.TestCase): def test_env_var_invalid(self): - for nframe in (-1, 0, 2**30): + for nframe in INVALID_NFRAME: with self.subTest(nframe=nframe): self.check_env_var_invalid(nframe) @@ -889,7 +897,7 @@ class TestCommandLine(unittest.TestCase): self.fail(f"unexpeced output: {stderr!a}") def test_sys_xoptions_invalid(self): - for nframe in (-1, 0, 2**30): + for nframe in INVALID_NFRAME: with self.subTest(nframe=nframe): self.check_sys_xoptions_invalid(nframe) diff --git a/Misc/NEWS.d/next/Library/2018-07-25-19-02-39.bpo-34228.0Ibztw.rst b/Misc/NEWS.d/next/Library/2018-07-25-19-02-39.bpo-34228.0Ibztw.rst new file mode 100644 index 0000000..729c0c4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-25-19-02-39.bpo-34228.0Ibztw.rst @@ -0,0 +1,3 @@ +tracemalloc: PYTHONTRACEMALLOC=0 environment variable and -X tracemalloc=0 +command line option are now allowed to disable explicitly tracemalloc at +startup. diff --git a/Modules/main.c b/Modules/main.c index a16c340..e116dd0 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1726,10 +1726,14 @@ pymain_init_tracemalloc(_PyCoreConfig *config) int nframe; int valid; + if (config->tracemalloc >= 0) { + return _Py_INIT_OK(); + } + const char *env = config_get_env_var(config, "PYTHONTRACEMALLOC"); if (env) { if (!pymain_str_to_int(env, &nframe)) { - valid = (nframe >= 1); + valid = (nframe >= 0); } else { valid = 0; @@ -1746,7 +1750,7 @@ pymain_init_tracemalloc(_PyCoreConfig *config) const wchar_t *sep = wcschr(xoption, L'='); if (sep) { if (!pymain_wstr_to_int(sep + 1, &nframe)) { - valid = (nframe >= 1); + valid = (nframe >= 0); } else { valid = 0; @@ -2249,17 +2253,22 @@ _PyCoreConfig_Read(_PyCoreConfig *config) config_init_locale(config); - /* Signal handlers are installed by default */ - if (config->install_signal_handlers < 0) { - config->install_signal_handlers = 1; - } - if (config->_install_importlib) { err = _PyCoreConfig_InitPathConfig(config); if (_Py_INIT_FAILED(err)) { return err; } } + + /* default values */ + if (config->tracemalloc < 0) { + config->tracemalloc = 0; + } + if (config->install_signal_handlers < 0) { + /* Signal handlers are installed by default */ + config->install_signal_handlers = 1; + } + return _Py_INIT_OK(); } -- cgit v0.12