Diff for /rpl/src/interruptions.c between versions 1.69 and 1.79

version 1.69, 2011/09/15 17:51:43 version 1.79, 2011/09/20 14:36:29
Line 59  static volatile struct_liste_chainee_vol Line 59  static volatile struct_liste_chainee_vol
         = NULL;          = NULL;
 static volatile int                             code_erreur_gsl = 0;  static volatile int                             code_erreur_gsl = 0;
   
 static unsigned char                            *racine_segment;  unsigned char                                   *racine_segment;
   
 static pthread_mutex_t                          mutex_interruptions  static pthread_mutex_t                          mutex_interruptions
         = PTHREAD_MUTEX_INITIALIZER;          = PTHREAD_MUTEX_INITIALIZER;
Line 324  verrouillage_threads_concurrents(struct_ Line 324  verrouillage_threads_concurrents(struct_
                 == getpid()) && (pthread_equal((*((struct_thread *)                  == getpid()) && (pthread_equal((*((struct_thread *)
                 (*l_element_courant).donnee)).tid, pthread_self()) == 0))                  (*l_element_courant).donnee)).tid, pthread_self()) == 0))
         {          {
             if (pthread_mutex_lock(&((*(*((struct_thread *) (*l_element_courant)  #           ifndef SEMAPHORES_NOMMES
                     .donnee)).s_etat_processus).mutex_fork)) == -1)                  while(sem_wait(&((*(*((struct_thread *) (*l_element_courant)
                           .donnee)).s_etat_processus).semaphore_fork)) == -1)
   #           else
                   while(sem_wait((*(*((struct_thread *) (*l_element_courant)
                           .donnee)).s_etat_processus).semaphore_fork) == -1)
   #           endif
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
Line 351  deverrouillage_threads_concurrents(struc Line 356  deverrouillage_threads_concurrents(struc
                 == getpid()) && (pthread_equal((*((struct_thread *)                  == getpid()) && (pthread_equal((*((struct_thread *)
                 (*l_element_courant).donnee)).tid, pthread_self()) == 0))                  (*l_element_courant).donnee)).tid, pthread_self()) == 0))
         {          {
             if (pthread_mutex_unlock(&((*(*((struct_thread *)  #           ifndef SEMAPHORES_NOMMES
                     (*l_element_courant).donnee)).s_etat_processus)                  if (sem_post(&((*(*((struct_thread *)
                     .mutex_fork)) != 0)                          (*l_element_courant).donnee)).s_etat_processus)
                           .semaphore_fork)) != 0)
   #           else
                   if (sem_post((*(*((struct_thread *)
                           (*l_element_courant).donnee)).s_etat_processus)
                           .semaphore_fork) != 0)
   #           endif
             {              {
                 if (pthread_mutex_unlock(&mutex_liste_threads) != 0)                  if (pthread_mutex_unlock(&mutex_liste_threads) != 0)
                 {                  {
Line 1109  liberation_threads(struct_processus *s_e Line 1120  liberation_threads(struct_processus *s_e
   
             liberation_allocateur(s_etat_processus);              liberation_allocateur(s_etat_processus);
   
             pthread_mutex_unlock(&((*s_etat_processus).mutex_fork));  #           ifndef SEMAPHORES_NOMMES
             pthread_mutex_destroy(&((*s_etat_processus).mutex_fork));                  sem_post(&((*s_etat_processus).semaphore_fork));
                   sem_destroy(&((*s_etat_processus).semaphore_fork));
   #           else
                   sem_post((*s_etat_processus).semaphore_fork);
                   sem_destroy2((*s_etat_processus).semaphore_fork, getpid());
   #           endif
   
             liberation_contexte_cas(s_etat_processus);              liberation_contexte_cas(s_etat_processus);
             free(s_etat_processus);              free(s_etat_processus);
Line 1298  verrouillage_gestionnaire_signaux(struct Line 1314  verrouillage_gestionnaire_signaux(struct
 {  {
     int         semaphore;      int         semaphore;
   
     if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0)  #   ifndef SEMAPHORES_NOMMES
       if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
   #   else
       if (sem_post((*s_etat_processus).semaphore_fork) != 0)
   #   endif
     {      {
         BUG(1, uprintf("Lock error !\n"));          BUG(1, uprintf("Lock error !\n"));
         return;          return;
Line 1308  verrouillage_gestionnaire_signaux(struct Line 1328  verrouillage_gestionnaire_signaux(struct
   
     if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) != 0)      if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) != 0)
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Unlock error !\n"));          BUG(1, uprintf("Unlock error !\n"));
         return;          return;
     }      }
Line 1319  verrouillage_gestionnaire_signaux(struct Line 1343  verrouillage_gestionnaire_signaux(struct
     if (sem_post(semaphore_gestionnaires_signaux) == -1)      if (sem_post(semaphore_gestionnaires_signaux) == -1)
 #   endif  #   endif
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Lock error !\n"));          BUG(1, uprintf("Lock error !\n"));
         return;          return;
     }      }
Line 1330  verrouillage_gestionnaire_signaux(struct Line 1358  verrouillage_gestionnaire_signaux(struct
     if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0)      if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0)
 #   endif  #   endif
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Lock error !\n"));          BUG(1, uprintf("Lock error !\n"));
         return;          return;
     }      }
   
     if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0)      if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0)
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Unlock error !\n"));          BUG(1, uprintf("Unlock error !\n"));
         return;          return;
     }      }
Line 1352  verrouillage_gestionnaire_signaux(struct Line 1388  verrouillage_gestionnaire_signaux(struct
   
         if (pthread_mutex_lock(&mutex_liste_threads) != 0)          if (pthread_mutex_lock(&mutex_liste_threads) != 0)
         {          {
             pthread_mutex_lock(&((*s_etat_processus).mutex_fork));              sem_wait(&((*s_etat_processus).semaphore_fork));
             BUG(1, uprintf("Lock error !\n"));              BUG(1, uprintf("Lock error !\n"));
             return;              return;
         }          }
Line 1370  deverrouillage_gestionnaire_signaux(stru Line 1406  deverrouillage_gestionnaire_signaux(stru
   
     if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) == -1)      if (pthread_mutex_lock(&mutex_gestionnaires_signaux_atomique) == -1)
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Unlock error !\n"));          BUG(1, uprintf("Unlock error !\n"));
         return;          return;
     }      }
Line 1381  deverrouillage_gestionnaire_signaux(stru Line 1421  deverrouillage_gestionnaire_signaux(stru
     if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0)      if (sem_getvalue(semaphore_gestionnaires_signaux, &semaphore) != 0)
 #   endif  #   endif
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Unlock error !\n"));          BUG(1, uprintf("Unlock error !\n"));
         return;          return;
     }      }
Line 1394  deverrouillage_gestionnaire_signaux(stru Line 1438  deverrouillage_gestionnaire_signaux(stru
     {      {
         if (errno != EINTR)          if (errno != EINTR)
         {          {
             pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #           ifndef SEMAPHORES_NOMMES
               sem_wait(&((*s_etat_processus).semaphore_fork));
   #           else
               sem_wait((*s_etat_processus).semaphore_fork);
   #           endif
             BUG(1, uprintf("Unlock error !\n"));              BUG(1, uprintf("Unlock error !\n"));
             return;              return;
         }          }
Line 1402  deverrouillage_gestionnaire_signaux(stru Line 1450  deverrouillage_gestionnaire_signaux(stru
   
     if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0)      if (pthread_mutex_unlock(&mutex_gestionnaires_signaux_atomique) != 0)
     {      {
         pthread_mutex_lock(&((*s_etat_processus).mutex_fork));  #       ifndef SEMAPHORES_NOMMES
           sem_wait(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_wait((*s_etat_processus).semaphore_fork);
   #       endif
         BUG(1, uprintf("Unlock error !\n"));          BUG(1, uprintf("Unlock error !\n"));
         return;          return;
     }      }
   
     if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0)  #   ifndef SEMAPHORES_NOMMES
       while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
   #   else
       while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
   #   endif
     {      {
         BUG(1, uprintf("Unlock error !\n"));          if (errno != EINTR)
         return;          {
               BUG(1, uprintf("Unlock error !\n"));
               return;
           }
     }      }
   
     if (semaphore == 1)      if (semaphore == 1)
Line 2172  static inline void Line 2231  static inline void
 envoi_interruptions(struct_processus *s_etat_processus, enum signaux_rpl signal,  envoi_interruptions(struct_processus *s_etat_processus, enum signaux_rpl signal,
         pid_t pid_source)          pid_t pid_source)
 {  {
 uprintf("Signal : %d\n", signal);  
     switch(signal)      switch(signal)
     {      {
         case rpl_signull:          case rpl_signull:
Line 2252  scrutation_interruptions(struct_processu Line 2310  scrutation_interruptions(struct_processu
     // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à      // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à
     // écrire.      // écrire.
   
     if (pthread_mutex_trylock(&((*s_queue_signaux).mutex)) == 0)  #   ifndef SEMAPHORES_NOMMES
           if (sem_trywait(&((*s_queue_signaux).semaphore)) == 0)
   #   else
           if (sem_trywait(semaphore_queue_signaux) == 0)
   #   endif
     {      {
         if ((*s_queue_signaux).pointeur_lecture !=          if ((*s_queue_signaux).pointeur_lecture !=
                 (*s_queue_signaux).pointeur_ecriture)                  (*s_queue_signaux).pointeur_ecriture)
Line 2267  scrutation_interruptions(struct_processu Line 2329  scrutation_interruptions(struct_processu
             (*s_queue_signaux).pointeur_lecture =              (*s_queue_signaux).pointeur_lecture =
                     ((*s_queue_signaux).pointeur_lecture + 1)                      ((*s_queue_signaux).pointeur_lecture + 1)
                     % LONGUEUR_QUEUE_SIGNAUX;                      % LONGUEUR_QUEUE_SIGNAUX;
 uprintf("Traité\n");  
         }          }
   
         pthread_mutex_unlock(&((*s_queue_signaux).mutex));  #       ifndef SEMAPHORES_NOMMES
               sem_post(&((*s_queue_signaux).semaphore));
   #       else
               sem_post(semaphore_queue_signaux);
   #       endif
     }      }
   
     // Interruptions qui arrivent depuis le groupe courant de threads.      // Interruptions qui arrivent depuis le groupe courant de threads.
Line 2349  nom_segment(unsigned char *chemin, pid_t Line 2414  nom_segment(unsigned char *chemin, pid_t
 }  }
   
   
   /*
   ================================================================================
     Fonctions d'envoi d'un signal à un thread ou à un processus.
   ================================================================================
     Entrée : processus et signal
   --------------------------------------------------------------------------------
     Sortie : erreur
   --------------------------------------------------------------------------------
     Effet de bord : Néant
   ================================================================================
   */
   
 int  int
 envoi_signal_processus(pid_t pid, enum signaux_rpl signal)  envoi_signal_processus(pid_t pid, enum signaux_rpl signal)
 {  {
     int                             segment;      int                             segment;
   
   #   ifndef IPCS_SYSV
   #       ifdef SEMAPHORES_NOMMES
               sem_t                   *semaphore;
   #       endif
   #   else
           int                         desc;
           key_t                       clef;
   #   endif
   
     struct_queue_signaux            *queue;      struct_queue_signaux            *queue;
   
     unsigned char                   *nom;      unsigned char                   *nom;
Line 2370  envoi_signal_processus(pid_t pid, enum s Line 2456  envoi_signal_processus(pid_t pid, enum s
             return(1);              return(1);
         }          }
   
         if (pthread_mutex_lock(&((*s_queue_signaux).mutex)) != 0)  #       ifndef SEMAPHORES_NOMMES
               while(sem_wait(&((*s_queue_signaux).semaphore)) != 0)
   #       else
               while(sem_wait(semaphore_queue_signaux) != 0)
   #       endif
         {          {
             return(1);              if (errno != EINTR)
               {
                   return(1);
               }
         }          }
   
         (*s_queue_signaux).queue[(*s_queue_signaux).pointeur_ecriture]          (*s_queue_signaux).queue[(*s_queue_signaux).pointeur_ecriture]
Line 2384  envoi_signal_processus(pid_t pid, enum s Line 2477  envoi_signal_processus(pid_t pid, enum s
                 ((*s_queue_signaux).pointeur_ecriture + 1)                  ((*s_queue_signaux).pointeur_ecriture + 1)
                 % LONGUEUR_QUEUE_SIGNAUX;                  % LONGUEUR_QUEUE_SIGNAUX;
   
         if (pthread_mutex_unlock(&((*s_queue_signaux).mutex)) != 0)  #       ifndef SEMAPHORES_NOMMES
               if (sem_post(&((*s_queue_signaux).semaphore)) != 0)
   #       else
               if (sem_post(semaphore_queue_signaux) != 0)
   #       endif
         {          {
             return(1);              return(1);
         }          }
Line 2393  envoi_signal_processus(pid_t pid, enum s Line 2490  envoi_signal_processus(pid_t pid, enum s
     {      {
         // Le signal est envoyé depuis un processus distinct.          // Le signal est envoyé depuis un processus distinct.
   
         if ((nom = nom_segment(racine_segment, pid)) == NULL)  #       ifdef IPCS_SYSV
         {              if ((nom = nom_segment(racine_segment, pid)) == NULL)
             return(1);              {
         }                  return(1);
               }
   
               if ((desc = open(nom, O_RDWR)) == -1)
               {
                   free(nom);
                   return(1);
               }
   
               close(desc);
   
               if ((clef = ftok(nom, 1)) == -1)
               {
                   free(nom);
                   return(1);
               }
   
         if ((segment = shm_open(nom, O_RDWR, 0)) == -1)  
         {  
             free(nom);              free(nom);
             return(1);  
         }  
   
         free(nom);              if ((segment = shmget(clef, sizeof(struct_queue_signaux), 0)) == -1)
               {
                   return(1);
               }
   
         if ((queue = mmap(NULL, sizeof(struct_queue_signaux),              queue = shmat(segment, NULL, 0);
                 PROT_READ | PROT_WRITE, MAP_SHARED, segment, 0)) ==  #       else // POSIX
                 MAP_FAILED)              if ((nom = nom_segment(racine_segment, pid)) == NULL)
         {              {
             close(segment);                  return(1);
             return(1);              }
         }  
   
 uprintf("Lock\n");              if ((segment = shm_open(nom, O_RDWR, 0)) == -1)
         if (pthread_mutex_lock(&((*queue).mutex)) != 0)              {
         {                  free(nom);
 uprintf("Unlock (error)\n");                  return(1);
             return(1);              }
         }  
               free(nom);
   
               if ((queue = mmap(NULL, sizeof(struct_queue_signaux),
                       PROT_READ | PROT_WRITE, MAP_SHARED, segment, 0)) ==
                       MAP_FAILED)
               {
                   close(segment);
                   return(1);
               }
   #       endif
   
               // À ce moment, le segment de mémoire partagée est projeté
               // dans l'espace du processus.
   
   #       ifndef IPCS_SYSV // POSIX
   #           ifndef SEMAPHORES_NOMMES
                   while(sem_wait(&((*queue).semaphore)) != 0)
                   {
                       if (errno != EINTR)
                       {
                           return(1);
                       }
                   }
   #           else
                   if ((semaphore = sem_open2(pid)) == SEM_FAILED)
                   {
                       return(1);
                   }
   
                   while(sem_wait(semaphore) != 0)
                   {
                       if (errno != EINTR)
                       {
                           sem_close(semaphore);
                           return(1);
                       }
                   }
   #           endif
   #       else // IPCS_SYSV
               while(sem_wait(&((*queue).semaphore)) != 0)
               {
                   if (errno != EINTR)
                   {
                       return(1);
                   }
               }
   #       endif
   
         (*queue).queue[(*queue).pointeur_ecriture].pid = getpid();          (*queue).queue[(*queue).pointeur_ecriture].pid = getpid();
         (*queue).queue[(*queue).pointeur_ecriture].signal = signal;          (*queue).queue[(*queue).pointeur_ecriture].signal = signal;
Line 2427  uprintf("Unlock (error)\n"); Line 2584  uprintf("Unlock (error)\n");
         (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)          (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1)
                 % LONGUEUR_QUEUE_SIGNAUX;                  % LONGUEUR_QUEUE_SIGNAUX;
   
 uprintf("Unlock\n");  #       ifndef IPCS_SYSV // POSIX
         if (pthread_mutex_unlock(&((*queue).mutex)) != 0)  #           ifndef SEMAPHORES_NOMMES
         {                  if (sem_post(&((*queue).semaphore)) != 0)
 uprintf("Unlock failed\n");                  {
             return(1);                      return(1);
         }                  }
   #           else
                   if (sem_post(semaphore) != 0)
                   {
                       sem_close(semaphore);
                       return(1);
                   }
   
         if (munmap(queue, sizeof(struct_queue_signaux)) != 0)                  if (sem_close(semaphore) != 0)
         {                  {
             close(segment);                      return(1);
             return(1);                  }
         }  #           endif
   
         close(segment);              if (munmap(queue, sizeof(struct_queue_signaux)) != 0)
               {
                   close(segment);
                   return(1);
               }
   #       else // IPCS_SYSV
               if (sem_post(&((*queue).semaphore)) != 0)
               {
                   return(1);
               }
   
               if (shmdt(queue) != 0)
               {
                   return(1);
               }
   #       endif
     }      }
   
     return(0);      return(0);
Line 2542  envoi_signal_contexte(struct_processus * Line 2720  envoi_signal_contexte(struct_processus *
 void  void
 creation_queue_signaux(struct_processus *s_etat_processus)  creation_queue_signaux(struct_processus *s_etat_processus)
 {  {
     pthread_mutexattr_t             attributs_mutex;  
   
     unsigned char                   *nom;      unsigned char                   *nom;
   
     racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;      racine_segment = (*s_etat_processus).chemin_fichiers_temporaires;
   
 #   ifndef IPCS_SYSV // POSIX  #   ifndef IPCS_SYSV // POSIX
           if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,
                   getpid())) == NULL)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,          if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL,
             getpid())) == NULL)                  S_IRUSR | S_IWUSR)) == -1)
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL,  
             S_IRUSR | S_IWUSR)) == -1)  
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1)  
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux),  
             PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0);  
   
     if (((void *) s_queue_signaux) == ((void *) -1))  
     {  
         if (shm_unlink(nom) == -1)  
         {          {
             free(nom);              free(nom);
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
         }          }
   
         free(nom);          if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1)
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;          {
         return;              free(nom);
     }              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
     free(nom);          }
   
     pthread_mutexattr_init(&attributs_mutex);  
     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);  
     pthread_mutex_init(&((*s_queue_signaux).mutex), &attributs_mutex);  
     pthread_mutexattr_destroy(&attributs_mutex);  
   
     (*s_queue_signaux).pointeur_lecture = 0;  
     (*s_queue_signaux).pointeur_ecriture = 0;  
   
     if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0))          s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux),
     {                  PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0);
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
 #   else // SystemV          if (((void *) s_queue_signaux) == ((void *) -1))
 #   ifndef OS2          {
               if (shm_unlink(nom) == -1)
               {
                   free(nom);
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     file                            *desc;              free(nom);
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     key_t                           clef;          free(nom);
   
     // Création d'un segment de données associé au PID du processus courant  #       ifndef SEMAPHORES_NOMMES
               sem_init(&((*s_queue_signaux).semaphore), 1, 1);
   #       else
               if ((semaphore_queue_signaux = sem_init2(1, getpid()))
                       == SEM_FAILED)
               {
                   (*s_etat_processus).erreur_systeme = d_es_processus;
                   return;
               }
   #       endif
   
     chemin = (*s_etat_processus).chemin_fichiers_temporaires;          (*s_queue_signaux).pointeur_lecture = 0;
           (*s_queue_signaux).pointeur_ecriture = 0;
   
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,          if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0))
             getpid())) == NULL)          {
     {              (*s_etat_processus).erreur_systeme = d_es_processus;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              return;
         return;          }
     }  #   else // IPCS_SYSV
   #       ifndef OS2
               int                             segment;
               int                             support;
   
     if ((desc = fopen(nom, "w")) == NULL)              key_t                           clef;
     {  
         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;  
         return;  
     }  
   
     fclose(desc);              // Création d'un segment de données associé au PID du processus
               // courant
   
     if ((clef = ftok(nom, 1)) == -1)              if ((nom = nom_segment((*s_etat_processus)
     {                      .chemin_fichiers_temporaires, getpid())) == NULL)
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              {
         return;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
     }                  return;
               }
   
     free(nom);              if ((support = open(nom, O_RDWR | O_CREAT | O_EXCL,
                       S_IRUSR | S_IWUSR)) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   return;
               }
   
     if ((segment = shmget(clef,              if ((clef = ftok(nom, 1)) == -1)
             nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int),              {
             IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
     {                  return;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              }
         return;  
     }  
   
     fifos = shmat(segment, NULL, 0);              close(support);
               free(nom);
   
     if (((void *) fifos) == ((void *) -1))              if ((segment = shmget(clef, sizeof(struct_queue_signaux),
     {                      IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1)
         if (shmctl(segment, IPC_RMID, 0) == -1)              {
         {                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  return;
             return;              }
         }  
   
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              s_queue_signaux = shmat(segment, NULL, 0);
         return;              f_queue_signaux = segment;
     }  
   
 #   else              if (((void *) s_queue_signaux) == ((void *) -1))
               {
                   if (shmctl(f_queue_signaux, IPC_RMID, 0) == -1)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
     if ((nom = nom_segment(NULL, getpid())) == NULL)                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
     {                  return;
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              }
         return;  
     }  
   
     if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues *              sem_init(&((*s_queue_signaux).semaphore), 1, 1);
             ((2 * longueur_queue) + 4) * sizeof(int),              (*s_queue_signaux).pointeur_lecture = 0;
             PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)              (*s_queue_signaux).pointeur_ecriture = 0;
     {  #       else // OS/2
         free(nom);              if ((nom = nom_segment(NULL, getpid())) == NULL)
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              {
         return;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
     }                  return;
               }
   
     free(nom);              if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues *
     fifos = ptr_os2;                      ((2 * longueur_queue) + 4) * sizeof(int),
                       PAG_WRITE | PAG_READ | PAG_COMMIT) != 0)
               {
                   free(nom);
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
 #   endif              free(nom);
               fifos = ptr_os2;
   #       endif
 #   endif  #   endif
   
     return;      return;
Line 2706  liberation_queue_signaux(struct_processu Line 2887  liberation_queue_signaux(struct_processu
 {  {
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
 #       ifndef OS2  #       ifndef OS2
               if (shmdt(s_queue_signaux) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
 #       else // OS/2  #       else // OS/2
 #       endif  #       endif
 #   else // POSIX  #   else // POSIX
   #       ifndef SEMAPHORES_NOMMES
               sem_close(&((*s_queue_signaux).semaphore));
   #       else
               sem_close(semaphore_queue_signaux);
   #       endif
   
         if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)          if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
Line 2741  destruction_queue_signaux(struct_process Line 2933  destruction_queue_signaux(struct_process
     unsigned char       *nom;      unsigned char       *nom;
   
 #   ifdef IPCS_SYSV // SystemV  #   ifdef IPCS_SYSV // SystemV
 #   ifndef OS2  #       ifndef OS2
               // Il faut commencer par éliminer le sémaphore.
     if (shmdt(fifos) == -1)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     if (shmctl(segment, IPC_RMID, 0) == -1)              if (semctl((*s_queue_signaux).semaphore.sem, 0, IPC_RMID) == -1)
     {              {
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_processus;
         return;                  return;
     }              }
   
     if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires,              unlink((*s_queue_signaux).semaphore.path);
             getpid())) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     // FERMER LE FICHIER              if (shmdt(s_queue_signaux) == -1)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     unlink(nom);              if (shmctl(f_queue_signaux, IPC_RMID, 0) == -1)
     free(nom);              {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
 #   else              if ((nom = nom_segment((*s_etat_processus)
                       .chemin_fichiers_temporaires, getpid())) == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     if (DosFreeMem(fifos) != 0)              unlink(nom);
     {              free(nom);
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  #       else
         return;              if (DosFreeMem(fifos) != 0)
     }              {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
     // FERMER LE FICHIER          // FERMER LE FICHIER
   
 #   endif  #       endif
 #   else // POSIX  #   else // POSIX
   #       ifndef SEMAPHORES_NOMMES
               sem_close(&((*s_queue_signaux).semaphore));
               sem_destroy(&((*s_queue_signaux).semaphore));
   #       else
               sem_close(semaphore_queue_signaux);
               sem_destroy2(semaphore_queue_signaux, getpid());
   #       endif
   
     if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)          if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0)
     {          {
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         return;              return;
     }          }
   
     if ((nom = nom_segment(NULL, getpid())) == NULL)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     close(f_queue_signaux);          if ((nom = nom_segment(NULL, getpid())) == NULL)
           {
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
     if (shm_unlink(nom) != 0)          close(f_queue_signaux);
     {  
         free(nom);  
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
         return;  
     }  
   
     free(nom);          if (shm_unlink(nom) != 0)
           {
               free(nom);
               (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
               return;
           }
   
           free(nom);
 #   endif  #   endif
   
     return;      return;

Removed from v.1.69  
changed lines
  Added in v.1.79


CVSweb interface <joel.bertrand@systella.fr>