mirror of https://github.com/python/cpython
gh-112535: Implement fallback implementation of _Py_ThreadId() (gh-113185)
--------- Co-authored-by: Sam Gross <colesbury@gmail.com>
This commit is contained in:
parent
59f0766ae5
commit
d00dbf5415
|
@ -239,6 +239,8 @@ PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y);
|
|||
#define Py_Is(x, y) ((x) == (y))
|
||||
|
||||
#if defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API)
|
||||
PyAPI_FUNC(uintptr_t) _Py_GetThreadLocal_Addr(void);
|
||||
|
||||
static inline uintptr_t
|
||||
_Py_ThreadId(void)
|
||||
{
|
||||
|
@ -291,7 +293,9 @@ _Py_ThreadId(void)
|
|||
__asm__ ("mv %0, tp" : "=r" (tid));
|
||||
#endif
|
||||
#else
|
||||
# error "define _Py_ThreadId for this platform"
|
||||
// Fallback to a portable implementation if we do not have a faster
|
||||
// platform-specific implementation.
|
||||
tid = _Py_GetThreadLocal_Addr();
|
||||
#endif
|
||||
return tid;
|
||||
}
|
||||
|
|
|
@ -1951,6 +1951,20 @@ _PyThreadState_Bind(PyThreadState *tstate)
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API)
|
||||
uintptr_t
|
||||
_Py_GetThreadLocal_Addr(void)
|
||||
{
|
||||
#ifdef HAVE_THREAD_LOCAL
|
||||
// gh-112535: Use the address of the thread-local PyThreadState variable as
|
||||
// a unique identifier for the current thread. Each thread has a unique
|
||||
// _Py_tss_tstate variable with a unique address.
|
||||
return (uintptr_t)&_Py_tss_tstate;
|
||||
#else
|
||||
# error "no supported thread-local variable storage classifier"
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/***********************************/
|
||||
/* routines for advanced debuggers */
|
||||
|
|
Loading…
Reference in New Issue