xref: /nrf52832-nimble/rt-thread/components/libc/pthreads/pthread_barrier.c (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2010-10-26     Bernard      the first version
9  */
10 
11 #include <pthread.h>
12 
pthread_barrierattr_destroy(pthread_barrierattr_t * attr)13 int pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
14 {
15     if (!attr)
16         return EINVAL;
17 
18     return 0;
19 }
20 RTM_EXPORT(pthread_barrierattr_destroy);
21 
pthread_barrierattr_init(pthread_barrierattr_t * attr)22 int pthread_barrierattr_init(pthread_barrierattr_t *attr)
23 {
24     if (!attr)
25         return EINVAL;
26     *attr = PTHREAD_PROCESS_PRIVATE;
27 
28     return 0;
29 }
30 RTM_EXPORT(pthread_barrierattr_init);
31 
pthread_barrierattr_getpshared(const pthread_barrierattr_t * attr,int * pshared)32 int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
33                                    int                         *pshared)
34 {
35     if (!attr)
36         return EINVAL;
37     *pshared = (int)*attr;
38 
39     return 0;
40 }
41 RTM_EXPORT(pthread_barrierattr_getpshared);
42 
pthread_barrierattr_setpshared(pthread_barrierattr_t * attr,int pshared)43 int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
44 {
45     if (!attr)
46         return EINVAL;
47     if (pshared == PTHREAD_PROCESS_PRIVATE)
48         attr = PTHREAD_PROCESS_PRIVATE;
49 
50     return EINVAL;
51 }
52 RTM_EXPORT(pthread_barrierattr_setpshared);
53 
pthread_barrier_destroy(pthread_barrier_t * barrier)54 int pthread_barrier_destroy(pthread_barrier_t *barrier)
55 {
56     rt_err_t result;
57 
58     if (!barrier)
59         return EINVAL;
60 
61     result = pthread_cond_destroy(&(barrier->cond));
62 
63     return result;
64 }
65 RTM_EXPORT(pthread_barrier_destroy);
66 
pthread_barrier_init(pthread_barrier_t * barrier,const pthread_barrierattr_t * attr,unsigned count)67 int pthread_barrier_init(pthread_barrier_t           *barrier,
68                          const pthread_barrierattr_t *attr,
69                          unsigned                     count)
70 {
71     if (!barrier)
72         return EINVAL;
73     if (attr && (*attr != PTHREAD_PROCESS_PRIVATE))
74         return EINVAL;
75 
76     barrier->count = count;
77     pthread_cond_init(&(barrier->cond), NULL);
78     pthread_mutex_init(&(barrier->mutex), NULL);
79 
80     return 0;
81 }
82 RTM_EXPORT(pthread_barrier_init);
83 
pthread_barrier_wait(pthread_barrier_t * barrier)84 int pthread_barrier_wait(pthread_barrier_t *barrier)
85 {
86     rt_err_t result;
87     if (!barrier)
88         return EINVAL;
89 
90     result = pthread_mutex_lock(&(barrier->mutex));
91     if (result != 0)
92         return EINVAL;
93 
94     if (barrier->count == 0)
95         result = EINVAL;
96     else
97     {
98         barrier->count -= 1;
99         if (barrier->count == 0) /* broadcast condition */
100             pthread_cond_broadcast(&(barrier->cond));
101         else
102             pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
103     }
104 
105     pthread_mutex_unlock(&(barrier->mutex));
106 
107     return result;
108 }
109 RTM_EXPORT(pthread_barrier_wait);
110 
111