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

version 1.17.2.1, 2011/04/11 13:02:29 version 1.31, 2011/09/18 18:45:31
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.22    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 24 Line 24
   
 #ifdef SEMAPHORES_NOMMES  #ifdef SEMAPHORES_NOMMES
   
   // Les fonctions suivantes ne sont utilisées que dans le cas d'un
   // système POSIX qui ne possède pas de sémaphores anonymes. MacOS X
   // est dans ce cas.
   
   static unsigned char *
   nom_segment_semaphore(pid_t pid)
   {
       unsigned char               *fichier;
   
       if ((fichier = malloc((1 + 256 + 1) * sizeof(unsigned char))) == NULL)
       {
           return(NULL);
       }
   
       sprintf(fichier, "/RPL-SIGSEMAPHORE-%d", (int) pid);
       return(fichier);
   }
   
   
 /*  /*
 ================================================================================  ================================================================================
   Fonctions d'émulation de sémaphores anonymes    Fonctions d'émulation de sémaphores anonymes
Line 37 Line 56
 */  */
   
 sem_t *  sem_t *
 sem_init2(unsigned int valeur, enum t_semaphore semaphore)  sem_init2(unsigned int valeur, pid_t pid)
 {  {
     snprintf(noms_semaphores[semaphore], LONGUEUR_NOM_SEMAPHORE,      sem_t                       *semaphore;
             "/RPL-SEM-%d-%llu-%d", (int) getpid(),  
             (unsigned long long) pthread_self(),      unsigned char               *chemin;
             (int) semaphore);      unsigned int                i;
     return(sem_open(noms_semaphores[semaphore], O_CREAT,  
             (S_IRUSR | S_IWUSR), valeur));      if ((chemin = nom_segment_semaphore(pid)) == NULL)
       {
           return(SEM_FAILED);
       }
   
       semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur);
       free(chemin);
   
       for(i = 0; i < valeur; i++)
       {
           if (sem_post(semaphore) != 0)
           {
               sem_close(semaphore);
               return(SEM_FAILED);
           }
       }
   
       return(semaphore);
 }  }
   
   
   sem_t *
   sem_open2(pid_t pid)
   {
       unsigned char               *chemin;
   
       sem_t                       *semaphore;
   
       if ((chemin = nom_segment_semaphore(pid)) == NULL)
       {
           return(1);
       }
   
       semaphore = sem_open(chemin, O_RDWR);
       free(chemin);
   
       return(semaphore);
   }
   
   
 int  int
 sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore)  sem_destroy2(sem_t *semaphore, pid_t pid)
 {  {
     sem_close(semaphore_p);      int                         erreur;
     return(sem_unlink(noms_semaphores[semaphore]));  
       unsigned char               *chemin;
   
       sem_close(semaphore);
   
       if ((chemin = nom_segment_semaphore(pid)) == NULL)
       {
           return(1);
       }
   
       erreur = sem_unlink(chemin);
       free(chemin);
   
       return(erreur);
 }  }
   
 #undef sem_post  #undef sem_post
Line 62  int Line 131  int
 sem_getvalue2(sem_t *semaphore, int *valeur)  sem_getvalue2(sem_t *semaphore, int *valeur)
 {  {
     int                     i;      int                     i;
       int                     j;
   
     logical1                drapeau_fin;      logical1                drapeau_fin;
   
     pthread_mutex_lock(&mutex_sem);      struct timespec         attente;
   
     (*valeur) = 0;      attente.tv_sec = 0;
     drapeau_fin = d_faux;      attente.tv_nsec = GRANULARITE_us * 1000;
   
     do      for(j = 0; j < 100; j++)
     {      {
         if (sem_trywait(semaphore) == -1)          if (pthread_mutex_trylock(&mutex_sem) == 0)
         {          {
             if (errno == EAGAIN)              (*valeur) = 0;
               drapeau_fin = d_faux;
   
               do
             {              {
                 // Le sémaphore avait une valeur nulle                  if (sem_trywait(semaphore) == -1)
                 drapeau_fin = d_vrai;                  {
             }                      if (errno == EAGAIN)
             else                      {
                           // Le sémaphore avait une valeur nulle
                           drapeau_fin = d_vrai;
                       }
                       else
                       {
                           // Autre erreur
                           pthread_mutex_unlock(&mutex_sem);
                           return(-1);
                       }
                   }
                   else
                   {
                       (*valeur)++;
                   }
               } while(drapeau_fin == d_faux);
   
               for(i = 0; i < (*valeur); i++)
             {              {
                 // Autre erreur                  if (sem_post(semaphore) != 0)
                 pthread_mutex_unlock(&mutex_sem);                  {
                 return(-1);                      pthread_mutex_unlock(&mutex_sem);
                       return(-1);
                   }
             }              }
         }  
         else  
         {  
             (*valeur)++;  
         }  
     } while(drapeau_fin == d_faux);  
   
     for(i = 0; i < (*valeur); i++)  
     {  
         if (sem_post(semaphore) != 0)  
         {  
             pthread_mutex_unlock(&mutex_sem);              pthread_mutex_unlock(&mutex_sem);
             return(-1);              return(0);
         }          }
   
           INCR_GRANULARITE(attente.tv_nsec);
     }      }
   
     pthread_mutex_unlock(&mutex_sem);      // Le mutex n'a pas pu être verrouillé. On peut raisonnablement penser
       // que le sémaphore est bloqué dans un sem_wait() protégé par ce mutex.
   
       (*valeur) = 0;
     return(0);      return(0);
 }  }
   

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


CVSweb interface <joel.bertrand@systella.fr>