bpo-39877: Py_Initialize() pass tstate to PyEval_InitThreads() (GH-18884)

This commit is contained in:
Victor Stinner 2020-03-09 21:24:14 +01:00 committed by GitHub
parent 3225b9f973
commit 111e4ee52a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 9 deletions

View File

@ -53,6 +53,8 @@ extern PyObject *_PyEval_EvalCode(
PyObject *kwdefs, PyObject *closure,
PyObject *name, PyObject *qualname);
extern PyStatus _PyEval_InitThreads(PyThreadState *tstate);
#ifdef __cplusplus
}
#endif

View File

@ -13,6 +13,7 @@
#include "pycore_call.h"
#include "pycore_ceval.h"
#include "pycore_code.h"
#include "pycore_initconfig.h"
#include "pycore_object.h"
#include "pycore_pyerrors.h"
#include "pycore_pylifecycle.h"
@ -214,26 +215,39 @@ PyEval_ThreadsInitialized(void)
return gil_created(&runtime->ceval.gil);
}
void
PyEval_InitThreads(void)
PyStatus
_PyEval_InitThreads(PyThreadState *tstate)
{
_PyRuntimeState *runtime = &_PyRuntime;
struct _ceval_runtime_state *ceval = &runtime->ceval;
if (tstate == NULL) {
return _PyStatus_ERR("tstate is NULL");
}
struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval;
struct _gil_runtime_state *gil = &ceval->gil;
if (gil_created(gil)) {
return;
return _PyStatus_OK();
}
PyThread_init_thread();
create_gil(gil);
PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
ensure_tstate_not_null(__func__, tstate);
take_gil(ceval, tstate);
struct _pending_calls *pending = &ceval->pending;
pending->lock = PyThread_allocate_lock();
if (pending->lock == NULL) {
Py_FatalError("Can't initialize threads for pending calls");
return _PyStatus_NO_MEMORY();
}
return _PyStatus_OK();
}
void
PyEval_InitThreads(void)
{
PyThreadState *tstate = _PyThreadState_GET();
PyStatus status = _PyEval_InitThreads(tstate);
if (_PyStatus_EXCEPTION(status)) {
Py_ExitStatusException(status);
}
}

View File

@ -554,7 +554,10 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
_PyGILState_Init(tstate);
/* Create the GIL */
PyEval_InitThreads();
status = _PyEval_InitThreads(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
*tstate_p = tstate;
return _PyStatus_OK();