#include "psem.h" #include #define NANO 1000000000 static struct timespec psem_calc_abs_timeout(const struct timespec *ts) { struct timespec res; struct timespec timeout; if (clock_gettime(CLOCK_REALTIME, &timeout) == -1) err_exit(errno, "clock_gettime"); res.tv_sec = timeout.tv_sec + ts->tv_sec; res.tv_nsec = timeout.tv_nsec + ts->tv_nsec; res.tv_sec = res.tv_sec + floor(res.tv_nsec / NANO); res.tv_nsec = res.tv_nsec % NANO; return res; } int psem_timedwait(sem_t *sem, const struct timespec *ts) { struct timespec abs_timeout = psem_calc_abs_timeout(ts); int rv ; while ( (rv = sem_timedwait(sem, &abs_timeout)) == -1) { if(errno == EINTR) continue; else { // LoggerFactory::getLogger()->error(errno, "LockFreeQueue push_timeout"); return rv; } } return 0; } int psem_wait(sem_t *sem) { int rv; while ( (rv = sem_wait(sem)) == -1) { if(errno == EINTR) continue; else { // LoggerFactory::getLogger()->error(errno, "LockFreeQueue push_timeout"); return rv; } } return 0; } int psem_trywait(sem_t *sem) { return sem_trywait(sem); } int psem_post(sem_t *sem) { return sem_post(sem); }