https://github.com/python/cpython/commit/2cefa70eb92321c39f7d66bd862b2f66cd06f0fa
commit: 2cefa70eb92321c39f7d66bd862b2f66cd06f0fa
branch: main
author: Peter Bierma <[email protected]>
committer: ZeroIntensity <[email protected]>
date: 2025-10-28T09:07:19-04:00
summary:
gh-140544: Always assume that thread locals are available (GH-140690)
Python has required thread local support since 3.12 (see GH-103324). By
assuming that thread locals are always supported, we can improve the
performance of third-party extensions by allowing them to access the attached
thread and interpreter states directly.
files:
M Include/pyport.h
M Python/import.c
M Python/pystate.c
diff --git a/Include/pyport.h b/Include/pyport.h
index 62db8d07701d1d..e77b39026a59c1 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -509,23 +509,18 @@ extern "C" {
#endif
#ifdef WITH_THREAD
-# ifdef Py_BUILD_CORE
-# ifdef HAVE_THREAD_LOCAL
-# error "HAVE_THREAD_LOCAL is already defined"
-# endif
-# define HAVE_THREAD_LOCAL 1
-# ifdef thread_local
-# define _Py_thread_local thread_local
-# elif __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
-# define _Py_thread_local _Thread_local
-# elif defined(_MSC_VER) /* AKA NT_THREADS */
-# define _Py_thread_local __declspec(thread)
-# elif defined(__GNUC__) /* includes clang */
-# define _Py_thread_local __thread
-# else
- // fall back to the PyThread_tss_*() API, or ignore.
-# undef HAVE_THREAD_LOCAL
-# endif
+// HAVE_THREAD_LOCAL is just defined here for compatibility's sake
+# define HAVE_THREAD_LOCAL 1
+# ifdef thread_local
+# define _Py_thread_local thread_local
+# elif __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
+# define _Py_thread_local _Thread_local
+# elif defined(_MSC_VER) /* AKA NT_THREADS */
+# define _Py_thread_local __declspec(thread)
+# elif defined(__GNUC__) /* includes clang */
+# define _Py_thread_local __thread
+# else
+# error "no supported thread-local variable storage classifier"
# endif
#endif
diff --git a/Python/import.c b/Python/import.c
index 45206b46793846..d4b574a8828dc5 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -782,18 +782,13 @@ _PyImport_ClearModulesByIndex(PyInterpreterState *interp)
substitute this (if the name actually matches).
*/
-#ifdef HAVE_THREAD_LOCAL
_Py_thread_local const char *pkgcontext = NULL;
# undef PKGCONTEXT
# define PKGCONTEXT pkgcontext
-#endif
const char *
_PyImport_ResolveNameWithPackageContext(const char *name)
{
-#ifndef HAVE_THREAD_LOCAL
- PyMutex_Lock(&EXTENSIONS.mutex);
-#endif
if (PKGCONTEXT != NULL) {
const char *p = strrchr(PKGCONTEXT, '.');
if (p != NULL && strcmp(name, p+1) == 0) {
@@ -801,23 +796,14 @@ _PyImport_ResolveNameWithPackageContext(const char *name)
PKGCONTEXT = NULL;
}
}
-#ifndef HAVE_THREAD_LOCAL
- PyMutex_Unlock(&EXTENSIONS.mutex);
-#endif
return name;
}
const char *
_PyImport_SwapPackageContext(const char *newcontext)
{
-#ifndef HAVE_THREAD_LOCAL
- PyMutex_Lock(&EXTENSIONS.mutex);
-#endif
const char *oldcontext = PKGCONTEXT;
PKGCONTEXT = newcontext;
-#ifndef HAVE_THREAD_LOCAL
- PyMutex_Unlock(&EXTENSIONS.mutex);
-#endif
return oldcontext;
}
diff --git a/Python/pystate.c b/Python/pystate.c
index 2141e842a37d2f..24681536797f94 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -67,9 +67,6 @@ to avoid the expense of doing their own locking).
For each of these functions, the GIL must be held by the current thread.
*/
-#ifndef HAVE_THREAD_LOCAL
-# error "no supported thread-local variable storage classifier"
-#endif
/* The attached thread state for the current thread. */
_Py_thread_local PyThreadState *_Py_tss_tstate = NULL;
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]