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