Diff for /rpl/src/instructions_d5.c between versions 1.111 and 1.135

version 1.111, 2013/05/28 22:09:55 version 1.135, 2015/10/23 09:58:50
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.14    RPL/2 (R) version 4.1.23
   Copyright (C) 1989-2013 Dr. BERTRAND Joël    Copyright (C) 1989-2015 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 767  instruction_der(struct_processus *s_etat Line 767  instruction_der(struct_processus *s_etat
             if ((s_objet_simplifie = simplification(s_etat_processus,              if ((s_objet_simplifie = simplification(s_etat_processus,
                     s_objet_resultat)) == NULL)                      s_objet_resultat)) == NULL)
             {              {
                   liberation(s_etat_processus, s_objet_resultat);
                 return;                  return;
             }              }
   
Line 1081  instruction_detach(struct_processus *s_e Line 1082  instruction_detach(struct_processus *s_e
      * Le mutex suivant permet de copier un contexte propre.       * Le mutex suivant permet de copier un contexte propre.
      */       */
   
     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)      if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
       if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
       if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;
Line 1098  instruction_detach(struct_processus *s_e Line 1111  instruction_detach(struct_processus *s_e
     (*s_argument_thread).pid = fork();      (*s_argument_thread).pid = fork();
     deverrouillage_threads_concurrents(s_etat_processus);      deverrouillage_threads_concurrents(s_etat_processus);
   
       if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer))
               != 0)
       {
           (*s_etat_processus).erreur_systeme = d_es_processus;
           return;
       }
   
     (*s_argument_thread).thread_pere = pthread_self();      (*s_argument_thread).thread_pere = pthread_self();
     (*s_argument_thread).processus_detache = d_vrai;      (*s_argument_thread).processus_detache = d_vrai;
   
Line 1118  instruction_detach(struct_processus *s_e Line 1138  instruction_detach(struct_processus *s_e
          * Processus père           * Processus père
          */           */
   
           if (pthread_mutex_unlock(&mutex_liste_variables_partagees) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
               return;
           }
   
         if (variable_partagee == d_vrai)          if (variable_partagee == d_vrai)
         {          {
             liberation(s_etat_processus, s_copie);              liberation(s_etat_processus, s_copie);
Line 1255  instruction_detach(struct_processus *s_e Line 1281  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
           pthread_mutex_destroy(&mutex_liste_variables_partagees);
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
           pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
           liberation_queue_signaux(s_etat_processus);
           creation_queue_signaux(s_etat_processus);
   
         if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur)          if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
         }          }
   
         liberation_queue_signaux(s_etat_processus);  
         creation_queue_signaux(s_etat_processus);  
         routine_recursive = 0;          routine_recursive = 0;
   
         (*s_etat_processus).pointeur_signal_lecture = 0;          (*s_etat_processus).pointeur_signal_lecture = 0;
Line 1365  instruction_detach(struct_processus *s_e Line 1399  instruction_detach(struct_processus *s_e
                 (*s_argument_thread).pipe_nombre_elements_attente[1],                  (*s_argument_thread).pipe_nombre_elements_attente[1],
                 &caractere, sizeof(caractere)) != sizeof(caractere))                  &caractere, sizeof(caractere)) != sizeof(caractere))
         {          {
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
   
             while((longueur_ecriture = write_atomic(s_etat_processus,              while((longueur_ecriture = write_atomic(s_etat_processus,
Line 1407  instruction_detach(struct_processus *s_e Line 1441  instruction_detach(struct_processus *s_e
         pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex);          pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex);
         pthread_mutexattr_destroy(&attributs_mutex);          pthread_mutexattr_destroy(&attributs_mutex);
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
                   != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
   
Line 1476  instruction_detach(struct_processus *s_e Line 1511  instruction_detach(struct_processus *s_e
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
           pthread_mutex_trylock(&((*s_etat_processus).mutex_signaux));
   
           if (pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux))
                   != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
   
               caractere = 0;
   
               while((longueur_ecriture = write_atomic(s_etat_processus,
                       (*s_argument_thread).pipe_nombre_elements_attente[1],
                       &caractere, sizeof(caractere))) != sizeof(caractere))
               {
                   if (longueur_ecriture == -1)
                   {
                       break;
                   }
               }
   
               destruction_queue_signaux(s_etat_processus);
               BUG(1, uprintf("Process management error line %d\n", __LINE__));
               exit(EXIT_FAILURE);
           }
   
         if ((*s_etat_processus).evaluation_expression_compilee == 'N')          if ((*s_etat_processus).evaluation_expression_compilee == 'N')
         {          {
             free((*s_etat_processus).instruction_courante);              free((*s_etat_processus).instruction_courante);
Line 1592  instruction_detach(struct_processus *s_e Line 1651  instruction_detach(struct_processus *s_e
          * par liberation_threads().           * par liberation_threads().
          */           */
   
         if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
                   != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es;              (*s_etat_processus).erreur_systeme = d_es;
   
Line 1661  instruction_detach(struct_processus *s_e Line 1721  instruction_detach(struct_processus *s_e
   
         (*s_etat_processus).l_base_pile_processus = NULL;          (*s_etat_processus).l_base_pile_processus = NULL;
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
                   != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es;              (*s_etat_processus).erreur_systeme = d_es;
   
Line 2167  instruction_detach(struct_processus *s_e Line 2228  instruction_detach(struct_processus *s_e
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
   
         pthread_mutex_lock(&((*s_etat_processus).mutex));          pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
   
         l_element_courant = (struct_liste_chainee *)          l_element_courant = (struct_liste_chainee *)
                 (*s_etat_processus).l_base_pile_processus;                  (*s_etat_processus).l_base_pile_processus;
Line 2330  instruction_detach(struct_processus *s_e Line 2391  instruction_detach(struct_processus *s_e
   
                     if (sigaction(SIGPIPE, &action, &registre) != 0)                      if (sigaction(SIGPIPE, &action, &registre) != 0)
                     {                      {
                         pthread_mutex_unlock(&((*s_etat_processus).mutex));                          pthread_mutex_unlock(&((*s_etat_processus)
                                   .mutex_pile_processus));
   
                         if (registre_stop == 0)                          if (registre_stop == 0)
                         {                          {
Line 2384  instruction_detach(struct_processus *s_e Line 2446  instruction_detach(struct_processus *s_e
                     {                      {
                         destruction_queue_signaux(s_etat_processus);                          destruction_queue_signaux(s_etat_processus);
   
                         pthread_mutex_unlock(&((*s_etat_processus).mutex));                          pthread_mutex_unlock(&((*s_etat_processus)
                                   .mutex_pile_processus));
                         (*s_etat_processus).erreur_systeme = d_es_signal;                          (*s_etat_processus).erreur_systeme = d_es_signal;
                         exit(EXIT_FAILURE);                          exit(EXIT_FAILURE);
                     }                      }
Line 2396  instruction_detach(struct_processus *s_e Line 2459  instruction_detach(struct_processus *s_e
             {              {
                 destruction_queue_signaux(s_etat_processus);                  destruction_queue_signaux(s_etat_processus);
   
                 pthread_mutex_unlock(&((*s_etat_processus).mutex));                  pthread_mutex_unlock(&((*s_etat_processus)
                           .mutex_pile_processus));
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 exit(EXIT_FAILURE);                  exit(EXIT_FAILURE);
             }              }
Line 2411  instruction_detach(struct_processus *s_e Line 2475  instruction_detach(struct_processus *s_e
             {              {
                 destruction_queue_signaux(s_etat_processus);                  destruction_queue_signaux(s_etat_processus);
   
                 pthread_mutex_unlock(&((*s_etat_processus).mutex));                  pthread_mutex_unlock(&((*s_etat_processus)
                           .mutex_pile_processus));
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 exit(EXIT_FAILURE);                  exit(EXIT_FAILURE);
             }              }
   
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
             nanosleep(&attente, NULL);              nanosleep(&attente, NULL);
             pthread_mutex_lock(&((*s_etat_processus).mutex));              pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
   
             scrutation_interruptions(s_etat_processus);              scrutation_interruptions(s_etat_processus);
         }          }
   
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
   
         l_element_courant = (*s_etat_processus).s_sockets;          l_element_courant = (*s_etat_processus).s_sockets;
   
Line 2743  instruction_detach(struct_processus *s_e Line 2808  instruction_detach(struct_processus *s_e
   
         closelog();          closelog();
   
         liberation_allocateur(s_etat_processus);  
         retrait_thread(s_etat_processus);          retrait_thread(s_etat_processus);
   
         pthread_mutex_destroy(&((*s_etat_processus).mutex));          pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));
         pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));          pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
         pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));          pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));
           pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux));
         pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));          pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
         pthread_mutex_destroy(&mutex_sections_critiques);          pthread_mutex_destroy(&mutex_sections_critiques);
   
Line 2769  instruction_detach(struct_processus *s_e Line 2834  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);          arret_thread_signaux(s_etat_processus);
         free(s_etat_processus);          liberation_allocateur(s_etat_processus);
           liberation_allocateur_buffer(s_etat_processus);
           pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer));
           sys_free(s_etat_processus);
   
 #       ifdef DEBUG_MEMOIRE  #       ifdef DEBUG_MEMOIRE
         debug_memoire_verification();          debug_memoire_verification();
Line 2807  instruction_detach(struct_processus *s_e Line 2875  instruction_detach(struct_processus *s_e
                         (*(*l_element_courant).donnee).objet)).thread).pid ==                          (*(*l_element_courant).donnee).objet)).thread).pid ==
                         (*s_argument_thread).pid)                          (*s_argument_thread).pid)
                 {                  {
                     if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)                      if (pthread_mutex_unlock(&((*s_etat_processus)
                               .mutex_pile_processus)) != 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 2816  instruction_detach(struct_processus *s_e Line 2885  instruction_detach(struct_processus *s_e
                     nanosleep(&attente, NULL);                      nanosleep(&attente, NULL);
                     INCR_GRANULARITE(attente.tv_nsec);                      INCR_GRANULARITE(attente.tv_nsec);
   
                     if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)                      if (pthread_mutex_lock(&((*s_etat_processus)
                               .mutex_pile_processus)) != 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 2836  instruction_detach(struct_processus *s_e Line 2906  instruction_detach(struct_processus *s_e
             (struct_liste_chainee **) &((*s_etat_processus)              (struct_liste_chainee **) &((*s_etat_processus)
             .l_base_pile_processus), s_objet_systeme) == d_erreur)              .l_base_pile_processus), s_objet_systeme) == d_erreur)
     {      {
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
         return;          return;
     }      }
   
     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),      if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
             s_objet) == d_erreur)              s_objet) == d_erreur)
     {      {
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
         return;          return;
     }      }
   
Line 2870  instruction_detach(struct_processus *s_e Line 2940  instruction_detach(struct_processus *s_e
     if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)      if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         pthread_mutex_unlock(&((*s_etat_processus).mutex));          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
         return;          return;
     }      }
   
     if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)      if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;

Removed from v.1.111  
changed lines
  Added in v.1.135


CVSweb interface <joel.bertrand@systella.fr>