From a9df651eb4c18a07ec309df190419613e95cba7b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 5 Mar 2019 23:31:54 +0100 Subject: [PATCH] bpo-36142: Add _PyMem_GetDebugAllocatorsName() (GH-12185) The development mode now uses the effective name of the debug memory allocator ("pymalloc_debug" or "malloc_debug"). So the name doesn't change after setting the memory allocator. --- Include/internal/pycore_pymem.h | 2 ++ Lib/test/test_embed.py | 5 +++-- Objects/obmalloc.c | 14 ++++++++++++++ Programs/_testembed.c | 6 ++++++ Python/preconfig.c | 3 ++- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 1e7da87cd75..fedc7cc119b 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -155,6 +155,8 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator( PyMemAllocatorDomain domain, PyMemAllocatorEx *old_alloc); +PyAPI_FUNC(const char*) _PyMem_GetDebugAllocatorsName(void); + #ifdef __cplusplus } #endif diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 1f236a985ad..2827e8708e1 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -336,6 +336,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'legacy_windows_fs_encoding': 0, 'legacy_windows_stdio': 0, }) + DEBUG_ALLOCATOR = 'pymalloc_debug' if support.with_pymalloc() else 'malloc_debug' # main config COPY_MAIN_CONFIG = ( @@ -588,7 +589,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): def test_init_env_dev_mode(self): config = dict(self.INIT_ENV_CONFIG, - allocator='debug', + allocator=self.DEBUG_ALLOCATOR, dev_mode=1) self.check_config("init_env_dev_mode", config) @@ -596,7 +597,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): config = { 'dev_mode': 1, 'faulthandler': 1, - 'allocator': 'debug', + 'allocator': self.DEBUG_ALLOCATOR, } self.check_config("init_dev_mode", config) diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 1c2a32050f9..1afbcca14f2 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -221,6 +221,20 @@ static PyMemAllocatorEx _PyObject = PYOBJ_ALLOC; #endif +/* Get the effective name of "debug" memory allocators, + as if _PyMem_GetAllocatorsName() is called after + _PyMem_SetupAllocators("debug"). */ +const char* +_PyMem_GetDebugAllocatorsName(void) +{ +#ifdef WITH_PYMALLOC + return "pymalloc_debug"; +#else + return "malloc_debug"; +#endif +} + + static int pymem_set_default_allocator(PyMemAllocatorDomain domain, int debug, PyMemAllocatorEx *old_alloc) diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 70bf96036a2..170672e4439 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -139,6 +139,9 @@ static int test_forced_io_encoding(void) static int test_pre_initialization_api(void) { + /* the test doesn't support custom memory allocators */ + putenv("PYTHONMALLOC="); + /* Leading "./" ensures getpath.c can still find the standard library */ _Py_EMBED_PREINIT_CHECK("Checking Py_DecodeLocale\n"); wchar_t *program = Py_DecodeLocale("./spam", NULL); @@ -235,6 +238,9 @@ static void bpo20891_thread(void *lockp) static int test_bpo20891(void) { + /* the test doesn't support custom memory allocators */ + putenv("PYTHONMALLOC="); + /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread before calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must call PyEval_InitThreads() for us in this case. */ diff --git a/Python/preconfig.c b/Python/preconfig.c index 98e0edead17..46e1809fc54 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -453,7 +453,8 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) /* allocator */ if (config->dev_mode && config->allocator == NULL) { - config->allocator = _PyMem_RawStrdup("debug"); + const char *allocator = _PyMem_GetDebugAllocatorsName(); + config->allocator = _PyMem_RawStrdup(allocator); if (config->allocator == NULL) { return _Py_INIT_NO_MEMORY(); }