This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients vstinner
Date 2018-12-03.15:13:10
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1543849990.49.0.788709270274.issue35388@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2018-12-03 15:13:10vstinnersetrecipients: + vstinner
2018-12-03 15:13:10vstinnersetmessageid: <1543849990.49.0.788709270274.issue35388@psf.upfronthosting.co.za>
2018-12-03 15:13:10vstinnerlinkissue35388 messages
2018-12-03 15:13:10vstinnercreate