Fix _tracemalloc start/stop

Issue #26588: Fix _tracemalloc start/stop: don't play with the reentrant flag.

set_reentrant(1) fails with an assertion error if tracemalloc_init() is called
first in a thread A and tracemalloc_start() is called second in a thread B. The
tracemalloc is imported in a thread A. Importing the module calls
tracemalloc_init(). tracemalloc.start() is called in a thread B.
This commit is contained in:
Victor Stinner 2016-03-23 00:10:24 +01:00
parent d6990d221b
commit 2f49e09110
1 changed files with 0 additions and 14 deletions

View File

@ -740,10 +740,6 @@ tracemalloc_clear_traces(void)
assert(PyGILState_Check()); assert(PyGILState_Check());
#endif #endif
/* Disable also reentrant calls to tracemalloc_malloc() to not add a new
trace while we are clearing traces */
assert(get_reentrant());
TABLES_LOCK(); TABLES_LOCK();
_Py_hashtable_clear(tracemalloc_traces); _Py_hashtable_clear(tracemalloc_traces);
tracemalloc_traced_memory = 0; tracemalloc_traced_memory = 0;
@ -823,11 +819,6 @@ tracemalloc_init(void)
tracemalloc_empty_traceback.frames[0].lineno = 0; tracemalloc_empty_traceback.frames[0].lineno = 0;
tracemalloc_empty_traceback.hash = traceback_hash(&tracemalloc_empty_traceback); tracemalloc_empty_traceback.hash = traceback_hash(&tracemalloc_empty_traceback);
/* Disable tracing allocations until hooks are installed. Set
also the reentrant flag to detect bugs: fail with an assertion error
if set_reentrant(1) is called while tracing is disabled. */
set_reentrant(1);
tracemalloc_config.initialized = TRACEMALLOC_INITIALIZED; tracemalloc_config.initialized = TRACEMALLOC_INITIALIZED;
return 0; return 0;
} }
@ -912,7 +903,6 @@ tracemalloc_start(int max_nframe)
/* everything is ready: start tracing Python memory allocations */ /* everything is ready: start tracing Python memory allocations */
tracemalloc_config.tracing = 1; tracemalloc_config.tracing = 1;
set_reentrant(0);
return 0; return 0;
} }
@ -926,10 +916,6 @@ tracemalloc_stop(void)
/* stop tracing Python memory allocations */ /* stop tracing Python memory allocations */
tracemalloc_config.tracing = 0; tracemalloc_config.tracing = 0;
/* set the reentrant flag to detect bugs: fail with an assertion error if
set_reentrant(1) is called while tracing is disabled. */
set_reentrant(1);
/* unregister the hook on memory allocators */ /* unregister the hook on memory allocators */
#ifdef TRACE_RAW_MALLOC #ifdef TRACE_RAW_MALLOC
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &allocators.raw); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &allocators.raw);