From 4959c33d2555b89b494c678d99be81a65ee864b0 Mon Sep 17 00:00:00 2001 From: Jake Tesler Date: Sun, 12 May 2019 10:08:24 -0700 Subject: bpo-36084: Add native thread ID to threading.Thread objects (GH-11993) --- Python/thread_nt.h | 16 ++++++++++++++++ Python/thread_pthread.h | 27 +++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) (limited to 'Python') diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 5e00c35114..d3dc2bec6f 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -143,6 +143,8 @@ LeaveNonRecursiveMutex(PNRMUTEX mutex) unsigned long PyThread_get_thread_ident(void); +unsigned long PyThread_get_thread_native_id(void); + /* * Initialization of the C package, should not be needed. */ @@ -227,6 +229,20 @@ PyThread_get_thread_ident(void) return GetCurrentThreadId(); } +/* + * Return the native Thread ID (TID) of the calling thread. + * The native ID of a thread is valid and guaranteed to be unique system-wide + * from the time the thread is created until the thread has been terminated. + */ +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) + PyThread_init_thread(); + + return GetCurrentThreadId(); +} + void _Py_NO_RETURN PyThread_exit_thread(void) { diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 4c106d9959..87c98d3e93 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -12,6 +12,12 @@ #endif #include +#if defined(__linux__) +#include +#elif defined(__FreeBSD__) +#include +#endif + /* The POSIX spec requires that use of pthread_attr_setstacksize be conditional on _POSIX_THREAD_ATTR_STACKSIZE being defined. */ #ifdef _POSIX_THREAD_ATTR_STACKSIZE @@ -302,6 +308,27 @@ PyThread_get_thread_ident(void) return (unsigned long) threadid; } +unsigned long +PyThread_get_thread_native_id(void) +{ + if (!initialized) + PyThread_init_thread(); +#ifdef __APPLE__ + uint64_t native_id; + pthread_threadid_np(NULL, &native_id); +#elif defined(__linux__) + pid_t native_id; + native_id = syscall(__NR_gettid); +#elif defined(__FreeBSD__) + pid_t native_id; + native_id = pthread_getthreadid_np(); +#else + unsigned long native_id; + native_id = 0; +#endif + return (unsigned long) native_id; +} + void _Py_NO_RETURN PyThread_exit_thread(void) { -- cgit v1.2.1