bpo-39947: Add PyThreadState_GetID() function (GH-19163)

Add PyThreadState_GetID() function: get the unique identifier of a
Python thread state.
This commit is contained in:
Victor Stinner 2020-03-25 21:23:53 +01:00 committed by GitHub
parent 0e427c6d15
commit 5c3cda0d1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 25 additions and 2 deletions

View File

@ -1084,6 +1084,15 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
.. versionadded:: 3.9 .. versionadded:: 3.9
.. c:function:: uint64_t PyThreadState_GetID(PyThreadState *tstate)
Get the unique thread state identifier of the Python thread state *tstate*.
*tstate* must not be ``NULL``.
.. versionadded:: 3.9
.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate) .. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate)
Get the interpreter of the Python thread state *tstate*. Get the interpreter of the Python thread state *tstate*.

View File

@ -429,6 +429,8 @@ Build and C API Changes
:c:func:`PyInterpreterState_Get` functions to get the interpreter. :c:func:`PyInterpreterState_Get` functions to get the interpreter.
New :c:func:`PyThreadState_GetFrame` function to get the current frame of a New :c:func:`PyThreadState_GetFrame` function to get the current frame of a
Python thread state. Python thread state.
New :c:func:`PyThreadState_GetID` function: get the unique identifier of a
Python thread state.
(Contributed by Victor Stinner in :issue:`39947`.) (Contributed by Victor Stinner in :issue:`39947`.)
* Add ``--with-platlibdir`` option to the ``configure`` script: name of the * Add ``--with-platlibdir`` option to the ``configure`` script: name of the

View File

@ -91,6 +91,7 @@ PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *);
/* New in 3.9 */ /* New in 3.9 */
PyAPI_FUNC(PyInterpreterState*) PyThreadState_GetInterpreter(PyThreadState *tstate); PyAPI_FUNC(PyInterpreterState*) PyThreadState_GetInterpreter(PyThreadState *tstate);
PyAPI_FUNC(struct _frame*) PyThreadState_GetFrame(PyThreadState *tstate); PyAPI_FUNC(struct _frame*) PyThreadState_GetFrame(PyThreadState *tstate);
PyAPI_FUNC(uint64_t) PyThreadState_GetID(PyThreadState *tstate);
#endif #endif
typedef typedef

View File

@ -0,0 +1,2 @@
Add :c:func:`PyThreadState_GetID` function: get the unique identifier of a
Python thread state.

View File

@ -231,7 +231,8 @@ get_running_loop(PyObject **loop)
PyObject *rl; PyObject *rl;
PyThreadState *ts = PyThreadState_Get(); PyThreadState *ts = PyThreadState_Get();
if (ts->id == cached_running_holder_tsid && cached_running_holder != NULL) { uint64_t ts_id = PyThreadState_GetID(ts);
if (ts_id == cached_running_holder_tsid && cached_running_holder != NULL) {
// Fast path, check the cache. // Fast path, check the cache.
rl = cached_running_holder; // borrowed rl = cached_running_holder; // borrowed
} }
@ -253,7 +254,7 @@ get_running_loop(PyObject **loop)
} }
cached_running_holder = rl; // borrowed cached_running_holder = rl; // borrowed
cached_running_holder_tsid = ts->id; cached_running_holder_tsid = ts_id;
} }
assert(Py_IS_TYPE(rl, &PyRunningLoopHolder_Type)); assert(Py_IS_TYPE(rl, &PyRunningLoopHolder_Type));

View File

@ -1021,6 +1021,14 @@ PyThreadState_GetFrame(PyThreadState *tstate)
} }
uint64_t
PyThreadState_GetID(PyThreadState *tstate)
{
assert(tstate != NULL);
return tstate->id;
}
/* Asynchronously raise an exception in a thread. /* Asynchronously raise an exception in a thread.
Requested by Just van Rossum and Alex Martelli. Requested by Just van Rossum and Alex Martelli.
To prevent naive misuse, you must write your own extension To prevent naive misuse, you must write your own extension