It's kind of silly to retry the semop 500 times. Just check if sempop()
was interrupted and retry in this case. Otherwise, error out.
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/sem.h>
-/** abort if semget() failed that many times */
-#define MAX_SEMOP_RETRIES 500
-
/**
* define a new mutex
*
/**
* define a new mutex
*
return ret < 0? -E_SEM_REMOVE : 1;
}
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++)
if (semop(id, sops, num) >= 0)
return;
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());