Steve Stagg <[email protected]> added the comment:
So, I'm not an allocator/init/teardown expert, but it looks like: When you
fork, PyRuntimeState creates a new mutex, explicitly using the default
allocator (without the debug allocator active)..
#ifdef HAVE_FORK
/* This function is called from PyOS_AfterFork_Child to ensure that
newly created child processes do not share locks with the parent. */
PyStatus
_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
{
// This was initially set in _PyRuntimeState_Init().
runtime->main_thread = PyThread_get_thread_ident();
/* Force default allocator, since _PyRuntimeState_Fini() must
use the same allocator than this function. */
PyMemAllocatorEx old_alloc;
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
int reinit_interp = _PyThread_at_fork_reinit(&runtime->interpreters.mutex);
int reinit_main_id =
_PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex);
int reinit_xidregistry =
_PyThread_at_fork_reinit(&runtime->xidregistry.mutex);
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
if (reinit_interp < 0
|| reinit_main_id < 0
|| reinit_xidregistry < 0)
{
return _PyStatus_ERR("Failed to reinitialize runtime locks");
}
return _PyStatus_OK();
}
#endif
But the PyInterpreterState_Delete function does not do this:
if (interp->id_mutex != NULL) {
PyThread_free_lock(interp->id_mutex);
}
Which causes it to try to use the debug allocator to free, and hence crash..
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue42540>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com