GitHub Viewer
Code to reproduce:
Py_Initialize();
Py_FinalizeEx();
Py_Initialize();
Py_FinalizeEx();
First initialisation of main interpreter GIL during Py_Initialize():
static void create_gil(struct _gil_runtime_state *gil)
{
MUTEX_INIT(gil->mutex);
> vfbasics.dll!AVrfpRtlInitializeCriticalSection() Unknown
python312_d.dll!create_gil(_gil_runtime_state * gil) Line 240 C
python312_d.dll!init_own_gil(_is * interp, _gil_runtime_state * gil) Line 524 C
python312_d.dll!_PyEval_InitGIL(_ts * tstate, int own_gil) Line 545 C
python312_d.dll!init_interp_create_gil(_ts * tstate, int own_gil) Line 604 C
python312_d.dll!pycore_create_interpreter(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 652 C
python312_d.dll!pyinit_config(pyruntimestate * runtime, _ts * * tstate_p, const PyConfig * config) Line 887 C
python312_d.dll!pyinit_core(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 1056 C
python312_d.dll!Py_InitializeFromConfig(const PyConfig * config) Line 1251 C
python312_d.dll!Py_InitializeEx(int install_sigs) Line 1289 C
python312_d.dll!Py_Initialize() Line 1300 C
ConsoleApplication.exe!main() Line 30 C++
Defer finalisation of main interpreter GIL during Py_FinalizeEx():
static void
finalize_interp_delete(PyInterpreterState *interp)
{
/* Cleanup auto-thread-state */
_PyGILState_Fini(interp);
/* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can
fail when it is being awaited by another running daemon thread (see
bpo-9901). Instead pycore_create_interpreter() destroys the previously
created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be
called multiple times. */
> python312_d.dll!finalize_interp_delete(_is * interp) Line 1746 C
python312_d.dll!Py_FinalizeEx() Line 1943 C
ConsoleApplication.exe!main() Line 31 C++
Set interp->ceval.gil = NULL for _PyRuntime._main_interpreter during second Py_Initialize():
if (runtime->_initialized) {
// Py_Initialize() must be running again.
// Reset to _PyRuntimeState_INIT.
memcpy(runtime, &initial, sizeof(*runtime));
}
> python312_d.dll!_PyRuntimeState_Init(pyruntimestate * runtime) Line 471 C
python312_d.dll!_PyRuntime_Initialize() Line 119 C
python312_d.dll!Py_InitializeEx(int install_sigs) Line 1273 C
python312_d.dll!Py_Initialize() Line 1300 C
ConsoleApplication.exe!main() Line 32 C++
(Re-)initialise interp->_gil for _PyRuntime._main_interpreter during second Py_Initialize():
static void _gil_initialize(struct _gil_runtime_state *gil)
{
_Py_atomic_int uninitialized = {-1};
gil->locked = uninitialized;
gil->interval = DEFAULT_INTERVAL;
}
> python312_d.dll!_gil_initialize(_gil_runtime_state * gil) Line 225 C
python312_d.dll!_PyEval_InitState(_is * interp, void * pending_lock) Line 961 C
python312_d.dll!init_interpreter(_is * interp, pyruntimestate * runtime, __int64 id, _is * next, void * pending_lock) Line 684 C
python312_d.dll!PyInterpreterState_New() Line 777 C
python312_d.dll!pycore_create_interpreter(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 619 C
python312_d.dll!pyinit_config(pyruntimestate * runtime, _ts * * tstate_p, const PyConfig * config) Line 887 C
python312_d.dll!pyinit_core(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 1056 C
python312_d.dll!Py_InitializeFromConfig(const PyConfig * config) Line 1251 C
python312_d.dll!Py_InitializeEx(int install_sigs) Line 1289 C
python312_d.dll!Py_Initialize() Line 1300 C
ConsoleApplication.exe!main() Line 32 C++
Deferred call to _PyEval_FiniGIL() during second Py_Initialize() detects interp->ceval.gil = NULL for _PyRuntime._main_interpreter and skips call to destroy_gil():
void
_PyEval_FiniGIL(PyInterpreterState *interp)
{
struct _gil_runtime_state *gil = interp->ceval.gil;
if (gil == NULL) {
/* It was already finalized (or hasn't been initialized yet). */
assert(!interp->ceval.own_gil);
return;
}
> python312_d.dll!_PyEval_FiniGIL(_is * interp) Line 561 C
python312_d.dll!init_interp_create_gil(_ts * tstate, int own_gil) Line 598 C
python312_d.dll!pycore_create_interpreter(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 652 C
python312_d.dll!pyinit_config(pyruntimestate * runtime, _ts * * tstate_p, const PyConfig * config) Line 887 C
python312_d.dll!pyinit_core(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 1056 C
python312_d.dll!Py_InitializeFromConfig(const PyConfig * config) Line 1251 C
python312_d.dll!Py_InitializeEx(int install_sigs) Line 1289 C
python312_d.dll!Py_Initialize() Line 1300 C
ConsoleApplication.exe!main() Line 32 C++
First initialisation of main interpreter GIL during second Py_Initialize() call, causing Application Verifier error:
static void create_gil(struct _gil_runtime_state *gil)
{
MUTEX_INIT(gil->mutex);
vrfcore.dll!VerifierStopMessageEx() Unknown
vfbasics.dll!AVrfpInitializeCriticalSectionCommon() Unknown
> python312_d.dll!create_gil(_gil_runtime_state * gil) Line 240 C
python312_d.dll!init_own_gil(_is * interp, _gil_runtime_state * gil) Line 524 C
python312_d.dll!_PyEval_InitGIL(_ts * tstate, int own_gil) Line 545 C
python312_d.dll!init_interp_create_gil(_ts * tstate, int own_gil) Line 604 C
python312_d.dll!pycore_create_interpreter(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 652 C
python312_d.dll!pyinit_config(pyruntimestate * runtime, _ts * * tstate_p, const PyConfig * config) Line 887 C
python312_d.dll!pyinit_core(pyruntimestate * runtime, const PyConfig * src_config, _ts * * tstate_p) Line 1056 C
python312_d.dll!Py_InitializeFromConfig(const PyConfig * config) Line 1251 C
python312_d.dll!Py_InitializeEx(int install_sigs) Line 1289 C
python312_d.dll!Py_Initialize() Line 1300 C
ConsoleApplication.exe!main() Line 32 C++