Skip to content

Commit

Permalink
pythongh-99377: Revert audit events for thread state creation and fre…
Browse files Browse the repository at this point in the history
…e, because the GIL is not properly held at these times (pythonGH-99543)
  • Loading branch information
zooba authored Nov 17, 2022
1 parent bc390dd commit 5fdd49d
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 39 deletions.
13 changes: 0 additions & 13 deletions Doc/c-api/init.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1239,25 +1239,12 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
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`.
Expand Down
8 changes: 0 additions & 8 deletions Lib/test/test_audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,19 +197,11 @@ def test_threading(self):
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")
Expand Down
19 changes: 1 addition & 18 deletions Python/pystate.c
Original file line number Diff line number Diff line change
Expand Up @@ -875,27 +875,14 @@ PyThreadState_New(PyInterpreterState *interp)
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.
Expand Down Expand Up @@ -1043,10 +1030,6 @@ _PyInterpreterState_ClearModules(PyInterpreterState *interp)
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) {
Expand Down

0 comments on commit 5fdd49d

Please sign in to comment.