| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Missing POSIX RealTime/Monotonic Clock | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-05-15 12:32:16 +02:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2016-06-28 10:20:47 +02:00
										 |  |  | #include <mach/mach_time.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int clock_gettime(int clk_id, struct timespec *t) { | 
					
						
							|  |  |  |     mach_timebase_info_data_t timebase; | 
					
						
							|  |  |  |     mach_timebase_info(&timebase); | 
					
						
							|  |  |  |     uint64_t time; | 
					
						
							|  |  |  |     time = mach_absolute_time(); | 
					
						
							|  |  |  |     double nseconds = ((double)time * (double)timebase.numer)/((double)timebase.denom); | 
					
						
							|  |  |  |     double seconds = ((double)time * (double)timebase.numer)/((double)timebase.denom * 1e9); | 
					
						
							|  |  |  |     t->tv_sec = seconds; | 
					
						
							|  |  |  |     t->tv_nsec = nseconds; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-05-15 12:32:16 +02:00
										 |  |  | */ | 
					
						
							|  |  |  | #endif // APPLE Compatibility
 |