Diff for /rpl/src/semaphores.c between versions 1.46 and 1.47

version 1.46, 2012/05/31 14:20:33 version 1.47, 2012/07/03 13:56:32
Line 299  sem_init_SysV(sem_t *semaphore, int shar Line 299  sem_init_SysV(sem_t *semaphore, int shar
             }              }
   
             sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d",              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,              if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL,
                     S_IRUSR | S_IWUSR)) == -1)                      S_IRUSR | S_IWUSR)) == -1)
Line 557  sem_trywait_SysV(sem_t *semaphore) Line 558  sem_trywait_SysV(sem_t *semaphore)
 #   endif  #   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  int
 sem_post_SysV(sem_t *semaphore)  sem_post_SysV(sem_t *semaphore)
 {  {
Line 981  sem_close_SysV(sem_t *semaphore) Line 1040  sem_close_SysV(sem_t *semaphore)
 }  }
   
 int  int
 sem_unlink_SysV(const char *nom)  sem_unlink_SysV(char *nom)
 {  {
     // Détruit un sémaphore nommé créé par sem_open_SysV()      // Détruit un sémaphore nommé créé par sem_open_SysV()
 #   ifndef OS2 // IPCS_SYSV  #   ifndef OS2 // IPCS_SYSV

Removed from v.1.46  
changed lines
  Added in v.1.47


CVSweb interface <joel.bertrand@systella.fr>