diff options
author | sonots <sonots@gmail.com> | 2017-10-18 11:38:34 +0900 |
---|---|---|
committer | sonots <sonots@gmail.com> | 2017-10-31 16:57:23 +0900 |
commit | 3c3829c569855b5d1b918240d5736a186547d36e (patch) | |
tree | 6be27d68fd9f1426d3f5cfd4d1f0ec836f13b2d0 | |
parent | 07115e3f547f9e375e64488e79bca12b45bd08bd (diff) | |
download | cython-3c3829c569855b5d1b918240d5736a186547d36e.tar.gz |
Add PythonCompatibility Codes for TSS (Thread Specific Storage) API
-rw-r--r-- | Cython/Utility/ModuleSetupCode.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Cython/Utility/ModuleSetupCode.c b/Cython/Utility/ModuleSetupCode.c index b4e06cabb..7deaa22af 100644 --- a/Cython/Utility/ModuleSetupCode.c +++ b/Cython/Utility/ModuleSetupCode.c @@ -430,6 +430,40 @@ class __Pyx_FakeReference { #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif +// TSS (Thread Specific Storage) API +#if PY_VERSION_HEX < 0x03070000 && !defined(PyThread_tss_create) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; // PyThread_create_key reports success always +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +// PyThread_delete_key_value(key) is equalivalent to PyThread_set_key_value(key, NULL) +// PyThread_ReInitTLS() is a no-op +#endif // TSS (Thread Specific Storage) API + #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else |