xref: /haiku/headers/posix/pthread.h (revision fc1ca2da5cfcb00ffdf791606d5ae97fdd58a638)
1 /*
2  * Copyright 2001-2008, Haiku Inc. All Rights Reserved.
3  * Distributed under the terms of the Haiku License.
4  */
5 #ifndef _PTHREAD_H_
6 #define _PTHREAD_H_
7 
8 
9 #include <time.h>
10 
11 
12 typedef int							pthread_t;
13 typedef struct  _pthread_attr		*pthread_attr_t;
14 typedef struct  _pthread_mutex		*pthread_mutex_t;
15 typedef struct  _pthread_mutexattr	*pthread_mutexattr_t;
16 typedef struct  _pthread_cond		*pthread_cond_t;
17 typedef struct  _pthread_condattr	*pthread_condattr_t;
18 typedef int							pthread_key_t;
19 typedef struct  _pthread_once		pthread_once_t;
20 typedef struct  _pthread_rwlock		*pthread_rwlock_t;
21 typedef struct  _pthread_rwlockattr	*pthread_rwlockattr_t;
22 typedef struct  _pthread_barrier	*pthread_barrier_t;
23 typedef struct  _pthread_barrierattr *pthread_barrierattr_t;
24 typedef struct  _pthread_spinlock	*pthread_spinlock_t;
25 
26 struct _pthread_once {
27 	int	state;
28 	pthread_mutex_t mutex;
29 };
30 
31 
32 enum pthread_mutex_type {
33 	PTHREAD_MUTEX_DEFAULT,
34 	PTHREAD_MUTEX_NORMAL,
35 	PTHREAD_MUTEX_ERRORCHECK,
36 	PTHREAD_MUTEX_RECURSIVE,
37 };
38 
39 enum pthread_process_shared {
40 	PTHREAD_PROCESS_PRIVATE,
41 	PTHREAD_PROCESS_SHARED,
42 };
43 
44 /*
45  * Flags for threads and thread attributes.
46  */
47 #define PTHREAD_DETACHED			0x1
48 #define PTHREAD_SCOPE_SYSTEM		0x2
49 #define PTHREAD_INHERIT_SCHED		0x4
50 #define PTHREAD_NOFLOAT				0x8
51 
52 #define PTHREAD_CREATE_DETACHED		PTHREAD_DETACHED
53 #define PTHREAD_CREATE_JOINABLE		0
54 #define PTHREAD_SCOPE_PROCESS		0
55 #define PTHREAD_EXPLICIT_SCHED		0
56 
57 /*
58  * Flags for cancelling threads
59  */
60 #define PTHREAD_CANCEL_ENABLE		0
61 #define PTHREAD_CANCEL_DISABLE		1
62 #define PTHREAD_CANCEL_DEFERRED		0
63 #define PTHREAD_CANCEL_ASYNCHRONOUS	2
64 #define PTHREAD_CANCELED			((void *) 1)
65 
66 #define PTHREAD_NEEDS_INIT			0
67 #define PTHREAD_DONE_INIT			1
68 #define PTHREAD_ONCE_INIT 			{ PTHREAD_NEEDS_INIT, NULL }
69 
70 #define PTHREAD_BARRIER_SERIAL_THREAD -1
71 #define PTHREAD_PRIO_NONE			0
72 #define PTHREAD_PRIO_INHERIT		1
73 #define PTHREAD_PRIO_PROTECT		2
74 
75 //extern pthread_mutexattr_t pthread_mutexattr_default;
76 
77 /* private structure */
78 struct __pthread_cleanup_handler {
79 	struct __pthread_cleanup_handler *previous;
80 	void	(*function)(void *argument);
81 	void	*argument;
82 };
83 
84 #define pthread_cleanup_push(func, arg) \
85 	do { \
86 		struct __pthread_cleanup_handler __handler; \
87 		__handler.function = (func); \
88 		__handler.argument = (arg); \
89 		__pthread_cleanup_push_handler(&__handler);
90 
91 #define pthread_cleanup_pop(execute) \
92 		if (execute) \
93 			__handler.function(__handler.argument); \
94 		__pthread_cleanup_pop_handler(); \
95 	} while (0)
96 
97 
98 #ifdef __cplusplus
99 extern "C" {
100 #endif
101 
102 extern pthread_mutex_t _pthread_mutex_static_initializer(void);
103 extern pthread_mutex_t _pthread_recursive_mutex_static_initializer(void);
104 #define PTHREAD_MUTEX_INITIALIZER NULL
105 #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER \
106 	pthread_recursive_mutex_static_initializer();
107 
108 extern pthread_cond_t _pthread_cond_static_initializer(void);
109 #define PTHREAD_COND_INITIALIZER _pthread_cond_static_initializer();
110 
111 /* mutex functions */
112 extern int pthread_mutex_destroy(pthread_mutex_t *mutex);
113 extern int pthread_mutex_getprioceiling(pthread_mutex_t *mutex,
114 	int *_priorityCeiling);
115 extern int pthread_mutex_init(pthread_mutex_t *mutex,
116 	const pthread_mutexattr_t *attr);
117 extern int pthread_mutex_lock(pthread_mutex_t *mutex);
118 extern int pthread_mutex_setprioceiling(pthread_mutex_t *mutex,
119 	int newPriorityCeiling, int *_oldPriorityCeiling);
120 extern int pthread_mutex_timedlock(pthread_mutex_t *mutex,
121 	const struct timespec *spec);
122 extern int pthread_mutex_trylock(pthread_mutex_t *mutex);
123 extern int pthread_mutex_unlock(pthread_mutex_t *mutex);
124 
125 /* mutex attribute functions */
126 extern int pthread_mutexattr_destroy(pthread_mutexattr_t *mutexAttr);
127 extern int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mutexAttr,
128 	int *_priorityCeiling);
129 extern int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mutexAttr,
130 	int *_protocol);
131 extern int pthread_mutexattr_getpshared(pthread_mutexattr_t *mutexAttr,
132 	int *_processShared);
133 extern int pthread_mutexattr_gettype(pthread_mutexattr_t *mutexAttr,
134 	int *_type);
135 extern int pthread_mutexattr_init(pthread_mutexattr_t *mutexAttr);
136 extern int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mutexAttr,
137 	int priorityCeiling);
138 extern int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mutexAttr,
139 	int protocol);
140 extern int pthread_mutexattr_setpshared(pthread_mutexattr_t *mutexAttr,
141 	int processShared);
142 extern int pthread_mutexattr_settype(pthread_mutexattr_t *mutexAttr, int type);
143 
144 /* condition variable functions */
145 extern int pthread_cond_destroy(pthread_cond_t *cond);
146 extern int pthread_cond_init(pthread_cond_t *cond,
147 	const pthread_condattr_t *attr);
148 extern int pthread_cond_broadcast(pthread_cond_t *cond);
149 extern int pthread_cond_signal(pthread_cond_t *cond);
150 extern int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
151 	const struct timespec *abstime);
152 extern int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
153 
154 /* condition variable attribute functions */
155 extern int pthread_condattr_destroy(pthread_condattr_t *condAttr);
156 extern int pthread_condattr_init(pthread_condattr_t *condAttr);
157 extern int pthread_condattr_getpshared(const pthread_condattr_t *condAttr,
158 	int *processShared);
159 extern int pthread_condattr_setpshared(pthread_condattr_t *condAttr,
160 	int processShared);
161 
162 /* misc. functions */
163 extern int pthread_atfork(void (*prepare)(void), void (*parent)(void),
164 	void (*child)(void));
165 extern int pthread_once(pthread_once_t *once_control, void (*init_routine)());
166 
167 /* thread attributes functions */
168 extern int pthread_attr_destroy(pthread_attr_t *attr);
169 extern int pthread_attr_init(pthread_attr_t *attr);
170 extern int pthread_attr_getdetachstate(const pthread_attr_t *attr,
171 	int *detachstate);
172 extern int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
173 
174 /* thread functions */
175 extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
176 	void *(*start_routine)(void*), void *arg);
177 extern int pthread_detach(pthread_t thread);
178 extern int pthread_equal(pthread_t t1, pthread_t t2);
179 extern void pthread_exit(void *value_ptr);
180 extern int pthread_join(pthread_t thread, void **_value);
181 extern pthread_t pthread_self(void);
182 extern int pthread_kill(pthread_t thread, int sig);
183 extern int pthread_getconcurrency(void);
184 extern int pthread_setconcurrency(int newLevel);
185 
186 extern int pthread_cancel(pthread_t thread);
187 extern int pthread_setcancelstate(int state, int *_oldState);
188 extern int pthread_setcanceltype(int type, int *_oldType);
189 extern void pthread_testcancel(void);
190 
191 /* thread specific data functions */
192 extern int pthread_key_create(pthread_key_t *key,
193 	void (*destructorFunc)(void*));
194 extern int pthread_key_delete(pthread_key_t key);
195 extern void *pthread_getspecific(pthread_key_t key);
196 extern int pthread_setspecific(pthread_key_t key, const void *value);
197 
198 /* private functions */
199 extern void __pthread_cleanup_push_handler(
200 	struct __pthread_cleanup_handler *handler);
201 extern struct __pthread_cleanup_handler *__pthread_cleanup_pop_handler(void);
202 
203 #ifdef __cplusplus
204 }
205 #endif
206 
207 #endif	/* _PTHREAD_ */
208