Diff for /rpl/src/semaphores.c between versions 1.28 and 1.29

version 1.28, 2011/08/09 11:31:37 version 1.29, 2011/09/18 12:42:50
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)
   {
       sem_t                       *semaphore;
   
       unsigned char               *chemin;
   
       if ((chemin = nom_segment_semaphore(pid)) == NULL)
       {
           return(SEM_FAILED);
       }
   
       semaphore = sem_open(chemin, O_CREAT, (S_IRUSR | S_IWUSR), valeur);
       free(chemin);
   
       return(semaphore);
   }
   
   
   sem_t *
   sem_open2(pid_t pid)
 {  {
     snprintf(noms_semaphores[semaphore], LONGUEUR_NOM_SEMAPHORE,      unsigned char               *chemin;
             "/RPL-SEM-%d-%llu-%d", (int) getpid(),  
             (unsigned long long) pthread_self(),      sem_t                       *semaphore;
             (int) semaphore);  
     return(sem_open(noms_semaphores[semaphore], O_CREAT,      if ((chemin = nom_segment_semaphore(pid)) == NULL)
             (S_IRUSR | S_IWUSR), valeur));      {
           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 65  sem_getvalue2(sem_t *semaphore, int *val Line 124  sem_getvalue2(sem_t *semaphore, int *val
   
     logical1                drapeau_fin;      logical1                drapeau_fin;
   
       // Si on ne peut pas décrémenter le sémaphore, c'est qu'il était
       // déjà nul.
     pthread_mutex_lock(&mutex_sem);      pthread_mutex_lock(&mutex_sem);
   
     (*valeur) = 0;      (*valeur) = 0;

Removed from v.1.28  
changed lines
  Added in v.1.29


CVSweb interface <joel.bertrand@systella.fr>