New submission from STINNER Victor <vstin...@redhat.com>:
When Python is embedded, it should be possible to call the following Python function multiple times: void func(void) { Py_Initialize(); /* do something in Python */ Py_Finalize(); } Py_Finalize() ends by calling _PyRuntime_Finalize(). Problem: when Py_Initialize() is called the second time, _PyRuntime_Initialize() does nothing: _PyInitError _PyRuntime_Initialize(void) { /* XXX We only initialize once in the process, which aligns with the static initialization of the former globals now found in _PyRuntime. However, _PyRuntime *should* be initialized with every Py_Initialize() call, but doing so breaks the runtime. This is because the runtime state is not properly finalized currently. */ static int initialized = 0; if (initialized) { return _Py_INIT_OK(); } initialized = 1; return _PyRuntimeState_Init(&_PyRuntime); } For example, Py_Finalize() clears runtime->interpreters.mutex and runtime->xidregistry.mutex, whereas mutexes are still needed the second time func() is called. There is currently a *workaround*: _PyInitError _PyInterpreterState_Enable(_PyRuntimeState *runtime) { ... if (runtime->interpreters.mutex == NULL) { ... runtime->interpreters.mutex = PyThread_allocate_lock(); ... } ... } I would prefer that _PyRuntime_Initialize() calls _PyRuntimeState_Init() each time, and that _PyRuntimeState_Init() does nothing at the following call (except after Py_Finalize?). Note: _PyRuntimeState_Fini() doesn't free runtime->xidregistry.mutex currently. ---------- messages: 330946 nosy: vstinner priority: normal severity: normal status: open title: _PyRuntime_Initialize() called after Py_Finalize() does nothing versions: Python 3.8 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35388> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com