#include <sys/shm.h>
#include <sys/sem.h>
-/** abort if semget() failed that many times */
-#define MAX_SEMOP_RETRIES 500
-
/**
* define a new mutex
*
return ret < 0? -E_SEM_REMOVE : 1;
}
-static void para_semop(int id, struct sembuf *sops, unsigned num)
+static void para_semop(int id, struct sembuf *sops, int num)
{
- int i;
-
- for (i = 0; i < MAX_SEMOP_RETRIES; i++)
+ do {
if (semop(id, sops, num) >= 0)
return;
- PARA_EMERG_LOG("semop failed %d times, aborting\n", MAX_SEMOP_RETRIES);
+ } while (errno == EINTR);
+ if (errno == EIDRM) {
+ PARA_NOTICE_LOG("semaphore set %d was removed\n", id);
+ return;
+ }
+ PARA_EMERG_LOG("fatal semop error %s: pid %d\n", strerror(errno), getpid());
exit(EXIT_FAILURE);
}