When the current thread state is ``NULL``, this issues a fatal error (so that
the caller needn't check for ``NULL``).
+ See also :c:func:`PyThreadState_GetUnchecked`.
+
+
+.. c:function:: PyThreadState* PyThreadState_GetUnchecked()
+
+ Similar to :c:func:`PyThreadState_Get`, but don't kill the process with a
+ fatal error if it is NULL. The caller is responsible to check if the result
+ is NULL.
+
+ .. versionadded:: 3.13
+ In Python 3.5 to 3.12, the function was private and known as
+ ``_PyThreadState_UncheckedGet()``.
+
.. c:function:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate)
functions on Python 3.11 and 3.12.
(Contributed by Victor Stinner in :gh:`107073`.)
+* Add :c:func:`PyThreadState_GetUnchecked()` function: similar to
+ :c:func:`PyThreadState_Get()`, but don't kill the process with a fatal error
+ if it is NULL. The caller is responsible to check if the result is NULL.
+ Previously, the function was private and known as
+ ``_PyThreadState_UncheckedGet()``.
+ (Contributed by Victor Stinner in :gh:`108867`.)
+
Porting to Python 3.13
----------------------
/* If "cond" is false, then _tstate remains NULL and the deallocator \
* is run normally without involving the trashcan */ \
if (cond) { \
- _tstate = _PyThreadState_UncheckedGet(); \
+ _tstate = PyThreadState_GetUnchecked(); \
if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \
break; \
} \
/* Similar to PyThreadState_Get(), but don't issue a fatal error
* if it is NULL. */
-PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void);
+PyAPI_FUNC(PyThreadState *) PyThreadState_GetUnchecked(void);
// Disable tracing and profiling.
The caller must hold the GIL.
- See also PyThreadState_Get() and _PyThreadState_UncheckedGet(). */
+ See also PyThreadState_Get() and PyThreadState_GetUnchecked(). */
static inline PyThreadState*
_PyThreadState_GET(void)
{
The caller must hold the GIL.
- See also _PyThreadState_UncheckedGet() and _PyThreadState_GET(). */
+ See also PyThreadState_GetUnchecked() and _PyThreadState_GET(). */
PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void);
// Alias to PyThreadState_Get()
--- /dev/null
+Add :c:func:`PyThreadState_GetUnchecked()` function: similar to
+:c:func:`PyThreadState_Get()`, but don't kill the process with a fatal error if
+it is NULL. The caller is responsible to check if the result is NULL.
+Previously, the function was private and known as
+``_PyThreadState_UncheckedGet()``. Patch by Victor Stinner.
PyThreadState *tstate2 = PyThreadState_Get();
assert(tstate2 == tstate);
- // private _PyThreadState_UncheckedGet()
- PyThreadState *tstate3 = _PyThreadState_UncheckedGet();
+ // PyThreadState_GetUnchecked()
+ PyThreadState *tstate3 = PyThreadState_GetUnchecked();
assert(tstate3 == tstate);
// PyThreadState_EnterTracing(), PyThreadState_LeaveTracing()
#include "pycore_pathconfig.h" // _PyPathConfig_ReadGlobal()
#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#include "pycore_pymem.h" // _PyMem_RawWcsdup()
+#include "pycore_pystate.h" // _PyThreadState_GET()
#include "marshal.h" // PyMarshal_ReadObjectFromString
#include "osdefs.h" // DELIM
return status;
}
- if (!_PyThreadState_UncheckedGet()) {
+ if (!_PyThreadState_GET()) {
return PyStatus_Error("cannot calculate path configuration without GIL");
}
//---------------------------------
PyThreadState *
-_PyThreadState_UncheckedGet(void)
+PyThreadState_GetUnchecked(void)
{
return current_fast_get(&_PyRuntime);
}