Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
Closed
Labels
OS-unsupportedextension-modulesC modules in the Modules dirC modules in the Modules dirinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
0e9c364 changed thread_get_ident to convert a unsigned long long vs the previous unsigned long.
staticPyObject*thread_get_ident(PyObject*self, PyObject*Py_UNUSED(ignored)){PyThread_ident_tident=PyThread_get_thread_ident_ex(); // <-- ULLif (ident==PYTHREAD_INVALID_THREAD_ID){PyErr_SetString(ThreadError, "no current thread ident"); returnNULL} returnPyLong_FromUnsignedLongLong(ident)}However, after #114839 commit 76bde03
MainThread is now a special case because it doesn't use self._set_ident():
class_MainThread(Thread): def__init__(self): Thread.__init__(self, name="MainThread", daemon=False) self._started.set() self._ident=_get_main_thread_ident() self._handle=_make_thread_handle(self._ident) if_HAVE_THREAD_NATIVE_ID: self._set_native_id() with_active_limbo_lock: _active[self._ident] =selfIt inserts an identifier from a special function which is always the clipped unsigned long from the runtime struct into the active thread list.
staticPyObject*thread__get_main_thread_ident(PyObject*module, PyObject*Py_UNUSED(ignored)){returnPyLong_FromUnsignedLongLong(_PyRuntime.main_thread)}/* Platform-specific identifier and PyThreadState, respectively, for the main thread in the main interpreter. */unsigned longmain_thread;// Set it to the ID of the main thread of the main interpreter.runtime->main_thread=PyThread_get_thread_ident();Because of this, on some platforms/libc implementations, we can observe a failure to look up the current thread because of the mismatch between clipped UL value vs the expected ULL value:
>>> import threading >>> ct = threading.current_thread() >>> ct <_DummyThread(Dummy-1, started daemon 18446744072483979068)> >>> hex(ct.ident) '0xffffffffb6f33f3c' >>> main = threading.main_thread() >>> hex(main.ident) '0xb6f33f3c' >>> main._set_ident() >>> hex(main.ident) '0xffffffffb6f33f3c' def current_thread(): """Return the current Thread object, corresponding to the caller's thread of control. If the caller's thread of control was not created through the threading module, a dummy thread object with limited functionality is returned. """ try: return _active[get_ident()] except KeyError: return _DummyThread() Should main_thread to be a PyThread_ident_t ? or should MainThread continue to call _set_ident()?
CPython versions tested on:
3.13
Operating systems tested on:
Linux
Linked PRs
Metadata
Metadata
Assignees
Labels
OS-unsupportedextension-modulesC modules in the Modules dirC modules in the Modules dirinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
Status
Done