blob: 88c4873a557cf76692a3182ef3b4cb2fa8fa3b31 [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
Mark Hammond91a681d2002-08-12 07:21:58 +000020PyAPI_FUNC(void) PyThread_init_thread(void);
21PyAPI_FUNC(long) PyThread_start_new_thread(void (*)(void *), void *);
22PyAPI_FUNC(void) PyThread_exit_thread(void);
Mark Hammond91a681d2002-08-12 07:21:58 +000023PyAPI_FUNC(long) PyThread_get_thread_ident(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000024
Mark Hammond91a681d2002-08-12 07:21:58 +000025PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void);
26PyAPI_FUNC(void) PyThread_free_lock(PyThread_type_lock);
27PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000028#define WAIT_LOCK 1
29#define NOWAIT_LOCK 0
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000030
31/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting
32 on a lock (see PyThread_acquire_lock_timed() below).
33 PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that
34 type, and depends on the system threading API.
Victor Stinner754851f2011-04-19 23:58:51 +020035
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000036 NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread
37 module exposes a higher-level API, with timeouts expressed in seconds
38 and floating-point numbers allowed.
39*/
Benjamin Petersonaf580df2016-09-06 10:46:49 -070040#define PY_TIMEOUT_T long long
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000041#define PY_TIMEOUT_MAX PY_LLONG_MAX
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000042
43/* In the NT API, the timeout is a DWORD and is expressed in milliseconds */
44#if defined (NT_THREADS)
Benjamin Petersonac965ca2016-09-18 18:12:21 -070045#if 0xFFFFFFFFLL * 1000 < PY_TIMEOUT_MAX
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000046#undef PY_TIMEOUT_MAX
Benjamin Petersonac965ca2016-09-18 18:12:21 -070047#define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000)
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000048#endif
49#endif
50
51/* If microseconds == 0, the call is non-blocking: it returns immediately
52 even when the lock can't be acquired.
53 If microseconds > 0, the call waits up to the specified duration.
54 If microseconds < 0, the call waits until success (or abnormal failure)
Antoine Pitrou810023d2010-12-15 22:59:16 +000055
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000056 microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is
Antoine Pitrou810023d2010-12-15 22:59:16 +000057 undefined.
58
59 If intr_flag is true and the acquire is interrupted by a signal, then the
60 call will return PY_LOCK_INTR. The caller may reattempt to acquire the
61 lock.
62*/
63PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed(PyThread_type_lock,
64 PY_TIMEOUT_T microseconds,
65 int intr_flag);
66
Mark Hammond91a681d2002-08-12 07:21:58 +000067PyAPI_FUNC(void) PyThread_release_lock(PyThread_type_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000068
Thomas Wouters0e3f5912006-08-11 14:57:12 +000069PyAPI_FUNC(size_t) PyThread_get_stacksize(void);
70PyAPI_FUNC(int) PyThread_set_stacksize(size_t);
71
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020072#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000
Victor Stinnerd5c355c2011-04-30 14:53:09 +020073PyAPI_FUNC(PyObject*) PyThread_GetInfo(void);
Serhiy Storchaka34d0ac82016-12-27 14:57:39 +020074#endif
Victor Stinner754851f2011-04-19 23:58:51 +020075
Mark Hammond8d98d2c2003-04-19 15:41:53 +000076/* Thread Local Storage (TLS) API */
Mark Hammond91a681d2002-08-12 07:21:58 +000077PyAPI_FUNC(int) PyThread_create_key(void);
78PyAPI_FUNC(void) PyThread_delete_key(int);
79PyAPI_FUNC(int) PyThread_set_key_value(int, void *);
80PyAPI_FUNC(void *) PyThread_get_key_value(int);
Mark Hammond8d98d2c2003-04-19 15:41:53 +000081PyAPI_FUNC(void) PyThread_delete_key_value(int key);
Guido van Rossuma027efa1997-05-05 20:56:21 +000082
Benjamin Petersone68df0f2008-06-13 00:26:50 +000083/* Cleanup after a fork */
84PyAPI_FUNC(void) PyThread_ReInitTLS(void);
85
Sjoerd Mullenderd10d8291992-09-11 15:19:27 +000086#ifdef __cplusplus
87}
88#endif
89
Guido van Rossumd023a781999-03-24 19:02:09 +000090#endif /* !Py_PYTHREAD_H */