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;
112 this->destroy_on_delete = destroy_on_delete;
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;
147 this->destroy_on_delete = destroy_on_delete;
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;
182 this->destroy_on_delete = destroy_on_delete;
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 ) {
202 if ((data->semid != -1) && destroy_on_delete) {
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 );
375 destroy_on_delete = destroy;
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);
bool valid()
Check if the semaphore set is valid.
Fawkes library namespace.
static int free_key()
Get a non-zero free key Scans the key space sequentially until a non-zero unused key is found...
static void destroy(int key)
Destroy a semaphore set.
Cannot set value on semaphore.
void lock(unsigned short sem_num=0, short num=1)
Lock resources on the semaphore set.
~SemaphoreSet()
Destructor.
Semaphore or semaphore set invalid.
void set_destroy_on_delete(bool destroy)
Set if semaphore set should be destroyed on delete.
Base class for exceptions in Fawkes.
int key()
Get key of semaphore.
void unlock(unsigned short sem_num=0, short num=-1)
Unlock resources on the semaphore set.
The current system call has been interrupted (for instance by a signal).
SemaphoreSet(const char *path, char id, int num_sems, bool create=false, bool destroy_on_delete=false)
Constructor.
void set_value(int sem_num, int val)
Set the semaphore value.
bool try_lock(unsigned short sem_num=0, short num=1)
Try to lock resources on the semaphore set.
int get_value(int sem_num)
Get the semaphore value.