1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2010-10-26 Bernard the first version
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #ifndef __PTHREAD_H__
12*10465441SEvalZero #define __PTHREAD_H__
13*10465441SEvalZero
14*10465441SEvalZero #include <rtthread.h>
15*10465441SEvalZero
16*10465441SEvalZero #ifdef __cplusplus
17*10465441SEvalZero extern "C" {
18*10465441SEvalZero #endif
19*10465441SEvalZero
20*10465441SEvalZero #include <posix_types.h>
21*10465441SEvalZero #include <sched.h>
22*10465441SEvalZero
23*10465441SEvalZero #define PTHREAD_KEY_MAX 8
24*10465441SEvalZero
25*10465441SEvalZero #define PTHREAD_COND_INITIALIZER {-1, 0}
26*10465441SEvalZero #define PTHREAD_RWLOCK_INITIALIZER {-1, 0}
27*10465441SEvalZero #define PTHREAD_MUTEX_INITIALIZER {-1, 0}
28*10465441SEvalZero
29*10465441SEvalZero #define PTHREAD_CREATE_JOINABLE 0x00
30*10465441SEvalZero #define PTHREAD_CREATE_DETACHED 0x01
31*10465441SEvalZero
32*10465441SEvalZero #define PTHREAD_EXPLICIT_SCHED 0
33*10465441SEvalZero #define PTHREAD_INHERIT_SCHED 1
34*10465441SEvalZero
35*10465441SEvalZero typedef rt_thread_t pthread_t;
36*10465441SEvalZero typedef long pthread_condattr_t;
37*10465441SEvalZero typedef long pthread_rwlockattr_t;
38*10465441SEvalZero typedef long pthread_mutexattr_t;
39*10465441SEvalZero typedef long pthread_barrierattr_t;
40*10465441SEvalZero
41*10465441SEvalZero typedef int pthread_key_t;
42*10465441SEvalZero typedef int pthread_once_t;
43*10465441SEvalZero
44*10465441SEvalZero enum
45*10465441SEvalZero {
46*10465441SEvalZero PTHREAD_CANCEL_ASYNCHRONOUS = 0,
47*10465441SEvalZero PTHREAD_CANCEL_ENABLE,
48*10465441SEvalZero PTHREAD_CANCEL_DEFERRED,
49*10465441SEvalZero PTHREAD_CANCEL_DISABLE,
50*10465441SEvalZero PTHREAD_CANCELED
51*10465441SEvalZero };
52*10465441SEvalZero
53*10465441SEvalZero enum
54*10465441SEvalZero {
55*10465441SEvalZero PTHREAD_MUTEX_NORMAL = 0,
56*10465441SEvalZero PTHREAD_MUTEX_RECURSIVE = 1,
57*10465441SEvalZero PTHREAD_MUTEX_ERRORCHECK = 2,
58*10465441SEvalZero PTHREAD_MUTEX_ERRORCHECK_NP = PTHREAD_MUTEX_ERRORCHECK,
59*10465441SEvalZero PTHREAD_MUTEX_RECURSIVE_NP = PTHREAD_MUTEX_RECURSIVE,
60*10465441SEvalZero PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
61*10465441SEvalZero };
62*10465441SEvalZero
63*10465441SEvalZero /* init value for pthread_once_t */
64*10465441SEvalZero #define PTHREAD_ONCE_INIT 0
65*10465441SEvalZero
66*10465441SEvalZero enum
67*10465441SEvalZero {
68*10465441SEvalZero PTHREAD_PRIO_INHERIT =0,
69*10465441SEvalZero PTHREAD_PRIO_NONE,
70*10465441SEvalZero PTHREAD_PRIO_PROTECT,
71*10465441SEvalZero };
72*10465441SEvalZero
73*10465441SEvalZero #define PTHREAD_PROCESS_PRIVATE 0
74*10465441SEvalZero #define PTHREAD_PROCESS_SHARED 1
75*10465441SEvalZero
76*10465441SEvalZero #define PTHREAD_SCOPE_PROCESS 0
77*10465441SEvalZero #define PTHREAD_SCOPE_SYSTEM 1
78*10465441SEvalZero
79*10465441SEvalZero struct pthread_attr
80*10465441SEvalZero {
81*10465441SEvalZero void* stack_base;
82*10465441SEvalZero rt_uint32_t stack_size; /* stack size of thread */
83*10465441SEvalZero
84*10465441SEvalZero rt_uint8_t priority; /* priority of thread */
85*10465441SEvalZero rt_uint8_t detachstate; /* detach state */
86*10465441SEvalZero rt_uint8_t policy; /* scheduler policy */
87*10465441SEvalZero rt_uint8_t inheritsched; /* Inherit parent prio/policy */
88*10465441SEvalZero };
89*10465441SEvalZero typedef struct pthread_attr pthread_attr_t;
90*10465441SEvalZero
91*10465441SEvalZero struct pthread_mutex
92*10465441SEvalZero {
93*10465441SEvalZero pthread_mutexattr_t attr;
94*10465441SEvalZero struct rt_mutex lock;
95*10465441SEvalZero };
96*10465441SEvalZero typedef struct pthread_mutex pthread_mutex_t;
97*10465441SEvalZero
98*10465441SEvalZero struct pthread_cond
99*10465441SEvalZero {
100*10465441SEvalZero pthread_condattr_t attr;
101*10465441SEvalZero struct rt_semaphore sem;
102*10465441SEvalZero };
103*10465441SEvalZero typedef struct pthread_cond pthread_cond_t;
104*10465441SEvalZero
105*10465441SEvalZero struct pthread_rwlock
106*10465441SEvalZero {
107*10465441SEvalZero pthread_rwlockattr_t attr;
108*10465441SEvalZero
109*10465441SEvalZero pthread_mutex_t rw_mutex; /* basic lock on this struct */
110*10465441SEvalZero pthread_cond_t rw_condreaders; /* for reader threads waiting */
111*10465441SEvalZero pthread_cond_t rw_condwriters; /* for writer threads waiting */
112*10465441SEvalZero
113*10465441SEvalZero int rw_nwaitreaders; /* the number of reader threads waiting */
114*10465441SEvalZero int rw_nwaitwriters; /* the number of writer threads waiting */
115*10465441SEvalZero int rw_refcount; /* 0: unlocked, -1: locked by writer, > 0 locked by n readers */
116*10465441SEvalZero };
117*10465441SEvalZero typedef struct pthread_rwlock pthread_rwlock_t;
118*10465441SEvalZero
119*10465441SEvalZero /* spinlock implementation, (ADVANCED REALTIME THREADS)*/
120*10465441SEvalZero struct pthread_spinlock
121*10465441SEvalZero {
122*10465441SEvalZero int lock;
123*10465441SEvalZero };
124*10465441SEvalZero typedef struct pthread_spinlock pthread_spinlock_t;
125*10465441SEvalZero
126*10465441SEvalZero struct pthread_barrier
127*10465441SEvalZero {
128*10465441SEvalZero int count;
129*10465441SEvalZero pthread_cond_t cond;
130*10465441SEvalZero pthread_mutex_t mutex;
131*10465441SEvalZero };
132*10465441SEvalZero typedef struct pthread_barrier pthread_barrier_t;
133*10465441SEvalZero
134*10465441SEvalZero struct sched_param
135*10465441SEvalZero {
136*10465441SEvalZero int sched_priority;
137*10465441SEvalZero };
138*10465441SEvalZero
139*10465441SEvalZero /* pthread thread interface */
140*10465441SEvalZero int pthread_attr_destroy(pthread_attr_t *attr);
141*10465441SEvalZero int pthread_attr_init(pthread_attr_t *attr);
142*10465441SEvalZero int pthread_attr_setdetachstate(pthread_attr_t *attr, int state);
143*10465441SEvalZero int pthread_attr_getdetachstate(pthread_attr_t const *attr, int *state);
144*10465441SEvalZero int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
145*10465441SEvalZero int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy);
146*10465441SEvalZero int pthread_attr_setschedparam(pthread_attr_t *attr,struct sched_param const *param);
147*10465441SEvalZero int pthread_attr_getschedparam(pthread_attr_t const *attr,struct sched_param *param);
148*10465441SEvalZero int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size);
149*10465441SEvalZero int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size);
150*10465441SEvalZero int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr);
151*10465441SEvalZero int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr);
152*10465441SEvalZero int pthread_attr_setstack(pthread_attr_t *attr,
153*10465441SEvalZero void *stack_base,
154*10465441SEvalZero size_t stack_size);
155*10465441SEvalZero int pthread_attr_getstack(pthread_attr_t const *attr,
156*10465441SEvalZero void **stack_base,
157*10465441SEvalZero size_t *stack_size);
158*10465441SEvalZero int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard_size);
159*10465441SEvalZero int pthread_attr_getguardsize(pthread_attr_t const *attr, size_t *guard_size);
160*10465441SEvalZero int pthread_attr_setscope(pthread_attr_t *attr, int scope);
161*10465441SEvalZero int pthread_attr_getscope(pthread_attr_t const *attr);
162*10465441SEvalZero int pthread_system_init(void);
163*10465441SEvalZero int pthread_create (pthread_t *tid, const pthread_attr_t *attr,
164*10465441SEvalZero void *(*start) (void *), void *arg);
165*10465441SEvalZero
166*10465441SEvalZero int pthread_detach (pthread_t thread);
167*10465441SEvalZero int pthread_join (pthread_t thread, void **value_ptr);
168*10465441SEvalZero
pthread_equal(pthread_t t1,pthread_t t2)169*10465441SEvalZero rt_inline int pthread_equal (pthread_t t1, pthread_t t2)
170*10465441SEvalZero {
171*10465441SEvalZero return t1 == t2;
172*10465441SEvalZero }
173*10465441SEvalZero
pthread_self(void)174*10465441SEvalZero rt_inline pthread_t pthread_self (void)
175*10465441SEvalZero {
176*10465441SEvalZero return rt_thread_self();
177*10465441SEvalZero }
178*10465441SEvalZero
179*10465441SEvalZero void pthread_exit (void *value_ptr);
180*10465441SEvalZero int pthread_once(pthread_once_t * once_control, void (*init_routine) (void));
181*10465441SEvalZero
182*10465441SEvalZero /* pthread cleanup */
183*10465441SEvalZero void pthread_cleanup_pop(int execute);
184*10465441SEvalZero void pthread_cleanup_push(void (*routine)(void*), void *arg);
185*10465441SEvalZero
186*10465441SEvalZero /* pthread cancel */
187*10465441SEvalZero int pthread_cancel(pthread_t thread);
188*10465441SEvalZero void pthread_testcancel(void);
189*10465441SEvalZero int pthread_setcancelstate(int state, int *oldstate);
190*10465441SEvalZero int pthread_setcanceltype(int type, int *oldtype);
191*10465441SEvalZero
192*10465441SEvalZero int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
193*10465441SEvalZero int pthread_kill(pthread_t thread, int sig);
194*10465441SEvalZero
195*10465441SEvalZero /* pthread mutex interface */
196*10465441SEvalZero int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
197*10465441SEvalZero int pthread_mutex_destroy(pthread_mutex_t *mutex);
198*10465441SEvalZero int pthread_mutex_lock(pthread_mutex_t *mutex);
199*10465441SEvalZero int pthread_mutex_unlock(pthread_mutex_t *mutex);
200*10465441SEvalZero int pthread_mutex_trylock(pthread_mutex_t *mutex);
201*10465441SEvalZero
202*10465441SEvalZero int pthread_mutexattr_init(pthread_mutexattr_t *attr);
203*10465441SEvalZero int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
204*10465441SEvalZero int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
205*10465441SEvalZero int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
206*10465441SEvalZero int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
207*10465441SEvalZero int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr, int *pshared);
208*10465441SEvalZero
209*10465441SEvalZero /* pthread condition interface */
210*10465441SEvalZero int pthread_condattr_destroy(pthread_condattr_t *attr);
211*10465441SEvalZero int pthread_condattr_init(pthread_condattr_t *attr);
212*10465441SEvalZero
213*10465441SEvalZero /* ADVANCED REALTIME feature in IEEE Std 1003.1, 2004 Edition */
214*10465441SEvalZero int pthread_condattr_getclock(const pthread_condattr_t *attr,
215*10465441SEvalZero clockid_t *clock_id);
216*10465441SEvalZero int pthread_condattr_setclock(pthread_condattr_t *attr,
217*10465441SEvalZero clockid_t clock_id);
218*10465441SEvalZero
219*10465441SEvalZero int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
220*10465441SEvalZero int pthread_cond_destroy(pthread_cond_t *cond);
221*10465441SEvalZero int pthread_cond_broadcast(pthread_cond_t *cond);
222*10465441SEvalZero int pthread_cond_signal(pthread_cond_t *cond);
223*10465441SEvalZero
224*10465441SEvalZero int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
225*10465441SEvalZero int pthread_cond_timedwait(pthread_cond_t *cond,
226*10465441SEvalZero pthread_mutex_t *mutex,
227*10465441SEvalZero const struct timespec *abstime);
228*10465441SEvalZero
229*10465441SEvalZero /* pthread rwlock interface */
230*10465441SEvalZero int pthread_rwlockattr_init (pthread_rwlockattr_t *attr);
231*10465441SEvalZero int pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr);
232*10465441SEvalZero int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared);
233*10465441SEvalZero int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);
234*10465441SEvalZero
235*10465441SEvalZero int pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
236*10465441SEvalZero int pthread_rwlock_destroy (pthread_rwlock_t *rwlock);
237*10465441SEvalZero
238*10465441SEvalZero int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock);
239*10465441SEvalZero int pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock);
240*10465441SEvalZero
241*10465441SEvalZero int pthread_rwlock_timedrdlock (pthread_rwlock_t *rwlock, const struct timespec *abstime);
242*10465441SEvalZero int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, const struct timespec *abstime);
243*10465441SEvalZero
244*10465441SEvalZero int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);
245*10465441SEvalZero
246*10465441SEvalZero int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock);
247*10465441SEvalZero int pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock);
248*10465441SEvalZero
249*10465441SEvalZero /* pthread spinlock interface */
250*10465441SEvalZero int pthread_spin_init (pthread_spinlock_t *lock, int pshared);
251*10465441SEvalZero int pthread_spin_destroy (pthread_spinlock_t *lock);
252*10465441SEvalZero
253*10465441SEvalZero int pthread_spin_lock (pthread_spinlock_t * lock);
254*10465441SEvalZero int pthread_spin_trylock (pthread_spinlock_t * lock);
255*10465441SEvalZero int pthread_spin_unlock (pthread_spinlock_t * lock);
256*10465441SEvalZero
257*10465441SEvalZero /* pthread barrier interface */
258*10465441SEvalZero int pthread_barrierattr_destroy(pthread_barrierattr_t *attr);
259*10465441SEvalZero int pthread_barrierattr_init(pthread_barrierattr_t *attr);
260*10465441SEvalZero int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr, int *pshared);
261*10465441SEvalZero int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared);
262*10465441SEvalZero
263*10465441SEvalZero int pthread_barrier_destroy(pthread_barrier_t *barrier);
264*10465441SEvalZero int pthread_barrier_init(pthread_barrier_t *barrier,
265*10465441SEvalZero const pthread_barrierattr_t *attr,
266*10465441SEvalZero unsigned count);
267*10465441SEvalZero
268*10465441SEvalZero int pthread_barrier_wait(pthread_barrier_t *barrier);
269*10465441SEvalZero
270*10465441SEvalZero #ifdef __cplusplus
271*10465441SEvalZero }
272*10465441SEvalZero #endif
273*10465441SEvalZero
274*10465441SEvalZero #endif
275