From d12e75734d46ecde588c5de65e6d64146911d20c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 21 May 2019 12:44:57 +0200 Subject: [PATCH] Revert "bpo-36084: Add native thread ID to threading.Thread objects (GH-11993)" (GH-13458) This reverts commit 4959c33d2555b89b494c678d99be81a65ee864b0. --- Doc/library/_thread.rst | 12 ------- Doc/library/threading.rst | 31 ------------------- Include/pythread.h | 1 - Lib/_dummy_thread.py | 4 --- Lib/test/test_threading.py | 4 --- Lib/threading.py | 23 ++------------ .../2019-02-22-23-03-20.bpo-36084.86Eh4X.rst | 1 - Modules/_threadmodule.c | 16 ---------- Python/thread_nt.h | 16 ---------- Python/thread_pthread.h | 27 ---------------- 10 files changed, 2 insertions(+), 133 deletions(-) delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index d7814f218b5..acffabf24ba 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -85,18 +85,6 @@ This module defines the following constants and functions: may be recycled when a thread exits and another thread is created. -.. function:: get_native_id() - - Return the native integral Thread ID of the current thread assigned by the kernel. - This is a non-negative integer. - Its value may be used to uniquely identify this particular thread system-wide - (until the thread terminates, after which the value may be recycled by the OS). - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - - .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 715940c1c52..22342803e5e 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -49,18 +49,6 @@ This module defines the following functions: .. versionadded:: 3.3 -.. function:: get_native_id() - - Return the native integral Thread ID of the current thread assigned by the kernel. - This is a non-negative integer. - Its value may be used to uniquely identify this particular thread system-wide - (until the thread terminates, after which the value may be recycled by the OS). - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - - .. function:: enumerate() Return a list of all :class:`Thread` objects currently alive. The list @@ -309,25 +297,6 @@ since it is impossible to detect the termination of alien threads. another thread is created. The identifier is available even after the thread has exited. - .. attribute:: native_id - - The native integral thread ID of this thread or ``0`` if the thread has not - been started. This is a non-negative integer. See the - :func:`get_native_id` function. - This represents the Thread ID (``TID``) as assigned to the - thread by the OS (kernel). Its value may be used to uniquely identify - this particular thread system-wide. - - .. note:: - - Similar to Process IDs, Thread IDs are only valid (guaranteed unique - system-wide) from the time the thread is created until the thread - has been terminated. - - .. availability:: Windows, FreeBSD, Linux, macOS. - - .. versionadded:: 3.8 - .. method:: is_alive() Return whether the thread is alive. diff --git a/Include/pythread.h b/Include/pythread.h index e083383af80..bc1d92cd1ff 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -25,7 +25,6 @@ PyAPI_FUNC(void) PyThread_init_thread(void); PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); -PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py index 0a877e1fa16..a2cae54b058 100644 --- a/Lib/_dummy_thread.py +++ b/Lib/_dummy_thread.py @@ -71,10 +71,6 @@ def get_ident(): """ return 1 -def get_native_id(): - """Dummy implementation of _thread.get_native_id().""" - return 0 - def allocate_lock(): """Dummy implementation of _thread.allocate_lock().""" return LockType() diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 6ac6e9de7a5..2ddc77b266b 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -104,10 +104,6 @@ class ThreadTests(BaseTestCase): self.assertRegex(repr(t), r'^$') t.start() - native_ids = set(t.native_id for t in threads) | {threading.get_native_id()} - self.assertNotIn(None, native_ids) - self.assertEqual(len(native_ids), NUMTASKS + 1) - if verbose: print('waiting for all tasks to complete') for t in threads: diff --git a/Lib/threading.py b/Lib/threading.py index 3137e495b25..0ebbd6776ef 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -23,8 +23,8 @@ except ImportError: # with the multiprocessing module, which doesn't provide the old # Java inspired names. -__all__ = ['get_ident', 'get_native_id', 'active_count', 'Condition', - 'current_thread', 'enumerate', 'main_thread', 'TIMEOUT_MAX', +__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', + 'enumerate', 'main_thread', 'TIMEOUT_MAX', 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size'] @@ -34,7 +34,6 @@ _start_new_thread = _thread.start_new_thread _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident -get_native_id = _thread.get_native_id ThreadError = _thread.error try: _CRLock = _thread.RLock @@ -791,7 +790,6 @@ class Thread: else: self._daemonic = current_thread().daemon self._ident = None - self._native_id = 0 self._tstate_lock = None self._started = Event() self._is_stopped = False @@ -893,9 +891,6 @@ class Thread: def _set_ident(self): self._ident = get_ident() - def _set_native_id(self): - self._native_id = get_native_id() - def _set_tstate_lock(self): """ Set a lock object which will be released by the interpreter when @@ -908,7 +903,6 @@ class Thread: try: self._set_ident() self._set_tstate_lock() - self._set_native_id() self._started.set() with _active_limbo_lock: _active[self._ident] = self @@ -1083,17 +1077,6 @@ class Thread: assert self._initialized, "Thread.__init__() not called" return self._ident - @property - def native_id(self): - """Native integral thread ID of this thread or 0 if it has not been started. - - This is a non-negative integer. See the get_native_id() function. - This represents the Thread ID as reported by the kernel. - - """ - assert self._initialized, "Thread.__init__() not called" - return self._native_id - def is_alive(self): """Return whether the thread is alive. @@ -1193,7 +1176,6 @@ class _MainThread(Thread): self._set_tstate_lock() self._started.set() self._set_ident() - self._set_native_id() with _active_limbo_lock: _active[self._ident] = self @@ -1213,7 +1195,6 @@ class _DummyThread(Thread): self._started.set() self._set_ident() - self._set_native_id() with _active_limbo_lock: _active[self._ident] = self diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst b/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst deleted file mode 100644 index 4a612964de0..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-02-22-23-03-20.bpo-36084.86Eh4X.rst +++ /dev/null @@ -1 +0,0 @@ -Add native thread ID (TID) to threading.Thread objects \ No newline at end of file diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index a123cd0efd6..3c02d8dd514 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -1159,20 +1159,6 @@ allocated consecutive numbers starting at 1, this behavior should not\n\ be relied upon, and the number should be seen purely as a magic cookie.\n\ A thread's identity may be reused for another thread after it exits."); -static PyObject * -thread_get_native_id(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - unsigned long native_id = PyThread_get_thread_native_id(); - return PyLong_FromUnsignedLong(native_id); -} - -PyDoc_STRVAR(get_native_id_doc, -"get_native_id() -> integer\n\ -\n\ -Return a non-negative integer identifying the thread as reported\n\ -by the OS (kernel). This may be used to uniquely identify a\n\ -particular thread within a system."); - static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { @@ -1324,8 +1310,6 @@ static PyMethodDef thread_methods[] = { METH_NOARGS, interrupt_doc}, {"get_ident", thread_get_ident, METH_NOARGS, get_ident_doc}, - {"get_native_id", thread_get_native_id, - METH_NOARGS, get_native_id_doc}, {"_count", thread__count, METH_NOARGS, _count_doc}, {"stack_size", (PyCFunction)thread_stack_size, diff --git a/Python/thread_nt.h b/Python/thread_nt.h index d3dc2bec6ff..5e00c351146 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -143,8 +143,6 @@ 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. */ @@ -229,20 +227,6 @@ 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 87c98d3e93c..4c106d9959c 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -12,12 +12,6 @@ #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 @@ -308,27 +302,6 @@ 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) {