#ifdef Py_BUILD_CORE
# define _PyThreadState_WHENCE_NOTSET -1
# define _PyThreadState_WHENCE_UNKNOWN 0
-# define _PyThreadState_WHENCE_INTERP 1
-# define _PyThreadState_WHENCE_THREADING 2
-# define _PyThreadState_WHENCE_GILSTATE 3
-# define _PyThreadState_WHENCE_EXEC 4
+# define _PyThreadState_WHENCE_INIT 1
+# define _PyThreadState_WHENCE_FINI 2
+# define _PyThreadState_WHENCE_THREADING 3
+# define _PyThreadState_WHENCE_GILSTATE 4
+# define _PyThreadState_WHENCE_EXEC 5
#endif
int _whence;
// PyThreadState functions
-extern PyThreadState * _PyThreadState_New(
+// Export for _testinternalcapi
+PyAPI_FUNC(PyThreadState *) _PyThreadState_New(
PyInterpreterState *interp,
int whence);
extern void _PyThreadState_Bind(PyThreadState *tstate);
+PyAPI_FUNC(PyThreadState *) _PyThreadState_NewBound(
+ PyInterpreterState *interp,
+ int whence);
extern PyThreadState * _PyThreadState_RemoveExcept(PyThreadState *tstate);
extern void _PyThreadState_DeleteList(PyThreadState *list);
extern void _PyThreadState_ClearMimallocHeaps(PyThreadState *tstate);
#include "pycore_qsbr.h" // struct qsbr
-static inline void
-_PyThreadState_SetWhence(PyThreadState *tstate, int whence)
-{
- tstate->_whence = whence;
-}
-
-
// Every PyThreadState is actually allocated as a _PyThreadStateImpl. The
// PyThreadState fields are exposed as part of the C API, although most fields
// are intended to be private. The _PyThreadStateImpl fields not exposed.
}
PyObject *res = NULL;
- PyThreadState *tstate = PyThreadState_New(interp);
- _PyThreadState_SetWhence(tstate, _PyThreadState_WHENCE_EXEC);
+ PyThreadState *tstate =
+ _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_EXEC);
PyThreadState *save_tstate = PyThreadState_Swap(tstate);
PyThreadState *tstate = PyThreadState_Get();
PyThreadState *prev = tstate;
if (interp != tstate->interp) {
- tstate = PyThreadState_New(interp);
- _PyThreadState_SetWhence(tstate, _PyThreadState_WHENCE_EXEC);
+ tstate = _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_EXEC);
// XXX Possible GILState issues?
session->prev_tstate = PyThreadState_Swap(tstate);
assert(session->prev_tstate == prev);
tstate = cur_tstate;
}
else {
- tstate = PyThreadState_New(interp);
- _PyThreadState_SetWhence(tstate, _PyThreadState_WHENCE_INTERP);
+ tstate = _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_FINI);
assert(tstate != NULL);
save_tstate = PyThreadState_Swap(tstate);
}
if (_Py_IsMainInterpreter(tstate->interp)) {
return tstate;
}
- PyThreadState *main_tstate = PyThreadState_New(_PyInterpreterState_Main());
+ PyThreadState *main_tstate = _PyThreadState_NewBound(
+ _PyInterpreterState_Main(), _PyThreadState_WHENCE_EXEC);
if (main_tstate == NULL) {
return NULL;
}
- main_tstate->_whence = _PyThreadState_WHENCE_EXEC;
#ifndef NDEBUG
PyThreadState *old_tstate = PyThreadState_Swap(main_tstate);
assert(old_tstate == tstate);
}
PyThreadState *tstate = _PyThreadState_New(interp,
- _PyThreadState_WHENCE_INTERP);
+ _PyThreadState_WHENCE_INIT);
if (tstate == NULL) {
return _PyStatus_ERR("can't make first thread");
}
goto error;
}
- tstate = _PyThreadState_New(interp, _PyThreadState_WHENCE_INTERP);
+ tstate = _PyThreadState_New(interp, _PyThreadState_WHENCE_INIT);
if (tstate == NULL) {
status = _PyStatus_NO_MEMORY();
goto error;
PyThread_release_lock(interp->id_mutex);
if (refcount == 0 && interp->requires_idref) {
- PyThreadState *tstate = _PyThreadState_New(interp,
- _PyThreadState_WHENCE_INTERP);
- _PyThreadState_Bind(tstate);
+ PyThreadState *tstate =
+ _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_FINI);
// XXX Possible GILState issues?
PyThreadState *save_tstate = _PyThreadState_Swap(runtime, tstate);
PyThreadState *
PyThreadState_New(PyInterpreterState *interp)
{
- PyThreadState *tstate = new_threadstate(interp,
- _PyThreadState_WHENCE_UNKNOWN);
+ return _PyThreadState_NewBound(interp, _PyThreadState_WHENCE_UNKNOWN);
+}
+
+PyThreadState *
+_PyThreadState_NewBound(PyInterpreterState *interp, int whence)
+{
+ PyThreadState *tstate = new_threadstate(interp, whence);
if (tstate) {
bind_tstate(tstate);
// This makes sure there's a gilstate tstate bound