8000 bpo-39511: PyThreadState_Clear() calls on_delete by vstinner · Pull Request #18296 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

bpo-39511: PyThreadState_Clear() calls on_delete #18296

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
bpo-39511: PyThreadState_Clear() calls on_delete
PyThreadState.on_delete is a callback used to notify Python when a
thread completes. _thread._set_sentinel() function creates a lock
which is released when the thread completes. It sets on_delete
callback to the internal release_sentinel() function. This lock is
known as Threading._tstate_lock in the threading module.

The release_sentinel() function uses the Python C API. The problem is
that on_delete is called late in the Python finalization, when the C
API is no longer fully working.

The PyThreadState_Clear() function now calls the
PyThreadState.on_delete callback. Previously, that happened in
PyThreadState_Delete().

The release_sentinel() function is now called when the C API is still
fully working.
  • Loading branch information
vstinner committed Feb 1, 2020
commit 5e39ae9a90f29ed75954cecc8dfeb56ad60ffa1f
4 changes: 4 additions & 0 deletions Doc/c-api/init.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1048,6 +1048,10 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
Reset all information in a thread state object. The global interpreter lock
must be held.

.. versionchanged:: 3.9
This function now calls the :c:member:`PyThreadState.on_delete` callback.
Previously, that happened in :c:func:`PyThreadState_Delete`.


.. c:function:: void PyThreadState_Delete(PyThreadState *tstate)

Expand Down
8000
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The :c:func:`PyThreadState_Clear` function now calls the
:c:member:`PyThreadState.on_delete` callback. Previously, that happened in
:c:func:`PyThreadState_Delete`.
8 changes: 5 additions & 3 deletions Python/pystate.c
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,10 @@ PyThreadState_Clear(PyThreadState *tstate)
Py_CLEAR(tstate->async_gen_finalizer);

Py_CLEAR(tstate->context);

if (tstate->on_delete != NULL) {
tstate->on_delete(tstate->on_delete_data);
}
}


Expand All @@ -830,9 +834,7 @@ tstate_delete_common(PyThreadState *tstate,
if (tstate->next)
tstate->next->prev = tstate->prev;
HEAD_UNLOCK(runtime);
if (tstate->on_delete != NULL) {
tstate->on_delete(tstate->on_delete_data);
}

PyMem_RawFree(tstate);

if (gilstate->autoInterpreterState &&
Expand Down
0