mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-23 08:28:36 -05:00
80 lines
1.8 KiB
C
80 lines
1.8 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;
|
|
}
|
|
}
|
|
|
|
#ifdef _DARWIN_FEATURE_CLOCK_GETTIME
|
|
/**
|
|
* 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
|
|
|
|
#endif // APPLE Compatibility
|