RocketLogger  1.1
sem.c
Go to the documentation of this file.
1 
31 #define _GNU_SOURCE
32 
33 #include <fcntl.h>
34 
35 #include <sys/ipc.h>
36 #include <sys/sem.h>
37 #include <sys/types.h>
38 
39 #include "sem.h"
40 
45 int create_sem(key_t key, int num_sems) {
46  int sem_id = semget(key, num_sems, IPC_CREAT | S_IRWXU);
47  if (sem_id < 0) {
48  rl_log(ERROR, "failed to create semaphores. Errno = %d", errno);
49  }
50  return sem_id;
51 }
52 
58 int remove_sem(int sem_id) {
59  // remove semaphores
60  if (semctl(sem_id, 0, IPC_RMID) < 0) {
61  rl_log(ERROR, "failed to remove semaphores. Errno = %d", errno);
62  return FAILURE;
63  }
64  return SUCCESS;
65 }
66 
71 int open_sem(key_t key, int num_sems) {
72  int sem_id = semget(key, num_sems, S_IRWXU);
73  if (sem_id < 0) {
74  rl_log(ERROR, "failed to open semaphores. Errno = %d", errno);
75  }
76  return sem_id;
77 }
78 
87 int wait_sem(int sem_id, int sem_num, int time_out) {
88  // operation on semaphore
89  int num_ops = 1;
90  int sem_op = -1;
91  struct sembuf sem_ops = {sem_num, sem_op, NO_FLAG};
92  struct timespec t_out = {time_out, 0};
93 
94  if (semtimedop(sem_id, &sem_ops, num_ops, &t_out) < 0) {
95  if (errno == EAGAIN) {
96  rl_log(WARNING, "time-out waiting on semaphore");
97  return TIME_OUT;
98  } else if (errno == EIDRM) {
99  rl_log(INFO, "waiting on semaphore failed: semaphore removed");
100  return TIME_OUT;
101  } else if (errno == EINVAL) {
102  rl_log(WARNING,
103  "waiting on semaphore failed: semaphore not existing");
104  return FAILURE;
105  } else {
106  rl_log(ERROR, "failed doing operation on semaphore. Errno = %d",
107  errno);
108  return FAILURE;
109  }
110  }
111 
112  return SUCCESS;
113 }
114 
123 int set_sem(int sem_id, int sem_num, int val) {
124  // operation on semaphore
125  int num_ops = 1;
126  int sem_op = val;
127  struct sembuf sem_ops = {sem_num, sem_op, NO_FLAG};
128  struct timespec time_out = {SEM_SET_TIME_OUT, 0};
129 
130  if (semtimedop(sem_id, &sem_ops, num_ops, &time_out) < 0) {
131  if (errno == EAGAIN) {
132  rl_log(ERROR, "time-out waiting on semaphore");
133  return TIME_OUT;
134  } else {
135  rl_log(ERROR, "failed doing operation on semaphore. Errno = %d",
136  errno);
137  return FAILURE;
138  }
139  }
140 
141  return SUCCESS;
142 }
#define TIME_OUT
Definition: types.h:76
int open_sem(key_t key, int num_sems)
Definition: sem.c:71
#define FAILURE
Definition: types.h:77
#define SUCCESS
Definition: types.h:74
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:38
int set_sem(int sem_id, int sem_num, int val)
Definition: sem.c:123
int wait_sem(int sem_id, int sem_num, int time_out)
Definition: sem.c:87
int sem_id
ID of semaphore set.
Definition: rl_server.c:52
int create_sem(key_t key, int num_sems)
Definition: sem.c:45
int remove_sem(int sem_id)
Definition: sem.c:58
Warning.
Definition: types.h:200
#define NO_FLAG
No flag.
Definition: types.h:328
Error.
Definition: types.h:199
Information.
Definition: types.h:201
#define SEM_SET_TIME_OUT
Time out time in seconds, waiting on semaphore value set.
Definition: types.h:319