Diff for /rpl/src/instructions_d5.c between versions 1.131 and 1.158

version 1.131, 2015/07/21 12:30:38 version 1.158, 2017/08/02 14:41:35
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.22    RPL/2 (R) version 4.1.27
   Copyright (C) 1989-2015 Dr. BERTRAND Joël    Copyright (C) 1989-2017 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 815  instruction_der(struct_processus *s_etat Line 815  instruction_der(struct_processus *s_etat
 void  void
 instruction_detach(struct_processus *s_etat_processus)  instruction_detach(struct_processus *s_etat_processus)
 {  {
   #ifndef EXPERIMENTAL_CODE
       printf("DETACH currently broken is replaced by SPAWN...\n");
       instruction_spawn(s_etat_processus);
   #else
     int                                 pipe_initialisation_segment_signaux[2];      int                                 pipe_initialisation_segment_signaux[2];
   
     logical1                            drapeau;      logical1                            drapeau;
Line 1088  instruction_detach(struct_processus *s_e Line 1092  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
       verrouillage_threads_concurrents(s_etat_processus);
   
       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)      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;
Line 1101  instruction_detach(struct_processus *s_e Line 1113  instruction_detach(struct_processus *s_e
      * de mémoire, ni libération, ni copie d'objet concurrent au fork().       * de mémoire, ni libération, ni copie d'objet concurrent au fork().
      */       */
   
     verrouillage_threads_concurrents(s_etat_processus);  
     (*s_argument_thread).pid = fork();      (*s_argument_thread).pid = fork();
     deverrouillage_threads_concurrents(s_etat_processus);  
   
     if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer))      if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer))
             != 0)              != 0)
Line 1112  instruction_detach(struct_processus *s_e Line 1122  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
       if ((*s_argument_thread).pid > 0)
       {
           // On ne déverrouille les threads concurrents que dans le processus
           // père. Dans le fils, les valeurs sont non initialisées.
           deverrouillage_threads_concurrents(s_etat_processus);
       }
   
     (*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 1132  instruction_detach(struct_processus *s_e Line 1149  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 1269  instruction_detach(struct_processus *s_e Line 1292  instruction_detach(struct_processus *s_e
          * Processus fils           * Processus fils
          */           */
   
           // EPERM
   #if 0
           pthread_mutex_destroy(&mutex_liste_variables_partagees);
           pthread_mutex_destroy(&mutex_liste_threads);
           pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus);
           pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
   #endif
   
           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);
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
           pthread_mutex_init(&mutex_liste_threads, &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
           pthread_mutex_init(&((*s_etat_processus).mutex_pile_processus),
                   &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
           pthread_mutex_init(&((*s_etat_processus).mutex_allocation),
                   &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
         liberation_queue_signaux(s_etat_processus);          liberation_queue_signaux(s_etat_processus);
         creation_queue_signaux(s_etat_processus);          creation_queue_signaux(s_etat_processus);
   
         if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur)  
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
         }  
   
         routine_recursive = 0;          routine_recursive = 0;
           nombre_thread_surveillance_processus = 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 1572  instruction_detach(struct_processus *s_e Line 1621  instruction_detach(struct_processus *s_e
   
         // Attente de la réception du signal rpl_sigstart.          // Attente de la réception du signal rpl_sigstart.
   
         for((*s_etat_processus).demarrage_fils = d_faux;;)          for((*s_etat_processus).demarrage_fils = d_faux;
                   (*s_etat_processus).demarrage_fils != d_vrai;
                   nanosleep(&attente, NULL))
         {          {
             scrutation_interruptions(s_etat_processus);              scrutation_interruptions(s_etat_processus);
   
             if ((*s_etat_processus).demarrage_fils == d_vrai)  
             {  
                 break;  
             }  
   
             nanosleep(&attente, NULL);  
         }          }
   
         (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;          (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;
Line 1887  instruction_detach(struct_processus *s_e Line 1931  instruction_detach(struct_processus *s_e
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
   
           (*s_etat_processus).s_fichiers = NULL;
   
         /*          /*
          * Destruction des piles de connecteurs SQL           * Destruction des piles de connecteurs SQL
          */           */
Line 1909  instruction_detach(struct_processus *s_e Line 1955  instruction_detach(struct_processus *s_e
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
   
         (*s_etat_processus).s_connecteurs_sql = NULL;  
   
         /*          /*
          * On ne détruit pas les sockets car il faut utiliser DETACH           * On ne détruit pas les sockets car il faut utiliser DETACH
          * pour traiter plusieurs connexions simultanées sur les sockets           * pour traiter plusieurs connexions simultanées sur les sockets
          */           */
   
         (*s_etat_processus).s_fichiers = NULL;          (*s_etat_processus).s_connecteurs_sql = NULL;
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
         {          {
Line 2164  instruction_detach(struct_processus *s_e Line 2208  instruction_detach(struct_processus *s_e
             }              }
         }          }
   
         close((*s_argument_thread).pipe_erreurs[1]);  
         close((*s_argument_thread).pipe_interruptions[1]);  
         close((*s_argument_thread).pipe_nombre_elements_attente[1]);  
         close((*s_argument_thread).pipe_objets[1]);  
         close((*s_argument_thread).pipe_injections[0]);  
         close((*s_argument_thread).pipe_nombre_injections[0]);  
         close((*s_argument_thread).pipe_acquittement[0]);  
   
         l_element_courant = (*s_etat_processus).s_fichiers;          l_element_courant = (*s_etat_processus).s_fichiers;
   
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
Line 2251  instruction_detach(struct_processus *s_e Line 2287  instruction_detach(struct_processus *s_e
                 {                  {
                     envoi_signal_processus((*(*((struct_processus_fils *)                      envoi_signal_processus((*(*((struct_processus_fils *)
                             (*(*l_element_courant).donnee).objet)).thread).pid,                              (*(*l_element_courant).donnee).objet)).thread).pid,
                             rpl_sigurg);                              rpl_sigurg, d_faux);
                 }                  }
                 else                  else
                 {                  {
Line 2259  instruction_detach(struct_processus *s_e Line 2295  instruction_detach(struct_processus *s_e
                     {                      {
                         envoi_signal_processus((*(*((struct_processus_fils *)                          envoi_signal_processus((*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .pid, rpl_sigabort);                                  .pid, rpl_sigabort, d_faux);
                     }                      }
                     else                      else
                     {                      {
                         envoi_signal_processus((*(*((struct_processus_fils *)                          envoi_signal_processus((*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .pid, rpl_sigstop);                                  .pid, rpl_sigstop, d_faux);
                     }                      }
                 }                  }
             }              }
Line 2734  instruction_detach(struct_processus *s_e Line 2770  instruction_detach(struct_processus *s_e
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
   
         free((*s_etat_processus).chemin_fichiers_temporaires);  
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
             if (((*s_etat_processus).type_debug &              if (((*s_etat_processus).type_debug &
                     d_debug_processus) != 0)                      d_debug_processus) != 0)
Line 2787  instruction_detach(struct_processus *s_e Line 2821  instruction_detach(struct_processus *s_e
             liberation_profil(s_etat_processus);              liberation_profil(s_etat_processus);
         }          }
   
           attente.tv_sec = 0;
           attente.tv_nsec = GRANULARITE_us * 1000;
   
           while(nombre_thread_surveillance_processus != 0)
           {
               nanosleep(&attente, NULL);
               INCR_GRANULARITE(attente.tv_nsec);
           }
   
         closelog();          closelog();
   
         retrait_thread(s_etat_processus);          retrait_thread(s_etat_processus);
           liberation_contexte_cas(s_etat_processus);
         pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));          destruction_queue_signaux(s_etat_processus);
         pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));  
         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(&mutex_sections_critiques);  
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         sem_post(&((*s_etat_processus).semaphore_fork));          sem_post(&((*s_etat_processus).semaphore_fork));
Line 2807  instruction_detach(struct_processus *s_e Line 2845  instruction_detach(struct_processus *s_e
                 pthread_self(), SEM_FORK);                  pthread_self(), SEM_FORK);
 #       endif  #       endif
   
           clear_history();
   
           close((*s_argument_thread).pipe_erreurs[1]);
           close((*s_argument_thread).pipe_interruptions[1]);
           close((*s_argument_thread).pipe_nombre_elements_attente[1]);
           close((*s_argument_thread).pipe_objets[1]);
           close((*s_argument_thread).pipe_injections[0]);
           close((*s_argument_thread).pipe_nombre_injections[0]);
           close((*s_argument_thread).pipe_acquittement[0]);
   
         free((*s_etat_processus).localisation);          free((*s_etat_processus).localisation);
           free((*s_etat_processus).chemin_fichiers_temporaires);
         free(s_argument_thread);          free(s_argument_thread);
   
         clear_history();  
   
         destruction_queue_signaux(s_etat_processus);  
         liberation_contexte_cas(s_etat_processus);  
         arret_thread_signaux(s_etat_processus);  
         liberation_allocateur(s_etat_processus);          liberation_allocateur(s_etat_processus);
         liberation_allocateur_buffer(s_etat_processus);          liberation_allocateur_buffer(s_etat_processus);
   
           pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));
           pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
           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).mutex_allocation_buffer));          pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer));
           pthread_mutex_destroy(&mutex_sections_critiques);
           pthread_mutex_destroy(&mutex_liste_variables_partagees);
           pthread_mutex_destroy(&mutex_liste_threads);
   
         sys_free(s_etat_processus);          sys_free(s_etat_processus);
   
 #       ifdef DEBUG_MEMOIRE  #       ifdef DEBUG_MEMOIRE
Line 2918  instruction_detach(struct_processus *s_e Line 2972  instruction_detach(struct_processus *s_e
   
     // Le fils peut être présent sans être en attente du signal de départ.      // Le fils peut être présent sans être en attente du signal de départ.
   
     if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)      if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart,
               d_vrai) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
Line 2932  instruction_detach(struct_processus *s_e Line 2987  instruction_detach(struct_processus *s_e
     }      }
   
     return;      return;
   #endif
 }  }
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.131  
changed lines
  Added in v.1.158


CVSweb interface <joel.bertrand@systella.fr>