xref: /nrf52832-nimble/rt-thread/components/libc/pthreads/pthread.h (revision 104654410c56c573564690304ae786df310c91fc)
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