113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2021, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  * 2010-10-26     Bernard      the first version
 | |
|  */
 | |
| 
 | |
| #include <pthread.h>
 | |
| 
 | |
| int pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
 | |
| {
 | |
|     if (!attr)
 | |
|         return EINVAL;
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrierattr_destroy);
 | |
| 
 | |
| int pthread_barrierattr_init(pthread_barrierattr_t *attr)
 | |
| {
 | |
|     if (!attr)
 | |
|         return EINVAL;
 | |
|     *attr = PTHREAD_PROCESS_PRIVATE;
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrierattr_init);
 | |
| 
 | |
| int pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
 | |
|                                    int                         *pshared)
 | |
| {
 | |
|     if (!attr)
 | |
|         return EINVAL;
 | |
|     *pshared = (int)*attr;
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrierattr_getpshared);
 | |
| 
 | |
| int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
 | |
| {
 | |
|     if (!attr)
 | |
|         return EINVAL;
 | |
|     if (pshared == PTHREAD_PROCESS_PRIVATE)
 | |
|         attr = PTHREAD_PROCESS_PRIVATE;
 | |
| 
 | |
|     return EINVAL;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrierattr_setpshared);
 | |
| 
 | |
| int pthread_barrier_destroy(pthread_barrier_t *barrier)
 | |
| {
 | |
|     rt_err_t result;
 | |
| 
 | |
|     if (!barrier)
 | |
|         return EINVAL;
 | |
| 
 | |
|     result = pthread_cond_destroy(&(barrier->cond));
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrier_destroy);
 | |
| 
 | |
| int pthread_barrier_init(pthread_barrier_t           *barrier,
 | |
|                          const pthread_barrierattr_t *attr,
 | |
|                          unsigned                     count)
 | |
| {
 | |
|     if (!barrier)
 | |
|         return EINVAL;
 | |
|     if (attr && (*attr != PTHREAD_PROCESS_PRIVATE))
 | |
|         return EINVAL;
 | |
|     if (count == 0)
 | |
|         return EINVAL;
 | |
| 
 | |
|     barrier->count = count;
 | |
|     pthread_cond_init(&(barrier->cond), NULL);
 | |
|     pthread_mutex_init(&(barrier->mutex), NULL);
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrier_init);
 | |
| 
 | |
| int pthread_barrier_wait(pthread_barrier_t *barrier)
 | |
| {
 | |
|     rt_err_t result;
 | |
|     if (!barrier)
 | |
|         return EINVAL;
 | |
| 
 | |
|     result = pthread_mutex_lock(&(barrier->mutex));
 | |
|     if (result != 0)
 | |
|         return EINVAL;
 | |
| 
 | |
|     if (barrier->count == 0)
 | |
|         result = EINVAL;
 | |
|     else
 | |
|     {
 | |
|         barrier->count -= 1;
 | |
|         if (barrier->count == 0) /* broadcast condition */
 | |
|             pthread_cond_broadcast(&(barrier->cond));
 | |
|         else
 | |
|             pthread_cond_wait(&(barrier->cond), &(barrier->mutex));
 | |
|     }
 | |
| 
 | |
|     pthread_mutex_unlock(&(barrier->mutex));
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| RTM_EXPORT(pthread_barrier_wait);
 | |
| 
 |