mirror of
https://github.com/python/cpython.git
synced 2025-08-24 10:45:53 +00:00
gh-109549: Add new states to PyThreadState to support PEP 703 (gh-109915)
This adds a new field 'state' to PyThreadState that can take on one of three values: _Py_THREAD_ATTACHED, _Py_THREAD_DETACHED, or _Py_THREAD_GC. The "attached" and "detached" states correspond closely to acquiring and releasing the GIL. The "gc" state is current unused, but will be used to implement stop-the-world GC for --disable-gil builds in the near future.
This commit is contained in:
parent
9eb2489266
commit
6e97a9647a
6 changed files with 141 additions and 92 deletions
|
@ -661,8 +661,6 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
|
|||
return _PyStatus_ERR("can't make first thread");
|
||||
}
|
||||
_PyThreadState_Bind(tstate);
|
||||
// XXX For now we do this before the GIL is created.
|
||||
(void) _PyThreadState_SwapNoGIL(tstate);
|
||||
|
||||
status = init_interp_create_gil(tstate, config.gil);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
|
@ -2060,8 +2058,7 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config)
|
|||
}
|
||||
_PyThreadState_Bind(tstate);
|
||||
|
||||
// XXX For now we do this before the GIL is created.
|
||||
PyThreadState *save_tstate = _PyThreadState_SwapNoGIL(tstate);
|
||||
PyThreadState *save_tstate = _PyThreadState_GET();
|
||||
int has_gil = 0;
|
||||
|
||||
/* From this point until the init_interp_create_gil() call,
|
||||
|
@ -2073,7 +2070,7 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config)
|
|||
const PyConfig *src_config;
|
||||
if (save_tstate != NULL) {
|
||||
// XXX Might new_interpreter() have been called without the GIL held?
|
||||
_PyEval_ReleaseLock(save_tstate->interp, save_tstate);
|
||||
_PyThreadState_Detach(save_tstate);
|
||||
src_config = _PyInterpreterState_GetConfig(save_tstate->interp);
|
||||
}
|
||||
else
|
||||
|
@ -2120,12 +2117,11 @@ error:
|
|||
*tstate_p = NULL;
|
||||
|
||||
/* Oops, it didn't work. Undo it all. */
|
||||
PyErr_PrintEx(0);
|
||||
if (has_gil) {
|
||||
PyThreadState_Swap(save_tstate);
|
||||
_PyThreadState_Detach(tstate);
|
||||
}
|
||||
else {
|
||||
_PyThreadState_SwapNoGIL(save_tstate);
|
||||
if (save_tstate != NULL) {
|
||||
_PyThreadState_Attach(save_tstate);
|
||||
}
|
||||
PyThreadState_Clear(tstate);
|
||||
PyThreadState_Delete(tstate);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue