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

version 1.47, 2012/07/03 13:56:32 version 1.54, 2013/02/26 19:56:18
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.9    RPL/2 (R) version 4.1.12
   Copyright (C) 1989-2012 Dr. BERTRAND Joël    Copyright (C) 1989-2013 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 298  sem_init_SysV(sem_t *semaphore, int shar Line 298  sem_init_SysV(sem_t *semaphore, int shar
                 return(-1);                  return(-1);
             }              }
   
             sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%d",              sprintf((*semaphore).path, "%s/RPL-SEMAPHORE-%d-%llX-%llX",
                     racine_segment, (int) getpid(),                      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,              if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL,
                     S_IRUSR | S_IWUSR)) == -1)                      S_IRUSR | S_IWUSR)) == -1)
Line 454  sem_wait_SysV(sem_t *semaphore) Line 455  sem_wait_SysV(sem_t *semaphore)
 #   ifndef OS2 // IPCS_SYSV  #   ifndef OS2 // IPCS_SYSV
         struct sembuf       commande;          struct sembuf       commande;
   
           // semop() ne renvoie pas EINTR sur un signal !
   
         commande.sem_num = 0;          commande.sem_num = 0;
         commande.sem_op = -1;          commande.sem_op = -1;
         commande.sem_flg = 0;          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;                  errno = EINVAL;
                 return(-1);                  return(-1);
             }              }
               else
               {
                   return(-1);
               }
         }          }
   
         return(0);          return(0);
Line 512  sem_trywait_SysV(sem_t *semaphore) Line 519  sem_trywait_SysV(sem_t *semaphore)
         commande.sem_op = -1;          commande.sem_op = -1;
         commande.sem_flg = IPC_NOWAIT;          commande.sem_flg = IPC_NOWAIT;
   
         while(semop((*semaphore).sem, &commande, 1) == -1)          if (semop((*semaphore).sem, &commande, 1) == -1)
         {          {
             if (errno != EINTR)              return(-1);
             {  
                 errno = EINVAL;  
                 return(-1);  
             }  
         }          }
   
         return(0);          return(0);

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


CVSweb interface <joel.bertrand@systella.fr>