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