mirror of https://github.com/python/cpython
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:
parent
d6990d221b
commit
2f49e09110
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue