mirror of
https://github.com/python/cpython.git
synced 2025-09-02 23:18:25 +00:00
bpo-39984: Move pending calls to PyInterpreterState (GH-19066)
If Py_AddPendingCall() is called in a subinterpreter, the function is now scheduled to be called from the subinterpreter, rather than being called from the main interpreter. Each subinterpreter now has its own list of scheduled calls. * Move pending and eval_breaker fields from _PyRuntimeState.ceval to PyInterpreterState.ceval. * new_interpreter() now calls _PyEval_InitThreads() to create pending calls lock. * Fix Py_AddPendingCall() for subinterpreters. It now calls _PyThreadState_GET() which works in a subinterpreter if the caller holds the GIL, and only falls back on PyGILState_GetThisThreadState() if _PyThreadState_GET() returns NULL.
This commit is contained in:
parent
3cde88439d
commit
50e6e99178
8 changed files with 128 additions and 83 deletions
|
@ -556,7 +556,7 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
|
|||
return status;
|
||||
}
|
||||
|
||||
/* Create the GIL */
|
||||
/* Create the GIL and the pending calls lock */
|
||||
status = _PyEval_InitThreads(tstate);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
|
@ -1581,6 +1581,12 @@ new_interpreter(PyThreadState **tstate_p)
|
|||
goto error;
|
||||
}
|
||||
|
||||
/* Create the pending calls lock */
|
||||
status = _PyEval_InitThreads(tstate);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
}
|
||||
|
||||
*tstate_p = tstate;
|
||||
return _PyStatus_OK();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue