RocketLogger  1.0
sem.c
Go to the documentation of this file.
1 
5 #include "sem.h"
6 
11 int create_sem(void) {
12  int sem_id = semget(SEM_KEY, NUM_SEMS, IPC_CREAT | S_IRWXU);
13  if(sem_id < 0) {
14  rl_log(ERROR, "failed to create semaphores. Errno = %d", errno);
15  }
16  return sem_id;
17 }
18 
24 int remove_sem(int sem_id) {
25  // remove semaphores
26  if(semctl(sem_id, DATA_SEM, IPC_RMID) < 0) {
27  rl_log(ERROR, "failed to remove semaphores. Errno = %d", errno);
28  return FAILURE;
29  }
30  return SUCCESS;
31 }
32 
37 int open_sem(void) {
38  int sem_id = semget(SEM_KEY, NUM_SEMS, S_IRWXU);
39  if(sem_id < 0) {
40  rl_log(ERROR, "failed to open semaphores. Errno = %d", errno);
41  }
42  return sem_id;
43 }
44 
52 int wait_sem(int sem_id, int sem_num, int time_out) {
53  // operation on semaphore
54  int num_ops = 1;
55  int sem_op = -1;
56  struct sembuf sem_ops = {sem_num, sem_op, NO_FLAG};
57  struct timespec t_out = {time_out, 0};
58 
59  if(semtimedop(sem_id, &sem_ops, num_ops, &t_out) < 0) {
60  if(errno == EAGAIN) {
61  rl_log(WARNING, "time-out waiting on semaphore");
62  return TIME_OUT;
63  } else if(errno == EIDRM) {
64  rl_log(INFO, "waiting on semaphore failed: semaphore removed");
65  return TIME_OUT;
66  } else if(errno == EINVAL) {
67  rl_log(WARNING, "waiting on semaphore failed: semaphore not existing");
68  return FAILURE;
69  } else {
70  rl_log(ERROR, "failed doing operation on semaphore. Errno = %d", errno);
71  return FAILURE;
72  }
73  }
74 
75  return SUCCESS;
76 }
77 
85 int set_sem(int sem_id, int sem_num, int val) {
86  // operation on semaphore
87  int num_ops = 1;
88  int sem_op = val;
89  struct sembuf sem_ops = {sem_num, sem_op, NO_FLAG};
90  struct timespec time_out = {SEM_SET_TIME_OUT, 0};
91 
92  if(semtimedop(sem_id, &sem_ops, num_ops, &time_out) < 0) {
93  if(errno == EAGAIN) {
94  rl_log(ERROR, "time-out waiting on semaphore");
95  return TIME_OUT;
96  } else {
97  rl_log(ERROR, "failed doing operation on semaphore. Errno = %d", errno);
98  return FAILURE;
99  }
100  }
101 
102  return SUCCESS;
103 }
#define TIME_OUT
Definition: types.h:52
int create_sem(void)
Definition: sem.c:11
#define FAILURE
Definition: types.h:53
#define SUCCESS
Definition: types.h:50
int open_sem(void)
Definition: sem.c:37
#define NUM_SEMS
Number of semaphores in set.
Definition: types.h:264
void rl_log(rl_log_type type, const char *format,...)
Definition: log.c:12
#define SEM_KEY
Semaphore key (used for set creation)
Definition: types.h:262
int set_sem(int sem_id, int sem_num, int val)
Definition: sem.c:85
int wait_sem(int sem_id, int sem_num, int time_out)
Definition: sem.c:52
int sem_id
ID of semaphore set.
Definition: rl_server.c:24
#define DATA_SEM
Number of data semaphore in set (manages access to shared memory data)
Definition: types.h:273
int remove_sem(int sem_id)
Definition: sem.c:24
Warning.
Definition: types.h:168
#define NO_FLAG
No flag.
Definition: types.h:278
Error.
Definition: types.h:167
Information.
Definition: types.h:169
#define SEM_SET_TIME_OUT
Time out time in seconds, waiting on semaphore value set.
Definition: types.h:270