Diff for /rpl/src/gestion_threads.c between versions 1.68 and 1.80

version 1.68, 2012/10/05 13:12:38 version 1.80, 2013/05/22 09:05:20
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.11    RPL/2 (R) version 4.1.14
   Copyright (C) 1989-2012 Dr. BERTRAND Joël    Copyright (C) 1989-2013 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 38 Line 38
 void *  void *
 lancement_thread(void *argument)  lancement_thread(void *argument)
 {  {
     int                         status;      int                                 status;
   
     pid_t                       ppid;      pid_t                               ppid;
   
     pthread_t                   tid_final;      sig_atomic_t                        registre_stop;
   
     sig_atomic_t                registre_stop;      ssize_t                             longueur_ecriture;
   
     ssize_t                     longueur_ecriture;      struct_descripteur_thread           *s_argument_thread;
   
     struct_descripteur_thread   *s_argument_thread;      struct_liste_chainee                *l_element_courant;
       struct_liste_chainee                *l_element_suivant;
   
     struct_liste_chainee        *l_element_courant;      struct_liste_variables_statiques    *l_element_statique_courant;
     struct_liste_chainee        *l_element_suivant;      struct_liste_variables_statiques    *l_element_statique_suivant;
   
     struct_objet                *s_objet_temporaire;      struct_objet                        *s_objet_temporaire;
   
     struct_processus            *s_etat_processus;      struct_processus                    *s_etat_processus;
   
     struct sigaction            action;      struct sigaction                    action;
     struct sigaction            registre;      struct sigaction                    registre;
   
     struct timespec             attente;      struct timespec                     attente;
   
     unsigned char               *message;      unsigned char                       caractere;
       unsigned char                       *message;
   
     unsigned int                erreur;      unsigned int                        erreur;
   
     unsigned long               i;      integer8                            i;
   
     attente.tv_sec = 0;      attente.tv_sec = 0;
     attente.tv_nsec = GRANULARITE_us * 1000;      attente.tv_nsec = GRANULARITE_us * 1000;
Line 86  lancement_thread(void *argument) Line 88  lancement_thread(void *argument)
 #   endif  #   endif
   
     (*s_argument_thread).tid = pthread_self();      (*s_argument_thread).tid = pthread_self();
       insertion_thread(s_etat_processus, d_faux);
   
       if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return(NULL);
       }
   
     (*s_argument_thread).thread_actif = d_vrai;      (*s_argument_thread).thread_actif = d_vrai;
   
     insertion_thread(s_etat_processus, d_faux);      if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return(NULL);
       }
   
     // Envoi d'une donnée pour signaler le démarrage du thread au thread      // Envoi d'une donnée pour signaler le démarrage du thread au thread
     // de surveillance.      // de surveillance.
   
       caractere = 0;
   
     if (write_atomic(s_etat_processus,      if (write_atomic(s_etat_processus,
             (*s_argument_thread).pipe_nombre_objets_attente[1],              (*s_argument_thread).pipe_nombre_elements_attente[1],
             "-", sizeof(unsigned char)) != sizeof(unsigned char))              &caractere, sizeof(caractere)) != sizeof(caractere))
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
   
Line 104  lancement_thread(void *argument) Line 120  lancement_thread(void *argument)
   
         (*s_argument_thread).thread_actif = d_faux;          (*s_argument_thread).thread_actif = d_faux;
   
         tid_final = (pthread_t) -2;  
   
         while((longueur_ecriture = write_atomic(s_etat_processus,  
                 (*s_argument_thread).pipe_nombre_interruptions_attente[1],  
                 &tid_final, sizeof(tid_final))) != sizeof(tid_final))  
         {  
             if (longueur_ecriture == -1)  
             {  
                 break;  
             }  
         }  
   
         while((longueur_ecriture = write_atomic(s_etat_processus,          while((longueur_ecriture = write_atomic(s_etat_processus,
                 (*s_argument_thread).pipe_nombre_objets_attente[1],                  (*s_argument_thread).pipe_nombre_elements_attente[1],
                 &tid_final, sizeof(tid_final))) != sizeof(tid_final))                  &caractere, sizeof(caractere))) != sizeof(caractere))
         {          {
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
             {              {
Line 186  lancement_thread(void *argument) Line 190  lancement_thread(void *argument)
             }              }
             else              else
             {              {
                 if (((*s_etat_processus).var_volatile_alarme == 0)                  if (((*s_etat_processus).arret_depuis_abort == 0)
                         && ((*s_etat_processus).arret_depuis_abort == 0)  
                         && ((*s_etat_processus).at_exit != NULL))                          && ((*s_etat_processus).at_exit != NULL))
                 {                  {
                     (*s_etat_processus).var_volatile_requete_arret = 0;                      (*s_etat_processus).var_volatile_requete_arret = 0;
                     (*s_etat_processus).var_volatile_traitement_retarde_stop =                      (*s_etat_processus).var_volatile_alarme = 0;
                             -1;                      (*s_etat_processus).var_volatile_traitement_sigint = 0;
   
                       if ((*s_etat_processus).profilage == d_vrai)
                       {
                           profilage(s_etat_processus, "ATEXIT");
                       }
   
                     if (evaluation(s_etat_processus,                      if (evaluation(s_etat_processus,
                             (*s_etat_processus).at_exit, 'E') == d_erreur)                              (*s_etat_processus).at_exit, 'E') == d_erreur)
Line 204  lancement_thread(void *argument) Line 212  lancement_thread(void *argument)
                                     d_ex_erreur_evaluation;                                      d_ex_erreur_evaluation;
                         }                          }
                     }                      }
   
                       if ((*s_etat_processus).profilage == d_vrai)
                       {
                           profilage(s_etat_processus, NULL);
                       }
                 }                  }
             }              }
         }          }
Line 219  lancement_thread(void *argument) Line 232  lancement_thread(void *argument)
         pthread_cancel((*s_etat_processus).thread_fusible);          pthread_cancel((*s_etat_processus).thread_fusible);
     }      }
   
     tid_final = (pthread_t) -2;      caractere = 0;
   
     while((longueur_ecriture = write_atomic(s_etat_processus,      while((longueur_ecriture = write_atomic(s_etat_processus,
             (*s_argument_thread).pipe_nombre_interruptions_attente[1],              (*s_argument_thread).pipe_nombre_elements_attente[1],
             &tid_final, sizeof(tid_final))) != sizeof(tid_final))              &caractere, sizeof(caractere))) != sizeof(caractere))
     {  
         if (longueur_ecriture == -1)  
         {  
             break;  
         }  
     }  
   
     while((longueur_ecriture = write_atomic(s_etat_processus,  
             (*s_argument_thread).pipe_nombre_objets_attente[1],  
             &tid_final, sizeof(tid_final))) != sizeof(tid_final))  
     {      {
         if (longueur_ecriture == -1)          if (longueur_ecriture == -1)
         {          {
Line 262  lancement_thread(void *argument) Line 265  lancement_thread(void *argument)
     {      {
         while((longueur_ecriture = write_atomic(s_etat_processus,          while((longueur_ecriture = write_atomic(s_etat_processus,
                 (*s_argument_thread).pipe_erreurs[1],                  (*s_argument_thread).pipe_erreurs[1],
                 &((*s_etat_processus).erreur_execution),                  (int *) &((*s_etat_processus).erreur_execution),
                 sizeof((*s_etat_processus).erreur_execution))) !=                  sizeof((*s_etat_processus).erreur_execution))) !=
                 sizeof((*s_etat_processus).erreur_execution))                  sizeof((*s_etat_processus).erreur_execution))
         {          {
Line 294  lancement_thread(void *argument) Line 297  lancement_thread(void *argument)
     {      {
         while((longueur_ecriture = write_atomic(s_etat_processus,          while((longueur_ecriture = write_atomic(s_etat_processus,
                 (*s_argument_thread).pipe_erreurs[1],                  (*s_argument_thread).pipe_erreurs[1],
                 &((*s_etat_processus).erreur_systeme),                  (int *) &((*s_etat_processus).erreur_systeme),
                 sizeof((*s_etat_processus).erreur_systeme))) !=                  sizeof((*s_etat_processus).erreur_systeme))) !=
                 sizeof((*s_etat_processus).erreur_systeme))                  sizeof((*s_etat_processus).erreur_systeme))
         {          {
Line 336  lancement_thread(void *argument) Line 339  lancement_thread(void *argument)
   
     close((*s_argument_thread).pipe_erreurs[1]);      close((*s_argument_thread).pipe_erreurs[1]);
     close((*s_argument_thread).pipe_interruptions[1]);      close((*s_argument_thread).pipe_interruptions[1]);
     close((*s_argument_thread).pipe_nombre_interruptions_attente[1]);      close((*s_argument_thread).pipe_nombre_elements_attente[1]);
     close((*s_argument_thread).pipe_objets[1]);      close((*s_argument_thread).pipe_objets[1]);
     close((*s_argument_thread).pipe_nombre_objets_attente[1]);  
     close((*s_argument_thread).pipe_injections[0]);      close((*s_argument_thread).pipe_injections[0]);
     close((*s_argument_thread).pipe_nombre_injections[0]);      close((*s_argument_thread).pipe_nombre_injections[0]);
     close((*s_argument_thread).pipe_acquittement[0]);      close((*s_argument_thread).pipe_acquittement[0]);
Line 575  lancement_thread(void *argument) Line 577  lancement_thread(void *argument)
                 .var_volatile_traitement_retarde_stop;                  .var_volatile_traitement_retarde_stop;
         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;          (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
   
         for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)          for(i = 0; i < (*(*((struct_processus_fils *)
                 (*(*l_element_courant).donnee).objet)).thread)                  (*(*l_element_courant).donnee).objet)).thread)
                 .nombre_objets_dans_pipe; i++)                  .nombre_objets_dans_pipe; i++)
         {          {
Line 813  lancement_thread(void *argument) Line 815  lancement_thread(void *argument)
     liberation_arbre_variables(s_etat_processus,      liberation_arbre_variables(s_etat_processus,
             (*s_etat_processus).s_arbre_variables, d_faux);              (*s_etat_processus).s_arbre_variables, d_faux);
   
       l_element_statique_courant = (*s_etat_processus)
               .l_liste_variables_statiques;
   
       while(l_element_statique_courant != NULL)
       {
           l_element_statique_suivant = (*l_element_statique_courant).suivant;
           free(l_element_statique_courant);
           l_element_statique_courant = l_element_statique_suivant;
       }
   
     l_element_courant = (*s_etat_processus).l_base_pile;      l_element_courant = (*s_etat_processus).l_base_pile;
     while(l_element_courant != NULL)      while(l_element_courant != NULL)
     {      {

Removed from v.1.68  
changed lines
  Added in v.1.80


CVSweb interface <joel.bertrand@systella.fr>