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 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 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 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 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 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 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 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