|
|
| #ifndef Py_PYTHREAD_H |
| #define Py_PYTHREAD_H |
|
|
| typedef void *PyThread_type_lock; |
|
|
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
|
|
| |
| |
| typedef enum PyLockStatus { |
| PY_LOCK_FAILURE = 0, |
| PY_LOCK_ACQUIRED = 1, |
| PY_LOCK_INTR |
| } PyLockStatus; |
|
|
| #ifndef Py_LIMITED_API |
| #define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1) |
| #endif |
|
|
| PyAPI_FUNC(void) PyThread_init_thread(void); |
| PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *); |
| PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); |
| PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void); |
|
|
| #if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX) |
| #define PY_HAVE_THREAD_NATIVE_ID |
| PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void); |
| #endif |
|
|
| PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void); |
| PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock); |
| PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); |
| #define WAIT_LOCK 1 |
| #define NOWAIT_LOCK 0 |
|
|
| #ifndef Py_LIMITED_API |
| #ifdef HAVE_FORK |
| |
| |
| |
| PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); |
| #endif |
| #endif |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #define PY_TIMEOUT_T long long |
|
|
| #if defined(_POSIX_THREADS) |
| |
| |
| # define PY_TIMEOUT_MAX (LLONG_MAX / 1000) |
| #elif defined (NT_THREADS) |
| |
| # if 0xFFFFFFFFLL * 1000 < LLONG_MAX |
| # define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) |
| # else |
| # define PY_TIMEOUT_MAX LLONG_MAX |
| # endif |
| #else |
| # define PY_TIMEOUT_MAX LLONG_MAX |
| #endif |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock, |
| PY_TIMEOUT_T microseconds, |
| int intr_flag); |
|
|
| PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock); |
|
|
| PyAPI_FUNC(size_t) PyThread_get_stacksize(void); |
| PyAPI_FUNC(int) PyThread_set_stacksize(size_t); |
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 |
| PyAPI_FUNC(PyObject*) PyThread_GetInfo(void); |
| #endif |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| Py_DEPRECATED(3.7) PyAPI_FUNC(int) PyThread_create_key(void); |
| Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_delete_key(int key); |
| Py_DEPRECATED(3.7) PyAPI_FUNC(int) PyThread_set_key_value(int key, |
| void *value); |
| Py_DEPRECATED(3.7) PyAPI_FUNC(void *) PyThread_get_key_value(int key); |
| Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_delete_key_value(int key); |
|
|
| |
| Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_ReInitTLS(void); |
|
|
|
|
| #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 |
| |
| |
|
|
| typedef struct _Py_tss_t Py_tss_t; |
|
|
| #ifndef Py_LIMITED_API |
| #if defined(_POSIX_THREADS) |
| |
| # include <pthread.h> |
| # define NATIVE_TSS_KEY_T pthread_key_t |
| #elif defined(NT_THREADS) |
| |
| |
| |
| # define NATIVE_TSS_KEY_T unsigned long |
| #else |
| # error "Require native threads. See https://bugs.python.org/issue31370" |
| #endif |
|
|
| |
| |
| |
| |
| struct _Py_tss_t { |
| int _is_initialized; |
| NATIVE_TSS_KEY_T _key; |
| }; |
|
|
| #undef NATIVE_TSS_KEY_T |
|
|
| |
| #define Py_tss_NEEDS_INIT {0} |
| #endif |
|
|
| PyAPI_FUNC(Py_tss_t *) PyThread_tss_alloc(void); |
| PyAPI_FUNC(void) PyThread_tss_free(Py_tss_t *key); |
|
|
| |
| PyAPI_FUNC(int) PyThread_tss_is_created(Py_tss_t *key); |
| PyAPI_FUNC(int) PyThread_tss_create(Py_tss_t *key); |
| PyAPI_FUNC(void) PyThread_tss_delete(Py_tss_t *key); |
| PyAPI_FUNC(int) PyThread_tss_set(Py_tss_t *key, void *value); |
| PyAPI_FUNC(void *) PyThread_tss_get(Py_tss_t *key); |
| #endif |
|
|
| #ifdef __cplusplus |
| } |
| #endif |
|
|
| #endif |
|
|