mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * 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
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // APPLE Compatibility
							 |