Diff for /rpl/src/semaphores.c between versions 1.31 and 1.34

version 1.31, 2011/09/18 18:45:31 version 1.34, 2011/09/20 14:36:30
Line 38  nom_segment_semaphore(pid_t pid) Line 38  nom_segment_semaphore(pid_t pid)
         return(NULL);          return(NULL);
     }      }
   
     sprintf(fichier, "/RPL-SIGSEMAPHORE-%d", (int) pid);      sprintf(fichier, "/RPL-SS-%d", (int) pid);
       return(fichier);
   }
   
   
   static unsigned char *
   nom_segment_semaphore_thread(pid_t pid, pthread_t tid)
   {
       unsigned char               *fichier;
   
       if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL)
       {
           return(NULL);
       }
   
       sprintf(fichier, "/RPL-SS-%d-%llx", (int) pid,
               (unsigned long long) tid);
     return(fichier);      return(fichier);
 }  }
   
Line 68  sem_init2(unsigned int valeur, pid_t pid Line 84  sem_init2(unsigned int valeur, pid_t pid
         return(SEM_FAILED);          return(SEM_FAILED);
     }      }
   
     semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur);      semaphore = sem_open(chemin, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR,
               valeur);
     free(chemin);      free(chemin);
   
     for(i = 0; i < valeur; i++)      return(semaphore);
   }
   
   
   sem_t *
   sem_init3(unsigned int valeur, pid_t pid, pthread_t tid)
   {
       sem_t                       *semaphore;
   
       unsigned char               *chemin;
       unsigned int                i;
   
       if ((chemin = nom_segment_semaphore_thread(pid, tid)) == NULL)
     {      {
         if (sem_post(semaphore) != 0)          return(SEM_FAILED);
         {  
             sem_close(semaphore);  
             return(SEM_FAILED);  
         }  
     }      }
   
       semaphore = sem_open(chemin, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR,
               valeur);
       free(chemin);
   
     return(semaphore);      return(semaphore);
 }  }
   
Line 93  sem_open2(pid_t pid) Line 122  sem_open2(pid_t pid)
   
     if ((chemin = nom_segment_semaphore(pid)) == NULL)      if ((chemin = nom_segment_semaphore(pid)) == NULL)
     {      {
         return(1);          return(SEM_FAILED);
     }      }
   
     semaphore = sem_open(chemin, O_RDWR);      semaphore = sem_open(chemin, O_RDWR);
Line 123  sem_destroy2(sem_t *semaphore, pid_t pid Line 152  sem_destroy2(sem_t *semaphore, pid_t pid
     return(erreur);      return(erreur);
 }  }
   
   
   int
   sem_destroy3(sem_t *semaphore, pid_t pid, pthread_t tid)
   {
       int                         erreur;
   
       unsigned char               *chemin;
   
       sem_close(semaphore);
   
       if ((chemin = nom_segment_semaphore_thread(pid, tid)) == NULL)
       {
           return(1);
       }
   
       erreur = sem_unlink(chemin);
       free(chemin);
   
       return(erreur);
   }
   
   
 #undef sem_post  #undef sem_post
 #undef sem_wait  #undef sem_wait
 #undef sem_trywait  #undef sem_trywait
Line 208  sem_getvalue2(sem_t *semaphore, int *val Line 259  sem_getvalue2(sem_t *semaphore, int *val
 ================================================================================  ================================================================================
 */  */
   
 #ifndef OS2  #ifndef OS2 // IPCS_SYSV
     extern unsigned char *chemin_semaphores_SysV;      extern unsigned char *racine_segment;
 #else  #else // OS/2
     unsigned char racine_semaphores_OS2[] = "\\SEM32\\";      unsigned char racine_semaphores_OS2[] = "\\SEM32\\";
     unsigned char racine_memoire_OS2[] = "\\SHAREMEM\\";      unsigned char racine_memoire_OS2[] = "\\SHAREMEM\\";
 #endif  #endif
Line 220  sem_init_SysV(sem_t *semaphore, int shar Line 271  sem_init_SysV(sem_t *semaphore, int shar
 {  {
     // Création d'un sémaphore anonyme qui devra être supprimé par      // Création d'un sémaphore anonyme qui devra être supprimé par
     // sem_destroy_SysV      // sem_destroy_SysV
 #   ifndef OS2  
   
     int             ios;  #   ifndef OS2 // IPCS_SYSV
           int             desc;
           int             ios;
   
     union semun     argument;          key_t           clef;
   
     if (shared != 0)          union semun     argument;
     {  
         errno = ENOSYS;          if (shared == 0)
         return(-1);          {
     }              // Sémaphore privé
               (*semaphore).sem = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL |
                       S_IRUSR | S_IWUSR);
               (*semaphore).path = NULL;
               (*semaphore).pid = getpid();
               (*semaphore).tid = pthread_self();
               (*semaphore).alloue = 0;
           }
           else
           {
               // Sémaphore partagé entre plusieurs processus
               if (((*semaphore).path = malloc((strlen(racine_segment)
                       + 2 + 256 + 1) * sizeof(unsigned char))) == NULL)
               {
                   return(-1);
               }
   
     (*semaphore).sem = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL |              sprintf((*semaphore).path, "%s/RPL-SIGSEMAPHORE-%d-%llu",
             S_IRUSR | S_IWUSR);                      racine_segment, pthread_self(),
     (*semaphore).path = NULL;                      (int) getpid());
     (*semaphore).pid = getpid();  
   
     if ((*semaphore).sem == -1)              if ((desc = open((*semaphore).path, O_RDWR | O_CREAT | O_EXCL,
     {                      S_IRUSR | S_IWUSR)) == -1)
         errno = EINVAL;              {
         return(-1);                  free((*semaphore).path);
     }                  return(-1);
               }
   
     argument.val = valeur;              (*semaphore).pid = getpid();
     ios = semctl((*semaphore).sem, 0, SETVAL, argument);              (*semaphore).tid = pthread_slef();
               clef = ftok((*semaphore).path, 1);
               close(desc);
   
     return(ios);              if (clef == -1)
               {
                   free((*semaphore).path);
                   return(-1);
               }
   
 #   else              (*semaphore).alloue = 0;
               (*semaphore).sem = semget(clef, 1, IPC_CREAT | IPC_EXCL |
                       S_IRUSR | S_IWUSR);
           }
   
           if ((*semaphore).sem == -1)
           {
               errno = EINVAL;
               return(-1);
           }
   
           argument.val = valeur;
           ios = semctl((*semaphore).sem, 0, SETVAL, argument);
   
           return(ios);
   #   else // OS/2
   
     sem_t           *psem;      sem_t           *psem;
   
Line 306  int Line 394  int
 sem_destroy_SysV(sem_t *semaphore)  sem_destroy_SysV(sem_t *semaphore)
 {  {
     // Détruit un sémaphore anonmyme      // Détruit un sémaphore anonmyme
 #   ifndef OS2  
   
     if ((*semaphore).path != NULL)  #   ifndef OS2 // IPCS_SYSV
     {          if ((*semaphore).path != NULL)
         return(EINVAL);          {
     }              return(EINVAL);
           }
     if ((*semaphore).pid != getpid())  
     {  
         return(0);  
     }  
   
     if (semctl((*semaphore).sem, 0, IPC_RMID) == -1)          if ((*semaphore).pid != getpid())
     {          {
         return(EINVAL);              return(0);
     }          }
   
     return(0);          if (semctl((*semaphore).sem, 0, IPC_RMID) == -1)
           {
               return(EINVAL);
           }
   
 #   else          return(0);
   #   else // OS/2
   
     sem_t       *psem;      sem_t       *psem;
   
Line 374  sem_destroy_SysV(sem_t *semaphore) Line 461  sem_destroy_SysV(sem_t *semaphore)
 int  int
 sem_wait_SysV(sem_t *semaphore)  sem_wait_SysV(sem_t *semaphore)
 {  {
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           struct sembuf       commande;
   
     struct sembuf       commande;          commande.sem_num = 0;
           commande.sem_op = -1;
           commande.sem_flg = 0;
   
     commande.sem_num = 0;          while(semop((*semaphore).sem, &commande, 1) == -1)
     commande.sem_op = -1;  
     commande.sem_flg = 0;  
   
     while(semop((*semaphore).sem, &commande, 1) == -1)  
     {  
         if (errno != EINTR)  
         {          {
             errno = EINVAL;              if (errno != EINTR)
             return(-1);              {
                   errno = EINVAL;
                   return(-1);
               }
         }          }
     }  
   
     return(0);          return(0);
   #   else // OS/2
 #   else  
   
     sem_t       *psem;      sem_t       *psem;
   
Line 432  sem_wait_SysV(sem_t *semaphore) Line 517  sem_wait_SysV(sem_t *semaphore)
 int  int
 sem_trywait_SysV(sem_t *semaphore)  sem_trywait_SysV(sem_t *semaphore)
 {  {
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           struct sembuf       commande;
     struct sembuf       commande;  
   
     commande.sem_num = 0;          commande.sem_num = 0;
     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)          while(semop((*semaphore).sem, &commande, 1) == -1)
     {  
         if (errno != EINTR)  
         {          {
             errno = EINVAL;              if (errno != EINTR)
             return(-1);              {
                   errno = EINVAL;
                   return(-1);
               }
         }          }
     }  
   
     return(0);  
   
 #   else          return(0);
   #   else // OS/2
   
     int         ios;      int         ios;
   
Line 492  sem_trywait_SysV(sem_t *semaphore) Line 575  sem_trywait_SysV(sem_t *semaphore)
 int  int
 sem_post_SysV(sem_t *semaphore)  sem_post_SysV(sem_t *semaphore)
 {  {
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           struct sembuf       commande;
   
     struct sembuf       commande;          commande.sem_num = 0;
           commande.sem_op = 1;
           commande.sem_flg = 0;
   
     commande.sem_num = 0;          while(semop((*semaphore).sem, &commande, 1) == -1)
     commande.sem_op = 1;  
     commande.sem_flg = 0;  
   
     while(semop((*semaphore).sem, &commande, 1) == -1)  
     {  
         if (errno != EINTR)  
         {          {
             errno = EINVAL;              if (errno != EINTR)
             return(-1);              {
                   errno = EINVAL;
                   return(-1);
               }
         }          }
     }  
   
     return(0);  
   
 #   else          return(0);
   #   else // OS/2
   
     sem_t               *psem;      sem_t               *psem;
   
Line 535  sem_post_SysV(sem_t *semaphore) Line 616  sem_post_SysV(sem_t *semaphore)
 int  int
 sem_getvalue_SysV(sem_t *semaphore, int *valeur)  sem_getvalue_SysV(sem_t *semaphore, int *valeur)
 {  {
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           (*valeur) = semctl((*semaphore).sem, 0, GETVAL);
   
     (*valeur) = semctl((*semaphore).sem, 0, GETVAL);          if ((*valeur) < 0)
           {
     if ((*valeur) < 0)              return(EINVAL);
     {          }
         return(EINVAL);  
     }  
   
     return(0);  
   
           return(0);
 #   else  #   else
   
     sem_t               *psem;      sem_t               *psem;
Line 576  sem_t Line 655  sem_t
     sem_t               *semaphore;      sem_t               *semaphore;
   
 #   ifndef OS2  #   ifndef OS2
     file                *desc;          int             desc;
   
     key_t               clef;          key_t           clef;
   
     union semun         argument;          union semun     argument;
 #   endif  #   endif
   
     unsigned char       *nom_absolu;      unsigned char       *nom_absolu;
Line 590  sem_t Line 669  sem_t
     va_list             liste;      va_list             liste;
   
 #   ifdef OS2  #   ifdef OS2
     sem_t               *psem;          sem_t           *psem;
   
     PVOID               base;          PVOID           base;
   
     unsigned char       *ptr;          unsigned char   *ptr;
     unsigned char       *nom_segment;          unsigned char   *nom_segment;
 #   endif  #   endif
   
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           if ((nom_absolu = malloc((strlen(racine_segment) + strlen(nom)
     if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)                  + 2) * sizeof(unsigned char))) == NULL)
             + 1) * sizeof(unsigned char))) == NULL)          {
     {              return(SEM_FAILED);
         return(SEM_FAILED);          }
     }  
   
     sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);          sprintf(nom_absolu, "%s/%s", racine_segment, nom);
   
     if ((semaphore = malloc(sizeof(sem_t))) == NULL)          if ((semaphore = malloc(sizeof(sem_t))) == NULL)
     {          {
         return(SEM_FAILED);              return(SEM_FAILED);
     }          }
   
           (*semaphore).alloue = -1;
           (*semaphore).pid = getpid();
           (*semaphore).tid = pthread_self();
 #   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 668  sem_t Line 749  sem_t
     {      {
         // 2 arguments          // 2 arguments
   
 #       ifndef OS2  #       ifndef OS2 // IPCS_SYSV
               clef = ftok(nom_absolu, 1);
         clef = ftok(nom_absolu, 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(nom_absolu);  
   
             return(SEM_FAILED);              if (clef == -1)
         }              {
                   return(SEM_FAILED);
               }
   
 #       else              (*semaphore).sem = semget(clef, 0, 0);
               (*semaphore).path = nom_absolu;
               (*semaphore).pid = getpid();
   
               if ((*semaphore).sem == -1)
               {   
                   free(semaphore);
                   free(nom_absolu);
   
                   return(SEM_FAILED);
               }
   #       else // OS/2
         if ((psem = malloc(sizeof(sem_t))) == NULL)          if ((psem = malloc(sizeof(sem_t))) == NULL)
         {          {
             free(nom_absolu);              free(nom_absolu);
Line 770  sem_t Line 848  sem_t
         valeur = va_arg(liste, unsigned int);          valeur = va_arg(liste, unsigned int);
         va_end(liste);          va_end(liste);
   
 #       ifndef OS2  #       ifndef OS2 // IPCS_SYSV
               if ((desc = open(nom_absolu, O_CREAT | O_EXCL | O_RDWR,
         if ((desc = fopen(nom_absolu, "w")) == NULL)                      S_IRUSR | S_IWUSR)) == -1)
         {              {
             free(semaphore);                  free(semaphore);
             free(nom_absolu);                  free(nom_absolu);
   
             return(SEM_FAILED);  
         }  
   
         fclose(desc);  
   
         if ((clef = ftok(nom_absolu, 1)) == -1)                  return(SEM_FAILED);
         {              }
             free(semaphore);  
             free(nom_absolu);  
   
             return(SEM_FAILED);              if ((clef = ftok(nom_absolu, 1)) == -1)
         }              {
                   close(desc);
                   free(semaphore);
                   free(nom_absolu);
   
         (*semaphore).sem = semget(clef, 1,                  return(SEM_FAILED);
                 (((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT) |              }
                 (((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL) |  
                 (int) mode);  
         (*semaphore).path = nom_absolu;  
         (*semaphore).pid = getpid();  
   
         if ((*semaphore).sem == -1)              close(desc);
         {     
             free(semaphore);  
             free(nom_absolu);  
   
             return(SEM_FAILED);              (*semaphore).sem = semget(clef, 1,
         }                      (((oflag & O_CREAT) == 0) ? 0 : IPC_CREAT) |
                       (((oflag & O_EXCL) == 0) ? 0 : IPC_EXCL) |
                       (int) mode);
               (*semaphore).path = nom_absolu;
               (*semaphore).pid = getpid();
   
               if ((*semaphore).sem == -1)
               {   
                   free(semaphore);
                   free(nom_absolu);
   
         argument.val = valeur;                  return(SEM_FAILED);
         semctl((*semaphore).sem, 0, SETVAL, argument);              }
   
 #       else              argument.val = valeur;
               semctl((*semaphore).sem, 0, SETVAL, argument);
   #       else // OS/2
   
         if ((psem = malloc(sizeof(sem_t))) == NULL)          if ((psem = malloc(sizeof(sem_t))) == NULL)
         {          {
Line 874  int Line 952  int
 sem_close_SysV(sem_t *semaphore)  sem_close_SysV(sem_t *semaphore)
 {  {
     // Ferme un sémaphore nommé créé par sem_open_SysV()      // Ferme un sémaphore nommé créé par sem_open_SysV()
 #   ifndef OS2  #   ifndef OS2 // IPCS_SYSV
           if ((*semaphore).path != NULL)
     if ((*semaphore).path != NULL)          {
     {              free((*semaphore).path);
         free((*semaphore).path);          }
     }  
   
     free(semaphore);          if ((*semaphore).alloue == -1)
     return(0);          {
               free(semaphore);
           }
   
           return(0);
 #   else  #   else
   
     sem_t       *psem;      sem_t       *psem;
Line 929  int Line 1009  int
 sem_unlink_SysV(const char *nom)  sem_unlink_SysV(const 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  #   ifndef OS2 // IPCS_SYSV
           semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID);
     unsigned char       *nom_absolu;  
   
     if ((nom_absolu = malloc((strlen(chemin_semaphores_SysV) + strlen(nom)  
             + 1) * sizeof(unsigned char))) == NULL)  
     {  
         return(ENOMEM);  
     }  
   
     sprintf(nom_absolu, "%s%s", chemin_semaphores_SysV, nom);          if (unlink(nom_absolu) == -1)
     semctl(semget(ftok(nom_absolu, 1), 0, 0), 0, IPC_RMID);          {
               free(nom_absolu);
               return(EACCES);
           }
   
     if (unlink(nom_absolu) == -1)  
     {  
         free(nom_absolu);          free(nom_absolu);
         return(EACCES);          return(0);
     }  
   
     free(nom_absolu);  
   
     return(0);  
   
 #   else  #   else
   
     return(0);      return(0);

Removed from v.1.31  
changed lines
  Added in v.1.34


CVSweb interface <joel.bertrand@systella.fr>