X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=ipc.c;h=debf9d11be254ed6cf07d7dc390763cbc0f5fb8d;hp=833ba1a43aed86e183d52b68c2e718b30c5468dd;hb=c9381f1e1f60439f0edd8d67100cc13ad8f4c0bf;hpb=471684761a2039bbc89aa1e3c33c62de6bef86cf;ds=sidebyside diff --git a/ipc.c b/ipc.c index 833ba1a4..debf9d11 100644 --- a/ipc.c +++ b/ipc.c @@ -13,9 +13,6 @@ #include #include -/** abort if semget() failed that many times */ -#define MAX_SEMOP_RETRIES 500 - /** * define a new mutex * @@ -45,14 +42,17 @@ int mutex_destroy(int id) 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); }