24 #include <utils/ipc/semset.h>
25 #include <utils/ipc/sem_exceptions.h>
26 #include <core/exceptions/system.h>
30 #include <sys/types.h>
39 class SemaphoreSetData
48 #ifdef _SEM_SEMUN_UNDEFINED
53 unsigned short int *array;
54 struct seminfo *__buf;
104 bool create,
bool destroy_on_delete)
106 data =
new SemaphoreSetData();
108 if ( num_sems < 0 ) {
109 num_sems = - num_sems;
113 data->num_sems = num_sems;
117 data->semflg |= IPC_CREAT;
120 data->key = ftok(path,
id);
121 data->semid = semget(data->key, num_sems, data->semflg);
139 bool create,
bool destroy_on_delete)
141 data =
new SemaphoreSetData();
143 if ( num_sems < 0 ) {
144 num_sems = - num_sems;
148 data->num_sems = num_sems;
152 data->semflg |= IPC_CREAT;
156 data->semid = semget(data->key, num_sems, data->semflg);
158 if ( data->semid == -1 ) {
159 throw Exception(errno,
"Creating the semaphore set failed, maybe key does not exist");
174 bool destroy_on_delete)
176 data =
new SemaphoreSetData();
178 if ( num_sems < 0 ) {
179 num_sems = - num_sems;
183 data->num_sems = num_sems;
186 data->semflg |= IPC_CREAT;
187 data->semflg |= IPC_EXCL;
189 for (data->key = 1; data->key < INT_MAX; data->key++) {
190 data->semid = semget(data->key, num_sems, data->semflg);
191 if ( data->semid != -1 ) {
203 semctl(data->semid, 0, IPC_RMID, 0);
218 if (data->semid == -1) {
219 data->semid = semget(data->key, data->num_sems, data->semflg);
220 if (data->semid == -1) {
223 struct semid_ds semds;
226 if (semctl(data->semid, 0, IPC_STAT, s) != -1) {
234 struct semid_ds semds;
237 if (semctl(data->semid, 0, IPC_STAT, s) != -1) {
260 sop.sem_num = sem_num;
261 sop.sem_op = (short)((num <= 0) ? num : -num);
263 if ( semop(data->semid, &sop, 1) != 0 ) {
284 sop.sem_num = sem_num;
285 sop.sem_op = (short)((num <= 0) ? num : -num);
286 sop.sem_flg = IPC_NOWAIT;
287 if ( semop(data->semid, &sop, 1) != 0 ) {
288 if (errno == EAGAIN) {
290 }
else if ( errno == EINTR ) {
313 sop.sem_num = sem_num;
314 sop.sem_op = (short)((num >= 0) ? num : -num);
316 if ( semop(data->semid, &sop, 1) != 0 ) {
336 if ( semctl(data->semid, sem_num, SETVAL, s) == -1 ) {
352 return ( semctl(data->semid, sem_num, GETVAL, 0) != 0 );
395 for (key = 1; key < INT_MAX; ++
key) {
396 semid = semget(key, 1, IPC_CREAT | IPC_EXCL);
399 semctl(semid, 0, IPC_RMID, 0);
404 return (found ? key : 0);
416 int semid = semget(key, 0, 0);
417 if ( semid == -1 )
return;
418 semctl(semid, 0, IPC_RMID, 0);