24 #include <core/exceptions/system.h>
27 #include <sys/types.h>
28 #include <utils/ipc/sem_exceptions.h>
29 #include <utils/ipc/semset.h>
37 class SemaphoreSetData
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)
247 throw SemInvalidException();
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)
273 throw SemInvalidException();
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) {
285 throw SemCannotLockException();
301 if (data->semid == -1)
302 throw SemInvalidException();
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)
325 throw SemInvalidException();
330 if (semctl(data->semid, sem_num, SETVAL, s) == -1) {
343 if (data->semid == -1)
344 throw SemInvalidException();
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);