blob: d6674685f289ffe5cba3685cf78f25c7dfdfa888 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
Fred Drake3cf4d2b2000-07-09 00:55:06 +00002#ifndef Py_PYTHREAD_H
3#define Py_PYTHREAD_H
4
Guido van Rossum65d5b571998-12-21 19:32:43 +00005typedef void *PyThread_type_lock;
6typedef void *PyThread_type_sema;
Sjoerd Mullenderd10d8291992-09-11 15:19:27 +00007
8#ifdef __cplusplus
9extern "C" {
10#endif
11
Antoine Pitrou810023d2010-12-15 22:59:16 +000012/* Return status codes for Python lock acquisition. Chosen for maximum
13 * backwards compatibility, ie failure -> 0, success -> 1. */
14typedef enum PyLockStatus {
15 PY_LOCK_FAILURE = 0,
16 PY_LOCK_ACQUIRED = 1,
17 PY_LOCK_INTR
18} PyLockStatus;
19
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +020020#ifndef Py_LIMITED_API
21#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1)
22#endif
23
Mark Hammond91a681d2002-08-12 07:21:58 +000024PyAPI_FUNC(void) PyThread_init_thread(void);
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +020025PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *);
Mark Hammond91a681d2002-08-12 07:21:58 +000026PyAPI_FUNC(void) PyThread_exit_thread(void);
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +020027PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000028
Mark Hammond91a681d2002-08-12 07:21:58 +000029PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void);
30PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock);
31PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int);
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090032#define WAIT_LOCK 1
33#define NOWAIT_LOCK 0
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000034
35/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting
36 on a lock (see PyThread_acquire_lock_timed() below).
37 PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that
38 type, and depends on the system threading API.
Victor Stinner754851f2011-04-19 23:58:51 +020039
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000040 NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread
41 module exposes a higher-level API, with timeouts expressed in seconds
42 and floating-point numbers allowed.
43*/
Benjamin Petersonaf580df2016-09-06 10:46:49 -070044#define PY_TIMEOUT_T long long
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000045#define PY_TIMEOUT_MAX PY_LLONG_MAX
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000046
47/* In the NT API, the timeout is a DWORD and is expressed in milliseconds */
48#if defined (NT_THREADS)
Benjamin Petersonac965ca2016-09-18 18:12:21 -070049#if 0xFFFFFFFFLL * 1000 < PY_TIMEOUT_MAX
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000050#undef PY_TIMEOUT_MAX
Benjamin Petersonac965ca2016-09-18 18:12:21 -070051#define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000)
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000052#endif
53#endif
54
55/* If microseconds == 0, the call is non-blocking: it returns immediately
56 even when the lock can't be acquired.
57 If microseconds > 0, the call waits up to the specified duration.
58 If microseconds < 0, the call waits until success (or abnormal failure)
Antoine Pitrou810023d2010-12-15 22:59:16 +000059
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000060 microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is
Antoine Pitrou810023d2010-12-15 22:59:16 +000061 undefined.
62
63 If intr_flag is true and the acquire is interrupted by a signal, then the
64 call will return PY_LOCK_INTR. The caller may reattempt to acquire the
65 lock.
66*/
67PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock,
68 PY_TIMEOUT_T microseconds,
69 int intr_flag);
70
Mark Hammond91a681d2002-08-12 07:21:58 +000071PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000072
Thomas Wouters0e3f5912006-08-11 14:57:12 +000073PyAPI_FUNC(size_t) PyThread_get_stacksize(void);
74PyAPI_FUNC(int) PyThread_set_stacksize(size_t);
75
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020076#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
Victor Stinnerd5c355c2011-04-30 14:53:09 +020077PyAPI_FUNC(PyObject*) PyThread_GetInfo(void);
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020078#endif
Victor Stinner754851f2011-04-19 23:58:51 +020079
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090080
81/* Thread Local Storage (TLS) API
82 TLS API is DEPRECATED. Use Thread Specific Storage (TSS) API.
83
84 The existing TLS API has used int to represent TLS keys across all
85 platforms, but it is not POSIX-compliant. Therefore, the new TSS API uses
86 opaque data type to represent TSS keys to be compatible (see PEP 539).
87*/
88PyAPI_FUNC(int) PyThread_create_key(void) Py_DEPRECATED(3.7);
89PyAPI_FUNC(void) PyThread_delete_key(int key) Py_DEPRECATED(3.7);
90PyAPI_FUNC(int) PyThread_set_key_value(int key, void *value) Py_DEPRECATED(3.7);
91PyAPI_FUNC(void *) PyThread_get_key_value(int key) Py_DEPRECATED(3.7);
92PyAPI_FUNC(void) PyThread_delete_key_value(int key) Py_DEPRECATED(3.7);
Guido van Rossuma027efa1997-05-05 20:56:21 +000093
Benjamin Petersone68df0f2008-06-13 00:26:50 +000094/* Cleanup after a fork */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090095PyAPI_FUNC(void) PyThread_ReInitTLS(void) Py_DEPRECATED(3.7);
96
97
98#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
99/* New in 3.7 */
100/* Thread Specific Storage (TSS) API */
101
102typedef struct _Py_tss_t Py_tss_t; /* opaque */
103
104#ifndef Py_LIMITED_API
105#if defined(_POSIX_THREADS)
106 /* Darwin needs pthread.h to know type name the pthread_key_t. */
107# include <pthread.h>
108# define NATIVE_TSS_KEY_T pthread_key_t
109#elif defined(NT_THREADS)
110 /* In Windows, native TSS key type is DWORD,
111 but hardcode the unsigned long to avoid errors for include directive.
112 */
113# define NATIVE_TSS_KEY_T unsigned long
114#else
115# error "Require native threads. See https://bugs.python.org/issue31370"
116#endif
117
118/* When Py_LIMITED_API is not defined, the type layout of Py_tss_t is
119 exposed to allow static allocation in the API clients. Even in this case,
120 you must handle TSS keys through API functions due to compatibility.
121*/
122struct _Py_tss_t {
123 int _is_initialized;
124 NATIVE_TSS_KEY_T _key;
125};
126
127#undef NATIVE_TSS_KEY_T
128
129/* When static allocation, you must initialize with Py_tss_NEEDS_INIT. */
130#define Py_tss_NEEDS_INIT {0}
131#endif /* !Py_LIMITED_API */
132
133PyAPI_FUNC(Py_tss_t *) PyThread_tss_alloc(void);
134PyAPI_FUNC(void) PyThread_tss_free(Py_tss_t *key);
135
136/* The parameter key must not be NULL. */
137PyAPI_FUNC(int) PyThread_tss_is_created(Py_tss_t *key);
138PyAPI_FUNC(int) PyThread_tss_create(Py_tss_t *key);
139PyAPI_FUNC(void) PyThread_tss_delete(Py_tss_t *key);
140PyAPI_FUNC(int) PyThread_tss_set(Py_tss_t *key, void *value);
141PyAPI_FUNC(void *) PyThread_tss_get(Py_tss_t *key);
142#endif /* New in 3.7 */
Benjamin Petersone68df0f2008-06-13 00:26:50 +0000143
Sjoerd Mullenderd10d8291992-09-11 15:19:27 +0000144#ifdef __cplusplus
145}
146#endif
147
Guido van Rossumd023a781999-03-24 19:02:09 +0000148#endif /* !Py_PYTHREAD_H */