pthread_cond_timedwait() is available under OSX but neither
PTHREAD_CONDATTR_SETPSHARED or pthread_condattr_setpshared are.
Here's a version we can use for any that lack a real pthread_mutex_timedlock():
/*
* A pthread_mutex_timedlock() impl for OSX/macOS, which lacks the
* real thing.
* NOTE: Unlike the real McCoy, won't return EOWNERDEAD, EDEADLK
* or EOWNERDEAD
*/
static int macos_pthread_mutex_timedlock(pthread_mutex_t *mutex, const struct
timespec *abs_timeout)
{
int rv;
struct timespec remaining, slept, ts;
remaining = *abs_timeout;
while ((rv = pthread_mutex_trylock(mutex)) == EBUSY) {
ts.tv_sec = 0;
ts.tv_nsec = (remaining.tv_sec > 0 ? 10000000 :
(remaining.tv_nsec < 10000000 ? remaining.tv_nsec :
10000000));
nanosleep(&ts, &slept);
ts.tv_nsec -= slept.tv_nsec;
if (ts.tv_nsec <= remaining.tv_nsec) {
remaining.tv_nsec -= ts.tv_nsec;
}
else {
remaining.tv_sec--;
remaining.tv_nsec = (1000000 - (ts.tv_nsec - remaining.tv_nsec));
}
if (remaining.tv_sec < 0 || (!remaining.tv_sec && remaining.tv_nsec <=
0)) {
return ETIMEDOUT;
}
}
return rv;
}