summaryrefslogtreecommitdiffstats
path: root/Python/thread_pthread.h
diff options
context:
space:
mode:
authorMasayuki Yamamoto <ma3yuki.8mamo10@gmail.com>2017-10-06 10:41:34 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2017-10-06 10:41:34 (GMT)
commit731e18901484c75b60167a06a0ba0719a6d4827d (patch)
treefc9b8afc6eb8453729c130a146b838228ab103c6 /Python/thread_pthread.h
parentb8ab9d3fc816f85f4d6dbef12b7414e6dc10e4dd (diff)
downloadcpython-731e18901484c75b60167a06a0ba0719a6d4827d.zip
cpython-731e18901484c75b60167a06a0ba0719a6d4827d.tar.gz
cpython-731e18901484c75b60167a06a0ba0719a6d4827d.tar.bz2
bpo-25658: Implement PEP 539 for Thread Specific Storage (TSS) API (GH-1362)
See PEP 539 for details. Highlights of changes: - Add Thread Specific Storage (TSS) API - Document the Thread Local Storage (TLS) API as deprecated - Update code that used TLS API to use TSS API
Diffstat (limited to 'Python/thread_pthread.h')
-rw-r--r--Python/thread_pthread.h90
1 files changed, 87 insertions, 3 deletions
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index 2dcd107..c5b7f32 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -589,9 +589,25 @@ _pythread_pthread_set_stacksize(size_t size)
#define THREAD_SET_STACKSIZE(x) _pythread_pthread_set_stacksize(x)
+/* Thread Local Storage (TLS) API
+
+ This API is DEPRECATED since Python 3.7. See PEP 539 for details.
+*/
+
+/* Issue #25658: On platforms where native TLS key is defined in a way that
+ cannot be safely cast to int, PyThread_create_key returns immediately a
+ failure status and other TLS functions all are no-ops. This indicates
+ clearly that the old API is not supported on platforms where it cannot be
+ used reliably, and that no effort will be made to add such support.
+
+ Note: PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT will be unnecessary after
+ removing this API.
+*/
+
int
PyThread_create_key(void)
{
+#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_key_t key;
int fail = pthread_key_create(&key, NULL);
if (fail)
@@ -603,34 +619,102 @@ PyThread_create_key(void)
return -1;
}
return (int)key;
+#else
+ return -1; /* never return valid key value. */
+#endif
}
void
PyThread_delete_key(int key)
{
+#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_key_delete(key);
+#endif
}
void
PyThread_delete_key_value(int key)
{
+#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
pthread_setspecific(key, NULL);
+#endif
}
int
PyThread_set_key_value(int key, void *value)
{
- int fail;
- fail = pthread_setspecific(key, value);
+#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
+ int fail = pthread_setspecific(key, value);
return fail ? -1 : 0;
+#else
+ return -1;
+#endif
}
void *
PyThread_get_key_value(int key)
{
+#ifdef PTHREAD_KEY_T_IS_COMPATIBLE_WITH_INT
return pthread_getspecific(key);
+#else
+ return NULL;
+#endif
}
+
void
PyThread_ReInitTLS(void)
-{}
+{
+}
+
+
+/* Thread Specific Storage (TSS) API
+
+ Platform-specific components of TSS API implementation.
+*/
+
+int
+PyThread_tss_create(Py_tss_t *key)
+{
+ assert(key != NULL);
+ /* If the key has been created, function is silently skipped. */
+ if (key->_is_initialized) {
+ return 0;
+ }
+
+ int fail = pthread_key_create(&(key->_key), NULL);
+ if (fail) {
+ return -1;
+ }
+ key->_is_initialized = 1;
+ return 0;
+}
+
+void
+PyThread_tss_delete(Py_tss_t *key)
+{
+ assert(key != NULL);
+ /* If the key has not been created, function is silently skipped. */
+ if (!key->_is_initialized) {
+ return;
+ }
+
+ pthread_key_delete(key->_key);
+ /* pthread has not provided the defined invalid value for the key. */
+ key->_is_initialized = 0;
+}
+
+int
+PyThread_tss_set(Py_tss_t *key, void *value)
+{
+ assert(key != NULL);
+ int fail = pthread_setspecific(key->_key, value);
+ return fail ? -1 : 0;
+}
+
+void *
+PyThread_tss_get(Py_tss_t *key)
+{
+ assert(key != NULL);
+ return pthread_getspecific(key->_key);
+}