The global interpreter lock need not be held, but may be held if it is
necessary to serialize calls to this function.
- .. audit-event:: cpython.PyThreadState_New id c.PyThreadState_New
-
- Raise an auditing event ``cpython.PyThreadState_New`` with Python's thread
- id as the argument. The event will be raised from the thread creating the new
- ``PyThreadState``, which may not be the new thread.
-
.. c:function:: void PyThreadState_Clear(PyThreadState *tstate)
Reset all information in a thread state object. The global interpreter lock
must be held.
- .. audit-event:: cpython.PyThreadState_Clear id c.PyThreadState_Clear
-
- Raise an auditing event ``cpython.PyThreadState_Clear`` with Python's
- thread id as the argument. The event may be raised from a different thread
- than the one being cleared. Exceptions raised from a hook will be treated
- as unraisable and will not abort the operation.
-
.. versionchanged:: 3.9
This function now calls the :c:member:`PyThreadState.on_delete` callback.
Previously, that happened in :c:func:`PyThreadState_Delete`.
actual = [(ev[0], ev[2]) for ev in events]
expected = [
("_thread.start_new_thread", "(<test_func>, (), None)"),
- ("cpython.PyThreadState_New", "(2,)"),
("test.test_func", "()"),
- ("cpython.PyThreadState_Clear", "(2,)"),
]
self.assertEqual(actual, expected)
- def test_threading_abort(self):
- # Ensures that aborting PyThreadState_New raises the correct exception
- returncode, events, stderr = self.run_python("test_threading_abort")
- if returncode:
- self.fail(stderr)
-
def test_wmi_exec_query(self):
import_helper.import_module("_wmi")
PyThreadState *tstate = new_threadstate(interp);
if (tstate) {
_PyThreadState_SetCurrent(tstate);
- if (PySys_Audit("cpython.PyThreadState_New", "K", tstate->id) < 0) {
- PyThreadState_Clear(tstate);
- _PyThreadState_DeleteCurrent(tstate);
- return NULL;
- }
}
return tstate;
}
PyThreadState *
_PyThreadState_Prealloc(PyInterpreterState *interp)
{
- PyThreadState *tstate = new_threadstate(interp);
- if (tstate) {
- if (PySys_Audit("cpython.PyThreadState_New", "K", tstate->id) < 0) {
- PyThreadState_Clear(tstate);
- _PyThreadState_Delete(tstate, 0);
- return NULL;
- }
- }
- return tstate;
+ return new_threadstate(interp);
}
// We keep this around for (accidental) stable ABI compatibility.
void
PyThreadState_Clear(PyThreadState *tstate)
{
- if (PySys_Audit("cpython.PyThreadState_Clear", "K", tstate->id) < 0) {
- PyErr_WriteUnraisable(NULL);
- }
-
int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
if (verbose && tstate->cframe->current_frame != NULL) {