wangzhengquan
2021-01-21 4fd62552d8277f3d0ed20e66663cd219c36796df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "psem.h"
#include <semaphore.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;
}
 
 
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);
}