Diff for /rpl/src/instructions_d5.c between versions 1.73 and 1.97

version 1.73, 2011/09/20 15:45:53 version 1.97, 2012/12/13 16:59:41
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.3    RPL/2 (R) version 4.1.11
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 814  instruction_der(struct_processus *s_etat Line 814  instruction_der(struct_processus *s_etat
 void  void
 instruction_detach(struct_processus *s_etat_processus)  instruction_detach(struct_processus *s_etat_processus)
 {  {
     int                         pipe_initialisation_segment_signaux[2];      int                                 pipe_initialisation_segment_signaux[2];
   
     logical1                    drapeau;      logical1                            drapeau;
     logical1                    variable_partagee;  
   
     pid_t                       ppid;      pid_t                               ppid;
     pid_t                       pid_final;      pid_t                               pid_final;
   
     pthread_attr_t              attributs;      pthread_attr_t                      attributs;
   
     pthread_mutexattr_t         attributs_mutex;      pthread_mutexattr_t                 attributs_mutex;
   
     pthread_t                   thread_surveillance;      pthread_t                           thread_surveillance;
   
     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_descripteur_thread   *s_argument_thread2;      struct_descripteur_thread           *s_argument_thread2;
   
     struct_liste_chainee        *l_element_courant;      struct_liste_chainee                *l_element_courant;
     struct_liste_chainee        *l_element_precedent;      struct_liste_chainee                *l_element_precedent;
     struct_liste_chainee        *l_element_suivant;      struct_liste_chainee                *l_element_suivant;
   
     struct_objet                *s_copie;      struct_liste_variables_statiques    *l_element_statique_courant;
     struct_objet                *s_objet;      struct_liste_variables_statiques    *l_element_statique_suivant;
     struct_objet                *s_objet_systeme;  
     struct_objet                *s_objet_temporaire;  
   
     struct sigaction            action;      struct_objet                        *s_copie;
     struct sigaction            registre;      struct_objet                        *s_objet;
       struct_objet                        *s_objet_systeme;
       struct_objet                        *s_objet_temporaire;
   
     struct timespec             attente;      struct sigaction                    action;
       struct sigaction                    registre;
   
     unsigned char               caractere;      struct timespec                     attente;
     unsigned char               *message;  
   
     unsigned int                erreur;      unsigned char                       caractere;
       unsigned char                       *message;
   
     unsigned long               i;      unsigned int                        erreur;
   
       unsigned long                       i;
   
       volatile logical1                   variable_partagee;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
Line 930  instruction_detach(struct_processus *s_e Line 934  instruction_detach(struct_processus *s_e
             if ((*(*s_etat_processus).pointeur_variable_courante).objet              if ((*(*s_etat_processus).pointeur_variable_courante).objet
                     == NULL)                      == NULL)
             {              {
                 if (pthread_mutex_lock(&((*(*s_etat_processus)  
                         .s_liste_variables_partagees).mutex)) != 0)  
                 {  
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
   
                 if (recherche_variable_partagee(s_etat_processus,                  if (recherche_variable_partagee(s_etat_processus,
                         (*(*s_etat_processus).pointeur_variable_courante).nom,                          (*(*s_etat_processus).pointeur_variable_courante).nom,
                         (*(*s_etat_processus).pointeur_variable_courante)                          (*(*s_etat_processus).pointeur_variable_courante)
                         .variable_partagee, (*(*s_etat_processus)                          .variable_partagee, (*(*s_etat_processus)
                         .pointeur_variable_courante).origine) == d_faux)                          .pointeur_variable_courante).origine) == d_faux)
                 {                  {
                     if (pthread_mutex_unlock(&((*(*s_etat_processus)  
                             .s_liste_variables_partagees).mutex)) != 0)  
                     {  
                         (*s_etat_processus).erreur_systeme = d_es_processus;  
                         return;  
                     }  
   
                     liberation(s_etat_processus, s_objet);                      liberation(s_etat_processus, s_objet);
   
                     (*s_etat_processus).erreur_systeme = d_es;                      (*s_etat_processus).erreur_systeme = d_es;
Line 958  instruction_detach(struct_processus *s_e Line 948  instruction_detach(struct_processus *s_e
                     return;                      return;
                 }                  }
   
                 if (((*(*(*s_etat_processus).s_liste_variables_partagees)                  if (((*(*(*s_etat_processus)
                         .table[(*(*s_etat_processus)                          .pointeur_variable_partagee_courante).objet).type
                         .s_liste_variables_partagees).position_variable].objet)                          == RPN) && ((*(*(*s_etat_processus)
                         .type != RPN) && ((*(*(*s_etat_processus)                          .pointeur_variable_partagee_courante).objet).type
                         .s_liste_variables_partagees).table                          == ADR))
                         [(*(*s_etat_processus).s_liste_variables_partagees)  
                         .position_variable].objet).type != ADR))  
                 {                  {
                     if (pthread_mutex_unlock(&((*(*s_etat_processus)                      if (pthread_mutex_unlock(&((*(*s_etat_processus)
                             .s_liste_variables_partagees).mutex)) != 0)                              .pointeur_variable_partagee_courante).mutex)) != 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 981  instruction_detach(struct_processus *s_e Line 969  instruction_detach(struct_processus *s_e
                 }                  }
   
                 if ((s_copie = copie_objet(s_etat_processus,                  if ((s_copie = copie_objet(s_etat_processus,
                         (*(*s_etat_processus).s_liste_variables_partagees).table                          (*(*s_etat_processus)
                         [(*(*s_etat_processus).s_liste_variables_partagees)                          .pointeur_variable_partagee_courante).objet, 'P'))
                         .position_variable].objet, 'P')) == NULL)                          == NULL)
                 {                  {
                     if (pthread_mutex_unlock(&((*(*s_etat_processus)                      if (pthread_mutex_unlock(&((*(*s_etat_processus)
                             .s_liste_variables_partagees).mutex)) != 0)                              .pointeur_variable_partagee_courante).mutex)) != 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 1001  instruction_detach(struct_processus *s_e Line 989  instruction_detach(struct_processus *s_e
                 variable_partagee = d_vrai;                  variable_partagee = d_vrai;
   
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)                  if (pthread_mutex_unlock(&((*(*s_etat_processus)
                         .s_liste_variables_partagees).mutex)) != 0)                          .pointeur_variable_partagee_courante).mutex)) != 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      return;
Line 1231  instruction_detach(struct_processus *s_e Line 1219  instruction_detach(struct_processus *s_e
             return;              return;
         }          }
   
 #       ifndef OS2  #       ifdef SCHED_OTHER
 #       ifndef Cygwin  
         if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)          if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #       endif
   
   #       ifdef PTHREAD_EXPLICIT_SCHED
         if (pthread_attr_setinheritsched(&attributs,          if (pthread_attr_setinheritsched(&attributs,
                 PTHREAD_EXPLICIT_SCHED) != 0)                  PTHREAD_EXPLICIT_SCHED) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   #       endif
   
   #       ifdef PTHREAD_SCOPE_SYSTEM
         if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)          if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
 #       endif  #       endif
 #       endif  
   
         (*s_argument_thread).s_etat_processus = s_etat_processus;          (*s_argument_thread).s_etat_processus = s_etat_processus;
   
Line 1275  instruction_detach(struct_processus *s_e Line 1265  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
           if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
           }
   
         liberation_queue_signaux(s_etat_processus);          liberation_queue_signaux(s_etat_processus);
         creation_queue_signaux(s_etat_processus);          creation_queue_signaux(s_etat_processus);
           routine_recursive = 0;
   
         (*s_etat_processus).pointeur_signal_lecture = 0;          (*s_etat_processus).pointeur_signal_lecture = 0;
         (*s_etat_processus).pointeur_signal_ecriture = 0;          (*s_etat_processus).pointeur_signal_ecriture = 0;
Line 1363  instruction_detach(struct_processus *s_e Line 1359  instruction_detach(struct_processus *s_e
         l_element_courant = (*s_etat_processus).liste_mutexes;          l_element_courant = (*s_etat_processus).liste_mutexes;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
         {          {
             pthread_mutex_trylock(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
             pthread_mutex_unlock(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
             pthread_mutex_destroy(&((*((struct_mutex *) (*(*l_element_courant)  
                     .donnee).objet)).mutex));  
   
             liberation(s_etat_processus, (*l_element_courant).donnee);              liberation(s_etat_processus, (*l_element_courant).donnee);
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
             free(l_element_courant);              free(l_element_courant);
Line 1379  instruction_detach(struct_processus *s_e Line 1368  instruction_detach(struct_processus *s_e
         (*s_etat_processus).liste_mutexes = NULL;          (*s_etat_processus).liste_mutexes = NULL;
   
         liberation_threads(s_etat_processus);          liberation_threads(s_etat_processus);
   
         (*(*s_etat_processus).s_liste_variables_partagees)  
                 .table = NULL;  
         (*(*s_etat_processus).s_liste_variables_partagees)  
                 .nombre_variables = 0;  
         (*(*s_etat_processus).s_liste_variables_partagees)  
                 .nombre_variables_allouees = 0;  
   
         insertion_thread(s_etat_processus, d_vrai);          insertion_thread(s_etat_processus, d_vrai);
   
         // Envoi d'une donnée pour signaler le démarrage du processus au thread          // Envoi d'une donnée pour signaler le démarrage du processus au thread
Line 1426  instruction_detach(struct_processus *s_e Line 1407  instruction_detach(struct_processus *s_e
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
           if (pthread_mutex_destroy(&mutex_sections_critiques) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
   
               pid_final = -2;
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_interruptions_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_objets_attente[1],
                       &pid_final, sizeof(pid_final))) != sizeof(pid_final))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               destruction_queue_signaux(s_etat_processus);
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
               exit(EXIT_FAILURE);
           }
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
           pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1581  instruction_detach(struct_processus *s_e Line 1598  instruction_detach(struct_processus *s_e
         (*s_etat_processus).presence_fusible = d_faux;          (*s_etat_processus).presence_fusible = d_faux;
         (*s_etat_processus).thread_fusible = 0;          (*s_etat_processus).thread_fusible = 0;
         (*s_etat_processus).pid_erreur_processus_fils = getpid();          (*s_etat_processus).pid_erreur_processus_fils = getpid();
           (*s_etat_processus).sections_critiques = 0;
   
         if ((*s_etat_processus).profilage == d_vrai)          if ((*s_etat_processus).profilage == d_vrai)
         {          {
Line 1951  instruction_detach(struct_processus *s_e Line 1969  instruction_detach(struct_processus *s_e
   
         if ((*s_etat_processus).erreur_systeme == d_es)          if ((*s_etat_processus).erreur_systeme == d_es)
         {          {
               // Évite le warning variable s_copie might be clobbered by
               // longjmp or vfork
               struct_objet **s;
   
               if ((s = malloc(sizeof(struct_objet *))) == NULL)
               {
                   (*s_etat_processus).erreur_execution = d_es_allocation_memoire;
                   return;
               }
   
               (*s) = s_copie;
   
             if (setjmp(contexte_processus) == 0)              if (setjmp(contexte_processus) == 0)
             {              {
                 if (variable_partagee == d_faux)                  if (variable_partagee == d_faux)
Line 1984  instruction_detach(struct_processus *s_e Line 2014  instruction_detach(struct_processus *s_e
                 }                  }
                 else                  else
                 {                  {
                     if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur)                      if (evaluation(s_etat_processus, (*s), 'E') == d_erreur)
                     {                      {
                         if (((*s_etat_processus).erreur_execution == d_ex) &&                          if (((*s_etat_processus).erreur_execution == d_ex) &&
                                 ((*s_etat_processus).erreur_systeme == d_es))                                  ((*s_etat_processus).erreur_systeme == d_es))
Line 1995  instruction_detach(struct_processus *s_e Line 2025  instruction_detach(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
                         if ((*s_etat_processus).at_exit != NULL)                          if (((*s_etat_processus).var_volatile_alarme == 0)
                                   && ((*s_etat_processus).arret_depuis_abort == 0)
                                   && ((*s_etat_processus).at_exit != NULL))
                         {                          {
                             (*s_etat_processus).var_volatile_requete_arret = 0;                              (*s_etat_processus).var_volatile_requete_arret = 0;
   
Line 2009  instruction_detach(struct_processus *s_e Line 2041  instruction_detach(struct_processus *s_e
                         }                          }
                     }                      }
   
                     liberation(s_etat_processus, s_copie);                      liberation(s_etat_processus, (*s));
                 }                  }
             }              }
   
               free(s);
           }
   
           for(i = 0; i < (*s_etat_processus).sections_critiques; i++)
           {
               pthread_mutex_unlock(&mutex_sections_critiques);
         }          }
   
         liberation(s_etat_processus, (*s_etat_processus).at_exit);          liberation(s_etat_processus, (*s_etat_processus).at_exit);
Line 2020  instruction_detach(struct_processus *s_e Line 2059  instruction_detach(struct_processus *s_e
         l_element_courant = (*s_etat_processus).liste_mutexes;          l_element_courant = (*s_etat_processus).liste_mutexes;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
         {          {
             pthread_mutex_trylock(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
             pthread_mutex_unlock(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
             pthread_mutex_destroy(&((*((struct_mutex *)  
                     (*(*l_element_courant).donnee).objet)).mutex));  
   
             liberation(s_etat_processus, (*l_element_courant).donnee);              liberation(s_etat_processus, (*l_element_courant).donnee);
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
             free(l_element_courant);              free(l_element_courant);
Line 2532  instruction_detach(struct_processus *s_e Line 2564  instruction_detach(struct_processus *s_e
                 (*s_etat_processus).arbre_instructions);                  (*s_etat_processus).arbre_instructions);
         free((*s_etat_processus).pointeurs_caracteres);          free((*s_etat_processus).pointeurs_caracteres);
   
           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;
           }
   
         if ((*s_etat_processus).entree_standard != NULL)          if ((*s_etat_processus).entree_standard != NULL)
         {          {
             pclose((*s_etat_processus).entree_standard);              pclose((*s_etat_processus).entree_standard);
Line 2556  instruction_detach(struct_processus *s_e Line 2598  instruction_detach(struct_processus *s_e
             (*s_etat_processus).instruction_derniere_erreur = NULL;              (*s_etat_processus).instruction_derniere_erreur = NULL;
         }          }
   
           liberation_arbre_variables_partagees(s_etat_processus,
                   (*s_etat_processus).s_arbre_variables);
         liberation_arbre_variables(s_etat_processus,          liberation_arbre_variables(s_etat_processus,
                 (*s_etat_processus).s_arbre_variables, d_vrai);                  (*s_etat_processus).s_arbre_variables, d_vrai);
         free((*s_etat_processus).pointeurs_caracteres_variables);          free((*s_etat_processus).pointeurs_caracteres_variables);
   
         for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)  
         {  
             liberation(s_etat_processus,  
                     (*s_etat_processus).s_liste_variables_statiques[i].objet);  
             free((*s_etat_processus).s_liste_variables_statiques[i].nom);  
         }  
   
         free((*s_etat_processus).s_liste_variables_statiques);  
   
         for(i = 0; i < (*(*s_etat_processus).s_liste_variables_partagees)  
                 .nombre_variables; i++)  
         {  
             liberation(s_etat_processus,  
                     (*(*s_etat_processus).s_liste_variables_partagees)  
                     .table[i].objet);  
             free((*(*s_etat_processus).s_liste_variables_partagees)  
                     .table[i].nom);  
         }  
   
         if ((*(*s_etat_processus).s_liste_variables_partagees).table  
                 != NULL)  
         {  
             free((struct_variable_partagee *)  
                     (*(*s_etat_processus).s_liste_variables_partagees).table);  
         }  
   
         pthread_mutex_destroy(&((*(*s_etat_processus)  
                 .s_liste_variables_partagees).mutex));  
   
         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)
         {          {
Line 2767  instruction_detach(struct_processus *s_e Line 2782  instruction_detach(struct_processus *s_e
         pthread_mutex_destroy(&((*s_etat_processus).mutex));          pthread_mutex_destroy(&((*s_etat_processus).mutex));
         pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));          pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
         pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));          pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
           pthread_mutex_destroy(&mutex_sections_critiques);
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         sem_post(&((*s_etat_processus).semaphore_fork));          sem_post(&((*s_etat_processus).semaphore_fork));
Line 2784  instruction_detach(struct_processus *s_e Line 2800  instruction_detach(struct_processus *s_e
   
         destruction_queue_signaux(s_etat_processus);          destruction_queue_signaux(s_etat_processus);
         liberation_contexte_cas(s_etat_processus);          liberation_contexte_cas(s_etat_processus);
           arret_thread_signaux(s_etat_processus);
         free(s_etat_processus);          free(s_etat_processus);
   
 #       ifdef DEBUG_MEMOIRE  #       ifdef DEBUG_MEMOIRE

Removed from v.1.73  
changed lines
  Added in v.1.97


CVSweb interface <joel.bertrand@systella.fr>