xref: /haiku/headers/posix/pthread.h (revision 370602bff6556f6cafc04a67f5a088a2f377eb4b)
145b820ddSAxel Dörfler /*
2a635399bSAxel Dörfler  * Copyright 2001-2008, Haiku Inc. All Rights Reserved.
3a635399bSAxel Dörfler  * Distributed under the terms of the Haiku License.
445b820ddSAxel Dörfler  */
5f924ff50SAxel Dörfler #ifndef _PTHREAD_H_
6f924ff50SAxel Dörfler #define _PTHREAD_H_
7f924ff50SAxel Dörfler 
8945fb7e3SAxel Dörfler 
9*370602bfSIngo Weinhold #include <stdint.h>
10f924ff50SAxel Dörfler #include <time.h>
11f924ff50SAxel Dörfler 
12945fb7e3SAxel Dörfler 
135d2044f6SIngo Weinhold typedef int							pthread_t;
14b7f854b8SJérôme Duval typedef struct  _pthread_attr		*pthread_attr_t;
15b7f854b8SJérôme Duval typedef struct  _pthread_mutex		*pthread_mutex_t;
16b7f854b8SJérôme Duval typedef struct  _pthread_mutexattr	*pthread_mutexattr_t;
17b7f854b8SJérôme Duval typedef struct  _pthread_cond		*pthread_cond_t;
18550a30a0SRyan Leavengood typedef struct  _pthread_condattr	*pthread_condattr_t;
19a00ed9faSJérôme Duval typedef int							pthread_key_t;
20b7f854b8SJérôme Duval typedef struct  _pthread_once		pthread_once_t;
21*370602bfSIngo Weinhold typedef struct  _pthread_rwlock		pthread_rwlock_t;
22*370602bfSIngo Weinhold typedef struct  _pthread_rwlockattr	pthread_rwlockattr_t;
23b7f854b8SJérôme Duval typedef struct  _pthread_barrier	*pthread_barrier_t;
24b7f854b8SJérôme Duval typedef struct  _pthread_barrierattr *pthread_barrierattr_t;
25b7f854b8SJérôme Duval typedef struct  _pthread_spinlock	*pthread_spinlock_t;
26a00ed9faSJérôme Duval 
274ff6af6dSJérôme Duval struct _pthread_once {
28a00ed9faSJérôme Duval 	int	state;
29a00ed9faSJérôme Duval 	pthread_mutex_t mutex;
30a00ed9faSJérôme Duval };
31a00ed9faSJérôme Duval 
32*370602bfSIngo Weinhold struct _pthread_rwlock {
33*370602bfSIngo Weinhold 	uint32_t	flags;
34*370602bfSIngo Weinhold 	int32_t		owner;
35*370602bfSIngo Weinhold 	union {
36*370602bfSIngo Weinhold 		struct {
37*370602bfSIngo Weinhold 			int32_t		sem;
38*370602bfSIngo Weinhold 		} shared;
39*370602bfSIngo Weinhold 		struct {
40*370602bfSIngo Weinhold 			int32_t		lock_sem;
41*370602bfSIngo Weinhold 			int32_t		lock_count;
42*370602bfSIngo Weinhold 			int32_t		reader_count;
43*370602bfSIngo Weinhold 			int32_t		writer_count;
44*370602bfSIngo Weinhold 			void*		waiters[2];
45*370602bfSIngo Weinhold 		} local;
46*370602bfSIngo Weinhold 	};
47*370602bfSIngo Weinhold };
48*370602bfSIngo Weinhold 
49*370602bfSIngo Weinhold struct _pthread_rwlockattr {
50*370602bfSIngo Weinhold 	uint32_t	flags;
51*370602bfSIngo Weinhold };
52f924ff50SAxel Dörfler 
53f924ff50SAxel Dörfler enum pthread_mutex_type {
54f924ff50SAxel Dörfler 	PTHREAD_MUTEX_DEFAULT,
55f924ff50SAxel Dörfler 	PTHREAD_MUTEX_NORMAL,
56f924ff50SAxel Dörfler 	PTHREAD_MUTEX_ERRORCHECK,
57f924ff50SAxel Dörfler 	PTHREAD_MUTEX_RECURSIVE,
58f924ff50SAxel Dörfler };
59f924ff50SAxel Dörfler 
60f924ff50SAxel Dörfler enum pthread_process_shared {
61f924ff50SAxel Dörfler 	PTHREAD_PROCESS_PRIVATE,
62f924ff50SAxel Dörfler 	PTHREAD_PROCESS_SHARED,
63f924ff50SAxel Dörfler };
64f924ff50SAxel Dörfler 
65a00ed9faSJérôme Duval /*
66a00ed9faSJérôme Duval  * Flags for threads and thread attributes.
67a00ed9faSJérôme Duval  */
68a00ed9faSJérôme Duval #define PTHREAD_DETACHED			0x1
69a00ed9faSJérôme Duval #define PTHREAD_SCOPE_SYSTEM		0x2
70a00ed9faSJérôme Duval #define PTHREAD_INHERIT_SCHED		0x4
71a00ed9faSJérôme Duval #define PTHREAD_NOFLOAT				0x8
72f924ff50SAxel Dörfler 
73a00ed9faSJérôme Duval #define PTHREAD_CREATE_DETACHED		PTHREAD_DETACHED
74a00ed9faSJérôme Duval #define PTHREAD_CREATE_JOINABLE		0
75a00ed9faSJérôme Duval #define PTHREAD_SCOPE_PROCESS		0
76a00ed9faSJérôme Duval #define PTHREAD_EXPLICIT_SCHED		0
77f924ff50SAxel Dörfler 
78a00ed9faSJérôme Duval /*
79a00ed9faSJérôme Duval  * Flags for cancelling threads
80a00ed9faSJérôme Duval  */
81a00ed9faSJérôme Duval #define PTHREAD_CANCEL_ENABLE		0
82a00ed9faSJérôme Duval #define PTHREAD_CANCEL_DISABLE		1
83a00ed9faSJérôme Duval #define PTHREAD_CANCEL_DEFERRED		0
84a00ed9faSJérôme Duval #define PTHREAD_CANCEL_ASYNCHRONOUS	2
85a00ed9faSJérôme Duval #define PTHREAD_CANCELED			((void *) 1)
86a00ed9faSJérôme Duval 
87a00ed9faSJérôme Duval #define PTHREAD_NEEDS_INIT			0
88a00ed9faSJérôme Duval #define PTHREAD_DONE_INIT			1
89a00ed9faSJérôme Duval #define PTHREAD_ONCE_INIT 			{ PTHREAD_NEEDS_INIT, NULL }
90a00ed9faSJérôme Duval 
91a00ed9faSJérôme Duval #define PTHREAD_BARRIER_SERIAL_THREAD -1
92a00ed9faSJérôme Duval #define PTHREAD_PRIO_NONE			0
93a00ed9faSJérôme Duval #define PTHREAD_PRIO_INHERIT		1
94a00ed9faSJérôme Duval #define PTHREAD_PRIO_PROTECT		2
95f924ff50SAxel Dörfler 
96b9320128SIngo Weinhold /* extern pthread_mutexattr_t pthread_mutexattr_default; */
97f924ff50SAxel Dörfler 
98a635399bSAxel Dörfler /* private structure */
99a635399bSAxel Dörfler struct __pthread_cleanup_handler {
100a635399bSAxel Dörfler 	struct __pthread_cleanup_handler *previous;
101a635399bSAxel Dörfler 	void	(*function)(void *argument);
102a635399bSAxel Dörfler 	void	*argument;
103a635399bSAxel Dörfler };
104a635399bSAxel Dörfler 
105a635399bSAxel Dörfler #define pthread_cleanup_push(func, arg) \
106a635399bSAxel Dörfler 	do { \
107a635399bSAxel Dörfler 		struct __pthread_cleanup_handler __handler; \
108a635399bSAxel Dörfler 		__handler.function = (func); \
109a635399bSAxel Dörfler 		__handler.argument = (arg); \
110a635399bSAxel Dörfler 		__pthread_cleanup_push_handler(&__handler);
111a635399bSAxel Dörfler 
112a635399bSAxel Dörfler #define pthread_cleanup_pop(execute) \
113a635399bSAxel Dörfler 		if (execute) \
114a635399bSAxel Dörfler 			__handler.function(__handler.argument); \
115a635399bSAxel Dörfler 		__pthread_cleanup_pop_handler(); \
116a635399bSAxel Dörfler 	} while (0)
117a635399bSAxel Dörfler 
118a635399bSAxel Dörfler 
11945b820ddSAxel Dörfler #ifdef __cplusplus
12045b820ddSAxel Dörfler extern "C" {
12145b820ddSAxel Dörfler #endif
12245b820ddSAxel Dörfler 
123f924ff50SAxel Dörfler extern pthread_mutex_t _pthread_mutex_static_initializer(void);
124f924ff50SAxel Dörfler extern pthread_mutex_t _pthread_recursive_mutex_static_initializer(void);
125954f408fSJérôme Duval #define PTHREAD_MUTEX_INITIALIZER NULL
126f924ff50SAxel Dörfler #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER \
127f924ff50SAxel Dörfler 	pthread_recursive_mutex_static_initializer();
128f924ff50SAxel Dörfler 
129550a30a0SRyan Leavengood extern pthread_cond_t _pthread_cond_static_initializer(void);
130550a30a0SRyan Leavengood #define PTHREAD_COND_INITIALIZER _pthread_cond_static_initializer();
131550a30a0SRyan Leavengood 
132f924ff50SAxel Dörfler /* mutex functions */
133f924ff50SAxel Dörfler extern int pthread_mutex_destroy(pthread_mutex_t *mutex);
134945fb7e3SAxel Dörfler extern int pthread_mutex_getprioceiling(pthread_mutex_t *mutex,
135945fb7e3SAxel Dörfler 	int *_priorityCeiling);
136945fb7e3SAxel Dörfler extern int pthread_mutex_init(pthread_mutex_t *mutex,
137945fb7e3SAxel Dörfler 	const pthread_mutexattr_t *attr);
138f924ff50SAxel Dörfler extern int pthread_mutex_lock(pthread_mutex_t *mutex);
139945fb7e3SAxel Dörfler extern int pthread_mutex_setprioceiling(pthread_mutex_t *mutex,
140945fb7e3SAxel Dörfler 	int newPriorityCeiling, int *_oldPriorityCeiling);
141945fb7e3SAxel Dörfler extern int pthread_mutex_timedlock(pthread_mutex_t *mutex,
142945fb7e3SAxel Dörfler 	const struct timespec *spec);
143f924ff50SAxel Dörfler extern int pthread_mutex_trylock(pthread_mutex_t *mutex);
144f924ff50SAxel Dörfler extern int pthread_mutex_unlock(pthread_mutex_t *mutex);
145f924ff50SAxel Dörfler 
146f924ff50SAxel Dörfler /* mutex attribute functions */
147f924ff50SAxel Dörfler extern int pthread_mutexattr_destroy(pthread_mutexattr_t *mutexAttr);
148945fb7e3SAxel Dörfler extern int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mutexAttr,
149945fb7e3SAxel Dörfler 	int *_priorityCeiling);
150945fb7e3SAxel Dörfler extern int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mutexAttr,
151945fb7e3SAxel Dörfler 	int *_protocol);
152945fb7e3SAxel Dörfler extern int pthread_mutexattr_getpshared(pthread_mutexattr_t *mutexAttr,
153945fb7e3SAxel Dörfler 	int *_processShared);
154945fb7e3SAxel Dörfler extern int pthread_mutexattr_gettype(pthread_mutexattr_t *mutexAttr,
155945fb7e3SAxel Dörfler 	int *_type);
156f924ff50SAxel Dörfler extern int pthread_mutexattr_init(pthread_mutexattr_t *mutexAttr);
157945fb7e3SAxel Dörfler extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mutexAttr,
158945fb7e3SAxel Dörfler 	int priorityCeiling);
159945fb7e3SAxel Dörfler extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mutexAttr,
160945fb7e3SAxel Dörfler 	int protocol);
161945fb7e3SAxel Dörfler extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *mutexAttr,
162945fb7e3SAxel Dörfler 	int processShared);
163f924ff50SAxel Dörfler extern int pthread_mutexattr_settype(pthread_mutexattr_t *mutexAttr, int type);
164f924ff50SAxel Dörfler 
165550a30a0SRyan Leavengood /* condition variable functions */
166550a30a0SRyan Leavengood extern int pthread_cond_destroy(pthread_cond_t *cond);
167945fb7e3SAxel Dörfler extern int pthread_cond_init(pthread_cond_t *cond,
168945fb7e3SAxel Dörfler 	const pthread_condattr_t *attr);
169550a30a0SRyan Leavengood extern int pthread_cond_broadcast(pthread_cond_t *cond);
170550a30a0SRyan Leavengood extern int pthread_cond_signal(pthread_cond_t *cond);
171550a30a0SRyan Leavengood extern int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
172550a30a0SRyan Leavengood 	const struct timespec *abstime);
173550a30a0SRyan Leavengood extern int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
174550a30a0SRyan Leavengood 
175550a30a0SRyan Leavengood /* condition variable attribute functions */
176550a30a0SRyan Leavengood extern int pthread_condattr_destroy(pthread_condattr_t *condAttr);
177550a30a0SRyan Leavengood extern int pthread_condattr_init(pthread_condattr_t *condAttr);
178945fb7e3SAxel Dörfler extern int pthread_condattr_getpshared(const pthread_condattr_t *condAttr,
179945fb7e3SAxel Dörfler 	int *processShared);
180945fb7e3SAxel Dörfler extern int pthread_condattr_setpshared(pthread_condattr_t *condAttr,
181945fb7e3SAxel Dörfler 	int processShared);
182550a30a0SRyan Leavengood 
183*370602bfSIngo Weinhold /* rwlock functions */
184*370602bfSIngo Weinhold extern int pthread_rwlock_init(pthread_rwlock_t *lock,
185*370602bfSIngo Weinhold 	const pthread_rwlockattr_t *attr);
186*370602bfSIngo Weinhold extern int pthread_rwlock_destroy(pthread_rwlock_t *lock);
187*370602bfSIngo Weinhold extern int pthread_rwlock_rdlock(pthread_rwlock_t *lock);
188*370602bfSIngo Weinhold extern int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);
189*370602bfSIngo Weinhold extern int pthread_rwlock_timedrdlock(pthread_rwlock_t *lock,
190*370602bfSIngo Weinhold 	const struct timespec *timeout);
191*370602bfSIngo Weinhold extern int pthread_rwlock_wrlock(pthread_rwlock_t *lock);
192*370602bfSIngo Weinhold extern int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);
193*370602bfSIngo Weinhold extern int pthread_rwlock_timedwrlock(pthread_rwlock_t *lock,
194*370602bfSIngo Weinhold 	const struct timespec *timeout);
195*370602bfSIngo Weinhold extern int pthread_rwlock_unlock(pthread_rwlock_t *lock);
196*370602bfSIngo Weinhold 
197*370602bfSIngo Weinhold /* rwlock attribute functions */
198*370602bfSIngo Weinhold extern int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
199*370602bfSIngo Weinhold extern int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
200*370602bfSIngo Weinhold extern int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr,
201*370602bfSIngo Weinhold 	int *shared);
202*370602bfSIngo Weinhold extern int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr,
203*370602bfSIngo Weinhold 	int shared);
204*370602bfSIngo Weinhold 
20545b820ddSAxel Dörfler /* misc. functions */
206945fb7e3SAxel Dörfler extern int pthread_atfork(void (*prepare)(void), void (*parent)(void),
207945fb7e3SAxel Dörfler 	void (*child)(void));
208d2d67247SJérôme Duval extern int pthread_once(pthread_once_t *once_control, void (*init_routine)());
20945b820ddSAxel Dörfler 
210a00ed9faSJérôme Duval /* thread attributes functions */
211a00ed9faSJérôme Duval extern int pthread_attr_destroy(pthread_attr_t *attr);
212a00ed9faSJérôme Duval extern int pthread_attr_init(pthread_attr_t *attr);
213945fb7e3SAxel Dörfler extern int pthread_attr_getdetachstate(const pthread_attr_t *attr,
214945fb7e3SAxel Dörfler 	int *detachstate);
215a00ed9faSJérôme Duval extern int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
216f7cc12b3SIngo Weinhold extern int pthread_attr_getstacksize(const pthread_attr_t *attr,
217f7cc12b3SIngo Weinhold 	size_t *stacksize);
218f7cc12b3SIngo Weinhold extern int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
219f7cc12b3SIngo Weinhold 
220f7cc12b3SIngo Weinhold #if 0	/* Unimplemented attribute functions: */
221f7cc12b3SIngo Weinhold 
222b9320128SIngo Weinhold /* mandatory! */
223f7cc12b3SIngo Weinhold extern int pthread_attr_getschedparam(const pthread_attr_t *attr,
224f7cc12b3SIngo Weinhold 	struct sched_param *param);
225f7cc12b3SIngo Weinhold extern int pthread_attr_setschedparam(pthread_attr_t *attr,
226f7cc12b3SIngo Weinhold 	const struct sched_param *param);
227f7cc12b3SIngo Weinhold 
228b9320128SIngo Weinhold /* [TPS] */
229f7cc12b3SIngo Weinhold extern int pthread_attr_getinheritsched(const pthread_attr_t *attr,
230f7cc12b3SIngo Weinhold 	int *inheritsched);
231f7cc12b3SIngo Weinhold extern int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
232f7cc12b3SIngo Weinhold 
233f7cc12b3SIngo Weinhold extern int pthread_attr_getschedpolicy(const pthread_attr_t *attr,
234f7cc12b3SIngo Weinhold 	int *policy);
235f7cc12b3SIngo Weinhold extern int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
236f7cc12b3SIngo Weinhold extern int pthread_attr_getscope(const pthread_attr_t *attr,
237f7cc12b3SIngo Weinhold 	int *contentionscope);
238f7cc12b3SIngo Weinhold extern int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
239f7cc12b3SIngo Weinhold 
240b9320128SIngo Weinhold /* [XSI] */
241f7cc12b3SIngo Weinhold extern int pthread_attr_getguardsize(const pthread_attr_t *attr,
242f7cc12b3SIngo Weinhold 	size_t *guardsize);
243f7cc12b3SIngo Weinhold extern int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
244f7cc12b3SIngo Weinhold 
245b9320128SIngo Weinhold /* [TSA] */
246f7cc12b3SIngo Weinhold extern int pthread_attr_getstackaddr(const pthread_attr_t *attr,
247f7cc12b3SIngo Weinhold 	void **stackaddr);
248f7cc12b3SIngo Weinhold extern int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
249f7cc12b3SIngo Weinhold 
250b9320128SIngo Weinhold /* [TSA TSS] */
251f7cc12b3SIngo Weinhold extern int pthread_attr_getstack(const pthread_attr_t *attr,
252f7cc12b3SIngo Weinhold 	void **stackaddr, size_t *stacksize);
253f7cc12b3SIngo Weinhold extern int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
254f7cc12b3SIngo Weinhold 
255f7cc12b3SIngo Weinhold #endif	/* 0 */
256f7cc12b3SIngo Weinhold 
257a00ed9faSJérôme Duval 
258c80e6107SAxel Dörfler /* thread functions */
259a00ed9faSJérôme Duval extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
260a00ed9faSJérôme Duval 	void *(*start_routine)(void*), void *arg);
261a00ed9faSJérôme Duval extern int pthread_detach(pthread_t thread);
262a00ed9faSJérôme Duval extern int pthread_equal(pthread_t t1, pthread_t t2);
263a00ed9faSJérôme Duval extern void pthread_exit(void *value_ptr);
264c80e6107SAxel Dörfler extern int pthread_join(pthread_t thread, void **_value);
265a00ed9faSJérôme Duval extern pthread_t pthread_self(void);
266ad6ada0bSJérôme Duval extern int pthread_kill(pthread_t thread, int sig);
267b9fe86d2SAxel Dörfler extern int pthread_getconcurrency(void);
268b9fe86d2SAxel Dörfler extern int pthread_setconcurrency(int newLevel);
269ad6ada0bSJérôme Duval 
270c80e6107SAxel Dörfler extern int pthread_cancel(pthread_t thread);
271c80e6107SAxel Dörfler extern int pthread_setcancelstate(int state, int *_oldState);
272c80e6107SAxel Dörfler extern int pthread_setcanceltype(int type, int *_oldType);
273c80e6107SAxel Dörfler extern void pthread_testcancel(void);
274c80e6107SAxel Dörfler 
2751f11178fSJérôme Duval /* thread specific data functions */
276945fb7e3SAxel Dörfler extern int pthread_key_create(pthread_key_t *key,
277945fb7e3SAxel Dörfler 	void (*destructorFunc)(void*));
2781f11178fSJérôme Duval extern int pthread_key_delete(pthread_key_t key);
2791f11178fSJérôme Duval extern void *pthread_getspecific(pthread_key_t key);
2801f11178fSJérôme Duval extern int pthread_setspecific(pthread_key_t key, const void *value);
2811f11178fSJérôme Duval 
282a635399bSAxel Dörfler /* private functions */
283a635399bSAxel Dörfler extern void __pthread_cleanup_push_handler(
284a635399bSAxel Dörfler 	struct __pthread_cleanup_handler *handler);
285a635399bSAxel Dörfler extern struct __pthread_cleanup_handler *__pthread_cleanup_pop_handler(void);
286a635399bSAxel Dörfler 
28745b820ddSAxel Dörfler #ifdef __cplusplus
28845b820ddSAxel Dörfler }
28945b820ddSAxel Dörfler #endif
29045b820ddSAxel Dörfler 
291f924ff50SAxel Dörfler #endif	/* _PTHREAD_ */
292