--- rpl/src/semaphores.c 2012/07/03 13:56:32 1.47 +++ rpl/src/semaphores.c 2014/04/25 07:37:35 1.64 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.9 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,8 +23,6 @@ #include "rpl-conv.h" -#ifdef SEMAPHORES_NOMMES - // Les fonctions suivantes ne sont utilisées que dans le cas d'un // système POSIX qui ne possède pas de sémaphores anonymes. MacOS X // est dans ce cas. @@ -39,7 +37,7 @@ nom_segment_semaphore(pid_t pid, int ord return(NULL); } - sprintf(fichier, "/RPL-%d-%d", (int) pid, ordre); + sprintf(fichier, "/RPL-%llu-%d", (unsigned long long) pid, ordre); return(fichier); } @@ -54,7 +52,7 @@ nom_segment_semaphore_thread(pid_t pid, return(NULL); } - sprintf(fichier, "/RPL-%d-%llX-%d", (int) pid, + sprintf(fichier, "/RPL-%llu-%llu-%d", (unsigned long long) pid, (unsigned long long) tid, ordre); return(fichier); } @@ -173,10 +171,6 @@ sem_destroy3(sem_t *semaphore, pid_t pid } -#undef sem_post -#undef sem_wait -#undef sem_trywait - int sem_getvalue2(sem_t *semaphore, int *valeur) { @@ -242,7 +236,11 @@ sem_getvalue2(sem_t *semaphore, int *val return(0); } -#endif + +#undef sem_post +#undef sem_wait +#undef sem_trywait + #ifdef IPCS_SYSV @@ -298,9 +296,10 @@ sem_init_SysV(sem_t *semaphore, int shar return(-1); } - sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d", + sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%llX", racine_segment, (int) getpid(), - (long long unsigned) pthread_self(), shared); + (long long unsigned) pthread_self(), + (long long unsigned) semaphore); if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) @@ -331,7 +330,7 @@ sem_init_SysV(sem_t *semaphore, int shar return(-1); } - argument.val = valeur; + argument.val = (int) valeur; ios = semctl((*semaphore).sem, 0, SETVAL, argument); return(ios); @@ -454,17 +453,23 @@ sem_wait_SysV(sem_t *semaphore) # ifndef OS2 // IPCS_SYSV struct sembuf commande; + // semop() ne renvoie pas EINTR sur un signal ! + commande.sem_num = 0; commande.sem_op = -1; commande.sem_flg = 0; - while(semop((*semaphore).sem, &commande, 1) == -1) + if (semop((*semaphore).sem, &commande, 1) == -1) { - if (errno != EINTR) + if (errno != EAGAIN) { errno = EINVAL; return(-1); } + else + { + return(-1); + } } return(0); @@ -512,13 +517,9 @@ sem_trywait_SysV(sem_t *semaphore) commande.sem_op = -1; commande.sem_flg = IPC_NOWAIT; - while(semop((*semaphore).sem, &commande, 1) == -1) + if (semop((*semaphore).sem, &commande, 1) == -1) { - if (errno != EINTR) - { - errno = EINVAL; - return(-1); - } + return(-1); } return(0); @@ -922,7 +923,7 @@ sem_t return(SEM_FAILED); } - argument.val = valeur; + argument.val = (int) valeur; semctl((*semaphore).sem, 0, SETVAL, argument); # else // OS/2 if ((psem = malloc(sizeof(sem_t))) == NULL)