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

version 1.30, 2011/09/18 18:06:01 version 1.31, 2011/09/18 18:45:31
Line 131  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;
   
     // Si on ne peut pas décrémenter le sémaphore, c'est qu'il était      struct timespec         attente;
     // déjà nul.  
     pthread_mutex_lock(&mutex_sem);  
   
     (*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.30  
changed lines
  Added in v.1.31


CVSweb interface <joel.bertrand@systella.fr>