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.
#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
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) {
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;
}
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;