Diff for /rpl/src/semaphores.c between versions 1.10 and 1.11

version 1.10, 2010/08/17 11:59:28 version 1.11, 2010/08/18 12:56:55
Line 141  union semun Line 141  union semun
 int  int
 sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur)  sem_init_SysV(sem_t *semaphore, int shared, unsigned int valeur)
 {  {
       // Création d'un sémaphore anonyme qui devra être supprimé par
       // sem_destroy_SysV
 #   ifndef OS2  #   ifndef OS2
   
     int             ios;      int             ios;
Line 153  sem_init_SysV(sem_t *semaphore, int shar Line 155  sem_init_SysV(sem_t *semaphore, int shar
         return(-1);          return(-1);
     }      }
   
     (*semaphore) = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | SEM_R | SEM_A);      (*semaphore).sem = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL |
               S_IRUSR | S_IWUSR);
       (*semaphore).path = NULL;
       (*semaphore).pid = getpid();
   
     if ((*semaphore) == -1)      if ((*semaphore).sem == -1)
     {      {
   perror("sem_init");
         errno = EINVAL;          errno = EINVAL;
         return(-1);          return(-1);
     }      }
   
     argument.val = valeur;      argument.val = valeur;
     ios = semctl((*semaphore), 0, SETVAL, argument);      ios = semctl((*semaphore).sem, 0, SETVAL, argument);
   
     return(ios);      return(ios);
   
Line 223  sem_init_SysV(sem_t *semaphore, int shar Line 229  sem_init_SysV(sem_t *semaphore, int shar
 int  int
 sem_destroy_SysV(sem_t *semaphore)  sem_destroy_SysV(sem_t *semaphore)
 {  {
       // Détruit un sémaphore anonmyme
 #   ifndef OS2  #   ifndef OS2
   
     if (semctl((*semaphore), IPC_RMID, 0) == -1)      if ((*semaphore).path != NULL)
       {
           return(EINVAL);
       }
   
       if ((*semaphore).pid != getpid())
       {
           return(0);
       }
   
       if (semctl((*semaphore).sem, IPC_RMID, 0) == -1)
     {      {
         return(EINVAL);          return(EINVAL);
     }      }
Line 289  sem_wait_SysV(sem_t *semaphore) Line 306  sem_wait_SysV(sem_t *semaphore)
     commande.sem_op = -1;      commande.sem_op = -1;
     commande.sem_flg = 0;      commande.sem_flg = 0;
   
     if (semop((*semaphore), &commande, 1) == -1)      while(semop((*semaphore).sem, &commande, 1) == -1)
     {      {
         errno = EINVAL;          if (errno != EINTR)
         return(-1);          {
   perror("sem_wait");
               errno = EINVAL;
               return(-1);
           }
     }      }
   
     return(0);      return(0);
Line 344  sem_trywait_SysV(sem_t *semaphore) Line 365  sem_trywait_SysV(sem_t *semaphore)
     commande.sem_op = -1;      commande.sem_op = -1;
     commande.sem_flg = IPC_NOWAIT;      commande.sem_flg = IPC_NOWAIT;
   
     if (semop((*semaphore), &commande, 1) == -1)      while(semop((*semaphore).sem, &commande, 1) == -1)
     {      {
         return(-1);          if (errno != EINTR)
           {
               errno = EINVAL;
               return(-1);
           }
     }      }
   
     return(0);      return(0);
Line 400  sem_post_SysV(sem_t *semaphore) Line 425  sem_post_SysV(sem_t *semaphore)
     commande.sem_op = 1;      commande.sem_op = 1;
     commande.sem_flg = 0;      commande.sem_flg = 0;
   
     if (semop((*semaphore), &commande, 1) == -1)      while(semop((*semaphore).sem, &commande, 1) == -1)
     {      {
         errno = EINVAL;          if (errno != EINTR)
         return(-1);          {
               errno = EINVAL;
               return(-1);
           }
     }      }
   
     return(0);      return(0);
Line 434  sem_getvalue_SysV(sem_t *semaphore, int Line 462  sem_getvalue_SysV(sem_t *semaphore, int
 {  {
 #   ifndef OS2  #   ifndef OS2
   
     (*valeur) = semctl((*semaphore), 0, GETVAL);      (*valeur) = semctl((*semaphore).sem, 0, GETVAL);
   
     if ((*valeur) < 0)      if ((*valeur) < 0)
     {      {
Line 510  sem_t Line 538  sem_t
         return(SEM_FAILED);          return(SEM_FAILED);
     }      }
   
     (*psem).allocated = 1;  
   
 #   else  #   else
   
     if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)      if ((nom_segment = malloc((strlen(racine_memoire_OS2) + strlen(nom) + 1)
Line 559  sem_t Line 585  sem_t
         return(SEM_FAILED);          return(SEM_FAILED);
     }      }
   
       (*psem).allocated = 1;
   
 #   endif  #   endif
   
     if ((oflag & O_CREAT) == 0)      if ((oflag & O_CREAT) == 0)
Line 567  sem_t Line 595  sem_t
   
 #       ifndef OS2  #       ifndef OS2
   
         (*semaphore) = semget(ftok(nom_absolu, 1), 0, 0);          clef = ftok(nom_absolu, 1);
   
         if ((*semaphore) == -1)          if (clef == -1)
           {
               return(SEM_FAILED);
           }
   
           (*semaphore).sem = semget(clef, 0, 0);
           (*semaphore).path = nom_absolu;
           (*semaphore).pid = getpid();
   
           if ((*semaphore).sem == -1)
         {             {   
             free(semaphore);              free(semaphore);
             free(nom_absolu);              free(nom_absolu);
Line 678  sem_t Line 715  sem_t
             return(SEM_FAILED);              return(SEM_FAILED);
         }          }
   
         (*semaphore) = semget(clef, 1,          (*semaphore).sem = semget(clef, 1,
                 ((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT |                  (((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT) |
                 ((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL |                  (((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL) |
                 ((oflag & S_IRUSR) == 0) ? 0 : SEM_R |                  (int) mode);
                 ((oflag & S_IWUSR) == 0) ? 0 : SEM_A);          (*semaphore).path = nom_absolu;
           (*semaphore).pid = getpid();
   
         if ((*semaphore) == -1)          if ((*semaphore).sem == -1)
         {             {   
             free(semaphore);              free(semaphore);
             free(nom_absolu);              free(nom_absolu);
Line 693  sem_t Line 731  sem_t
         }          }
   
         argument.val = valeur;          argument.val = valeur;
         semctl((*semaphore), 0, SETVAL, argument);          semctl((*semaphore).sem, 0, SETVAL, argument);
   
 #       else  #       else
   
Line 754  sem_t Line 792  sem_t
 #       endif  #       endif
     }      }
   
     free(nom_absolu);  
   
     return(semaphore);      return(semaphore);
 }  }
   
 int  int
 sem_close_SysV(sem_t *semaphore)  sem_close_SysV(sem_t *semaphore)
 {  {
       // Ferme un sémaphore nommé créé par sem_open_SysV()
 #   ifndef OS2  #   ifndef OS2
   
       if ((*semaphore).path != NULL)
       {
           free((*semaphore).path);
       }
   
     free(semaphore);      free(semaphore);
     return(0);      return(0);
   
Line 811  sem_close_SysV(sem_t *semaphore) Line 853  sem_close_SysV(sem_t *semaphore)
 int  int
 sem_unlink_SysV(const char *nom)  sem_unlink_SysV(const char *nom)
 {  {
       // Détruit un sémaphore nommé créé par sem_open_SysV()
 #   ifndef OS2  #   ifndef OS2
   
     sem_t               semaphore;  
   
     struct sembuf       commande;  
   
     unsigned char       *nom_absolu;      unsigned char       *nom_absolu;
   
     if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)      if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)
Line 826  sem_unlink_SysV(const char *nom) Line 865  sem_unlink_SysV(const char *nom)
     }      }
   
     sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);      sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);
       semctl(semget(ftok(nom_absolu, 1), 0, 0), IPC_RMID, 0);
     if ((semaphore = semget(ftok(nom_absolu, 1), 0, 0)) == -1)  
     {     
         free(nom_absolu);  
         return(EINVAL);  
     }  
   
     commande.sem_num = 0;  
     commande.sem_op = 0;  
     commande.sem_flg = 0;  
   
     if (semop(semaphore, &commande, 1) == -1)  
     {  
         free(nom_absolu);  
         return(EINVAL);  
     }  
   
     if (semctl(semaphore, IPC_RMID, 0) == -1)  
     {  
         free(nom_absolu);  
         return(EINVAL);  
     }  
   
     if (unlink(nom_absolu) == -1)      if (unlink(nom_absolu) == -1)
     {      {

Removed from v.1.10  
changed lines
  Added in v.1.11


CVSweb interface <joel.bertrand@systella.fr>