wangzhengquan
2021-02-05 e15d6fe15898caab7180b2065fea3382ecabd3e0
src/psem.cpp
@@ -1,51 +1,36 @@
#include "psem.h"
#include <semaphore.h>
#include "time_util.h"
#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;
   struct timespec abs_timeout = TimeUtil::calc_abs_time(ts);
  return sem_timedwait(sem, &abs_timeout);
  // int rv ;
  // while ( (rv = sem_timedwait(sem, &abs_timeout)) == -1) {
  //     if(errno == EINTR)
  //         continue;
  //     else {
  //        // LoggerFactory::getLogger()->error(errno, "LockFreeQueue push_timeout");
  //        return -1;
  //     }
  // }
  // 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;
  return sem_wait(sem);
  // int rv;
  // while ( (rv = sem_wait(sem)) == -1) {
  //     if(errno == EINTR)
  //         continue;
  //     else {
  //        return -1;
  //     }
  // }
  // return 0;
}
int psem_trywait(sem_t *sem) {