--- rpl/src/semaphores.c 2012/05/31 14:20:33 1.46 +++ rpl/src/semaphores.c 2012/07/03 13:56:32 1.47 @@ -299,7 +299,8 @@ sem_init_SysV(sem_t *semaphore, int shar } sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d", - racine_segment, (int) getpid(), pthread_self(), shared); + racine_segment, (int) getpid(), + (long long unsigned) pthread_self(), shared); if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) @@ -557,6 +558,64 @@ sem_trywait_SysV(sem_t *semaphore) # endif } +#ifndef timespeccmp +# define timespeccmp(tsp, usp, cmp) \ + (((tsp)->tv_sec == (usp)->tv_sec) ? \ + ((tsp)->tv_nsec cmp (usp)->tv_nsec) : \ + ((tsp)->tv_sec cmp (usp)->tv_sec)) +# define timespecadd(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ + if ((vsp)->tv_nsec >= 1000000000L) { \ + (vsp)->tv_sec++; \ + (vsp)->tv_nsec -= 1000000000L; \ + } \ + } while(0) +# define timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while(0) +#endif + +int +sem_timedwait_SysV(sem_t *sem, struct timespec *ts) +{ + struct timespec onems = { 0, 1000000 }; + struct timespec total = { 0, 0 }; + struct timespec unslept; + struct timespec elapsed; + struct timespec tmp; + + while(timespeccmp(ts, &total, >)) + { + if (sem_trywait_SysV(sem) == 0) + { + return(0); + } + + if (errno != EAGAIN) + { + return(-1); + } + + nanosleep(&onems, &unslept); + + timespecsub(&onems, &unslept, &elapsed); + timespecadd(&total, &elapsed, &tmp); + total.tv_sec = tmp.tv_sec; + total.tv_nsec = tmp.tv_nsec; + } + + errno = ETIMEDOUT; + return(-1); +} + int sem_post_SysV(sem_t *semaphore) { @@ -981,7 +1040,7 @@ sem_close_SysV(sem_t *semaphore) } int -sem_unlink_SysV(const char *nom) +sem_unlink_SysV(char *nom) { // Détruit un sémaphore nommé créé par sem_open_SysV() # ifndef OS2 // IPCS_SYSV