Diff for /rpl/src/interruptions.c between versions 1.16 and 1.29

version 1.16, 2010/05/19 09:22:34 version 1.29, 2010/08/13 21:00:37
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.15    RPL/2 (R) version 4.0.18
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 125  insertion_thread(struct_processus *s_eta Line 125  insertion_thread(struct_processus *s_eta
     }      }
   
     (*l_nouvel_objet).suivant = liste_threads;      (*l_nouvel_objet).suivant = liste_threads;
   
     liste_threads = l_nouvel_objet;      liste_threads = l_nouvel_objet;
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
Line 184  insertion_thread_surveillance(struct_pro Line 183  insertion_thread_surveillance(struct_pro
         }          }
     }      }
   
       pthread_mutex_lock(&((*s_argument_thread).mutex));
       (*s_argument_thread).nombre_references++;
       pthread_mutex_unlock(&((*s_argument_thread).mutex));
   
     (*l_nouvel_objet).suivant = liste_threads_surveillance;      (*l_nouvel_objet).suivant = liste_threads_surveillance;
     (*l_nouvel_objet).donnee = (void *) s_argument_thread;      (*l_nouvel_objet).donnee = (void *) s_argument_thread;
   
Line 366  retrait_thread_surveillance(struct_proce Line 369  retrait_thread_surveillance(struct_proce
         return;          return;
     }      }
   
     // l_element_courant->donnee n'est pas bonne lorsque ça part en vrille.  
     if (l_element_precedent == NULL)      if (l_element_precedent == NULL)
     {      {
         liste_threads_surveillance = (*l_element_courant).suivant;          liste_threads_surveillance = (*l_element_courant).suivant;
Line 449  retrait_thread_surveillance(struct_proce Line 451  retrait_thread_surveillance(struct_proce
   
     pthread_sigmask(SIG_SETMASK, &oldset, NULL);      pthread_sigmask(SIG_SETMASK, &oldset, NULL);
     sigpending(&set);      sigpending(&set);
   
     return;      return;
 }  }
   
Line 670  liberation_threads(struct_processus *s_e Line 673  liberation_threads(struct_processus *s_e
                     .l_base_pile_processus;                      .l_base_pile_processus;
             while(element_courant != NULL)              while(element_courant != NULL)
             {              {
                 pthread_mutex_trylock(&((*(*((struct_liste_chainee *)                  s_argument_thread = (struct_descripteur_thread *)
                         element_courant)).donnee).mutex));                          (*((struct_liste_chainee *) element_courant)).donnee;
                 pthread_mutex_unlock(&((*(*((struct_liste_chainee *)  
                         element_courant)).donnee).mutex));                  if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
                 liberation(s_etat_processus,                  {
                         (*((struct_liste_chainee *) element_courant)).donnee);                      (*s_etat_processus).erreur_systeme = d_es_processus;
                       sem_post(&semaphore_liste_threads);
                       return;
                   }
   
                   (*s_argument_thread).nombre_references--;
   
                   BUG((*s_argument_thread).nombre_references < 0,
                           printf("(*s_argument_thread).nombre_references = %d\n",
                           (int) (*s_argument_thread).nombre_references));
   
                   if ((*s_argument_thread).nombre_references == 0)
                   {
                       close((*s_argument_thread).pipe_objets[0]);
                       close((*s_argument_thread).pipe_acquittement[1]);
                       close((*s_argument_thread).pipe_injections[1]);
                       close((*s_argument_thread).pipe_nombre_injections[1]);
                       close((*s_argument_thread).pipe_nombre_objets_attente[0]);
                       close((*s_argument_thread).pipe_interruptions[0]);
                       close((*s_argument_thread)
                               .pipe_nombre_interruptions_attente[0]);
   
                       if (pthread_mutex_unlock(&((*s_argument_thread).mutex))
                               != 0)
                       {
                           (*s_etat_processus).erreur_systeme = d_es_processus;
                           sem_post(&semaphore_liste_threads);
                           return;
                       }
   
                       pthread_mutex_destroy(&((*s_argument_thread).mutex));
   
                       if ((*s_argument_thread).processus_detache == d_faux)
                       {
                           if ((*s_argument_thread).destruction_objet == d_vrai)
                           {
                               liberation(s_etat_processus, (*s_argument_thread)
                                       .argument);
                           }
                       }
   
                       free(s_argument_thread);
                   }
                   else
                   {
                       if (pthread_mutex_unlock(&((*s_argument_thread).mutex))
                               != 0)
                       {
                           (*s_etat_processus).erreur_systeme = d_es_processus;
                           sem_post(&semaphore_liste_threads);
                           return;
                       }
                   }
   
                 element_suivant = (*((struct_liste_chainee *) element_courant))                  element_suivant = (*((struct_liste_chainee *) element_courant))
                         .suivant;                          .suivant;
                 free((struct_liste_chainee *) element_courant);                  free(element_courant);
                 element_courant = element_suivant;                  element_courant = element_suivant;
             }              }
   
               (*s_etat_processus).l_base_pile_processus = NULL;
   
             pthread_mutex_trylock(&((*(*s_etat_processus).indep).mutex));              pthread_mutex_trylock(&((*(*s_etat_processus).indep).mutex));
             pthread_mutex_unlock(&((*(*s_etat_processus).indep).mutex));              pthread_mutex_unlock(&((*(*s_etat_processus).indep).mutex));
             liberation(s_etat_processus, (*s_etat_processus).indep);              liberation(s_etat_processus, (*s_etat_processus).indep);
Line 1292  liberation_threads(struct_processus *s_e Line 1350  liberation_threads(struct_processus *s_e
         s_argument_thread = (struct_descripteur_thread *)          s_argument_thread = (struct_descripteur_thread *)
                 (*l_element_courant).donnee;                  (*l_element_courant).donnee;
   
         close((*s_argument_thread).pipe_objets[0]);  
         close((*s_argument_thread).pipe_acquittement[1]);  
         close((*s_argument_thread).pipe_injections[1]);  
         close((*s_argument_thread).pipe_nombre_injections[1]);  
         close((*s_argument_thread).pipe_nombre_objets_attente[0]);  
         close((*s_argument_thread).pipe_interruptions[0]);  
         close((*s_argument_thread).pipe_nombre_interruptions_attente[0]);  
   
         if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)          if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1315  liberation_threads(struct_processus *s_e Line 1365  liberation_threads(struct_processus *s_e
   
         if ((*s_argument_thread).nombre_references == 0)          if ((*s_argument_thread).nombre_references == 0)
         {          {
               close((*s_argument_thread).pipe_objets[0]);
               close((*s_argument_thread).pipe_acquittement[1]);
               close((*s_argument_thread).pipe_injections[1]);
               close((*s_argument_thread).pipe_nombre_injections[1]);
               close((*s_argument_thread).pipe_nombre_objets_attente[0]);
               close((*s_argument_thread).pipe_interruptions[0]);
               close((*s_argument_thread).pipe_nombre_interruptions_attente[0]);
   
             if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)              if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1323  liberation_threads(struct_processus *s_e Line 1381  liberation_threads(struct_processus *s_e
             }              }
   
             pthread_mutex_destroy(&((*s_argument_thread).mutex));              pthread_mutex_destroy(&((*s_argument_thread).mutex));
   
               if ((*s_argument_thread).processus_detache == d_faux)
               {
                   if ((*s_argument_thread).destruction_objet == d_vrai)
                   {
                       liberation(s_etat_processus, (*s_argument_thread).argument);
                   }
               }
   
             free(s_argument_thread);              free(s_argument_thread);
         }          }
         else          else
Line 1441  recherche_thread_principal(pid_t pid, pt Line 1508  recherche_thread_principal(pid_t pid, pt
 */  */
   
 // Les routines suivantes sont uniquement appelées depuis les gestionnaires  // Les routines suivantes sont uniquement appelées depuis les gestionnaires
 // des signaux asynchrones. Elles de doivent pas bloquer dans le cas où  // des signaux asynchrones. Elles ne doivent pas bloquer dans le cas où
 // les sémaphores sont déjà bloqués par un gestionnaire de signal.  // les sémaphores sont déjà bloqués par un gestionnaire de signal.
   
 static inline void  static inline void
Line 1666  interruption1(int signal, siginfo_t *sig Line 1733  interruption1(int signal, siginfo_t *sig
   
     volatile sig_atomic_t   exclusion = 0;      volatile sig_atomic_t   exclusion = 0;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     switch(signal)      switch(signal)
Line 1801  interruption2(int signal, siginfo_t *sig Line 1872  interruption2(int signal, siginfo_t *sig
     pthread_t               thread;      pthread_t               thread;
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if (siginfo == NULL)      if (siginfo == NULL)
Line 1874  interruption3(int signal, siginfo_t *sig Line 1949  interruption3(int signal, siginfo_t *sig
   
     static int              compteur = 0;      static int              compteur = 0;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 1932  interruption4(int signal, siginfo_t *sig Line 2011  interruption4(int signal, siginfo_t *sig
 {  {
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 1961  interruption5(int signal, siginfo_t *sig Line 2044  interruption5(int signal, siginfo_t *sig
     pthread_t               thread;      pthread_t               thread;
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((*siginfo).si_pid == getpid())      if ((*siginfo).si_pid == getpid())
Line 2023  interruption6(int signal, siginfo_t *sig Line 2110  interruption6(int signal, siginfo_t *sig
 {  {
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 2047  interruption7(int signal, siginfo_t *sig Line 2138  interruption7(int signal, siginfo_t *sig
 {  {
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 2075  interruption8(int signal, siginfo_t *sig Line 2170  interruption8(int signal, siginfo_t *sig
     pthread_t               thread;      pthread_t               thread;
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((*siginfo).si_pid == getpid())      if ((*siginfo).si_pid == getpid())
Line 2117  interruption9(int signal, siginfo_t *sig Line 2216  interruption9(int signal, siginfo_t *sig
 {  {
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 2132  interruption9(int signal, siginfo_t *sig Line 2235  interruption9(int signal, siginfo_t *sig
         fflush(stdout);          fflush(stdout);
     }      }
   
     pthread_kill((*s_etat_processus).tid_processus_pere, SIGFABORT);  
     deverrouillage_gestionnaire_signaux();      deverrouillage_gestionnaire_signaux();
       interruption11(signal, siginfo, context);
     return;      return;
 }  }
   
Line 2146  interruption10(int signal, siginfo_t *si Line 2249  interruption10(int signal, siginfo_t *si
   
     unsigned char           nom[8 + 64 + 1];      unsigned char           nom[8 + 64 + 1];
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)      if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) == NULL)
Line 2184  interruption11(int signal, siginfo_t *si Line 2291  interruption11(int signal, siginfo_t *si
     pthread_t               thread;      pthread_t               thread;
     struct_processus        *s_etat_processus;      struct_processus        *s_etat_processus;
   
   #   ifdef _BROKEN_SIGINFO
       (*siginfo).si_pid=getpid();
   #   endif
   
     verrouillage_gestionnaire_signaux();      verrouillage_gestionnaire_signaux();
   
     if ((*siginfo).si_pid == getpid())      if ((*siginfo).si_pid == getpid())

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


CVSweb interface <joel.bertrand@systella.fr>