| 
									
										
										
										
											2016-06-28 10:20:47 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * APPLE Compatibility | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __APPLE__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <pthread.h>
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "apple_compat.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if(count == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         errno = EINVAL; | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if(pthread_mutex_init(&barrier->mutex, 0) < 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if(pthread_cond_init(&barrier->cond, 0) < 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         pthread_mutex_destroy(&barrier->mutex); | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     barrier->tripCount = count; | 
					
						
							|  |  |  |     barrier->count = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pthread_barrier_destroy(pthread_barrier_t *barrier) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     pthread_cond_destroy(&barrier->cond); | 
					
						
							|  |  |  |     pthread_mutex_destroy(&barrier->mutex); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int pthread_barrier_wait(pthread_barrier_t *barrier) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     pthread_mutex_lock(&barrier->mutex); | 
					
						
							|  |  |  |     ++(barrier->count); | 
					
						
							|  |  |  |     if(barrier->count >= barrier->tripCount) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         barrier->count = 0; | 
					
						
							|  |  |  |         pthread_cond_broadcast(&barrier->cond); | 
					
						
							|  |  |  |         pthread_mutex_unlock(&barrier->mutex); | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         pthread_cond_wait(&barrier->cond, &(barrier->mutex)); | 
					
						
							|  |  |  |         pthread_mutex_unlock(&barrier->mutex); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-11 11:14:59 +02:00
										 |  |  | #endif // __APPLE_
 |