From: Peter Bierma Date: Tue, 28 Oct 2025 13:07:19 +0000 (-0400) Subject: gh-140544: Always assume that thread locals are available (GH-140690) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2cefa70eb92321c39f7d66bd862b2f66cd06f0fa;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Include/pyport.h b/Include/pyport.h index 62db8d07701d..e77b39026a59 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 45206b467938..d4b574a8828d 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 2141e842a37d..24681536797f 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;