24#include <core/exceptions/system.h>
28#include <utils/ipc/sem_exceptions.h>
29#include <utils/ipc/semset.h>
46#if defined(_SEM_SEMUN_UNDEFINED) || defined(__FreeBSD__)
49 struct semid_ds * buf;
50 unsigned short int *array;
51 struct seminfo * buf_;
101 bool destroy_on_delete)
103 data =
new SemaphoreSetData();
106 num_sems = -num_sems;
110 data->num_sems = num_sems;
114 data->semflg |= IPC_CREAT;
117 data->key = ftok(path,
id);
118 data->semid = semget(data->key, num_sems, data->semflg);
134 data =
new SemaphoreSetData();
137 num_sems = -num_sems;
141 data->num_sems = num_sems;
145 data->semflg |= IPC_CREAT;
149 data->semid = semget(data->key, num_sems, data->semflg);
151 if (data->semid == -1) {
152 throw Exception(errno,
"Creating the semaphore set failed, maybe key does not exist");
167 data =
new SemaphoreSetData();
170 num_sems = -num_sems;
174 data->num_sems = num_sems;
177 data->semflg |= IPC_CREAT;
178 data->semflg |= IPC_EXCL;
180 for (data->key = 1; data->key < INT_MAX; data->key++) {
181 data->semid = semget(data->key, num_sems, data->semflg);
182 if (data->semid != -1) {
193 semctl(data->semid, 0, IPC_RMID, 0);
207 if (data->semid == -1) {
208 data->semid = semget(data->key, data->num_sems, data->semflg);
209 if (data->semid == -1) {
212 struct semid_ds semds;
215 if (semctl(data->semid, 0, IPC_STAT, s) != -1) {
223 struct semid_ds semds;
226 if (semctl(data->semid, 0, IPC_STAT, s) != -1) {
246 if (data->semid == -1)
250 sop.sem_num = sem_num;
251 sop.sem_op = (short)((num <= 0) ? num : -num);
253 if (semop(data->semid, &sop, 1) != 0) {
272 if (data->semid == -1)
276 sop.sem_num = sem_num;
277 sop.sem_op = (short)((num <= 0) ? num : -num);
278 sop.sem_flg = IPC_NOWAIT;
279 if (semop(data->semid, &sop, 1) != 0) {
280 if (errno == EAGAIN) {
282 }
else if (errno == EINTR) {
301 if (data->semid == -1)
305 sop.sem_num = sem_num;
306 sop.sem_op = (short)((num >= 0) ? num : -num);
308 if (semop(data->semid, &sop, 1) != 0) {
324 if (data->semid == -1)
330 if (semctl(data->semid, sem_num, SETVAL, s) == -1) {
343 if (data->semid == -1)
346 return (semctl(data->semid, sem_num, GETVAL, 0) != 0);
387 semid = semget(
key, 1, IPC_CREAT | IPC_EXCL);
390 semctl(semid, 0, IPC_RMID, 0);
395 return (found ?
key : 0);
406 int semid = semget(
key, 0, 0);
409 semctl(semid, 0, IPC_RMID, 0);
Base class for exceptions in Fawkes.
The current system call has been interrupted (for instance by a signal).
Cannot set value on semaphore.
Semaphore or semaphore set invalid.
bool destroy_on_delete
Destroy this semaphore on delete?
void set_destroy_on_delete(bool destroy)
Set if semaphore set should be destroyed on delete.
bool valid()
Check if the semaphore set is valid.
void unlock(unsigned short sem_num=0, short num=-1)
Unlock resources on the semaphore set.
int get_value(int sem_num)
Get the semaphore value.
bool try_lock(unsigned short sem_num=0, short num=1)
Try to lock resources on the semaphore set.
void lock(unsigned short sem_num=0, short num=1)
Lock resources on the semaphore set.
SemaphoreSet(const char *path, char id, int num_sems, bool create=false, bool destroy_on_delete=false)
Constructor.
~SemaphoreSet()
Destructor.
int key()
Get key of semaphore.
static void destroy(int key)
Destroy a semaphore set.
static int free_key()
Get a non-zero free key Scans the key space sequentially until a non-zero unused key is found.
void set_value(int sem_num, int val)
Set the semaphore value.
Fawkes library namespace.