Diff for /rpl/src/instructions_d5.c between versions 1.154 and 1.179

version 1.154, 2016/09/27 10:43:23 version 1.179, 2023/11/22 11:13:16
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.25    RPL/2 (R) version 4.1.35
   Copyright (C) 1989-2016 Dr. BERTRAND Joël    Copyright (C) 1989-2023 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 1092  instruction_detach(struct_processus *s_e Line 1088  instruction_detach(struct_processus *s_e
         return;          return;
     }      }
   
       verrouillage_threads_concurrents(s_etat_processus);
   
     if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0)      if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;
     }      }
   
     verrouillage_threads_concurrents(s_etat_processus);  
   
     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 1299  instruction_detach(struct_processus *s_e Line 1295  instruction_detach(struct_processus *s_e
         pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_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_allocation));
 #endif  #endif
   
         pthread_mutexattr_init(&attributs_mutex);          pthread_mutexattr_init(&attributs_mutex);
         pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);          pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
         pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex);          pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex);
Line 1311  instruction_detach(struct_processus *s_e Line 1306  instruction_detach(struct_processus *s_e
         pthread_mutexattr_destroy(&attributs_mutex);          pthread_mutexattr_destroy(&attributs_mutex);
   
         pthread_mutexattr_init(&attributs_mutex);          pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
           pthread_mutex_init(&mutex_liste_threads_surveillance, &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
           pthread_mutexattr_init(&attributs_mutex);
           pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
           pthread_mutex_init(&mutex_sigaction, &attributs_mutex);
           pthread_mutexattr_destroy(&attributs_mutex);
   
           pthread_mutexattr_init(&attributs_mutex);
         pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);          pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
         pthread_mutex_init(&((*s_etat_processus).mutex_pile_processus),          pthread_mutex_init(&((*s_etat_processus).mutex_pile_processus),
                 &attributs_mutex);                  &attributs_mutex);
Line 1322  instruction_detach(struct_processus *s_e Line 1327  instruction_detach(struct_processus *s_e
                 &attributs_mutex);                  &attributs_mutex);
         pthread_mutexattr_destroy(&attributs_mutex);          pthread_mutexattr_destroy(&attributs_mutex);
   
 #if 0  
         liberation_queue_signaux(s_etat_processus);          liberation_queue_signaux(s_etat_processus);
 #endif  
         creation_queue_signaux(s_etat_processus);          creation_queue_signaux(s_etat_processus);
   
         routine_recursive = 0;          routine_recursive = 0;
         nombre_thread_surveillance_processus = 0;          nombre_threads_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 1340  instruction_detach(struct_processus *s_e Line 1343  instruction_detach(struct_processus *s_e
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
         }          }
   
 #if 0  
         close(pipe_initialisation_segment_signaux[0]);          close(pipe_initialisation_segment_signaux[0]);
         close(pipe_initialisation_segment_signaux[1]);          close(pipe_initialisation_segment_signaux[1]);
   
Line 1417  instruction_detach(struct_processus *s_e Line 1419  instruction_detach(struct_processus *s_e
             free(l_element_courant);              free(l_element_courant);
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
 #endif  
   
         (*s_etat_processus).liste_mutexes = NULL;          (*s_etat_processus).liste_mutexes = NULL;
   
 #if 0  
         liberation_threads(s_etat_processus);          liberation_threads(s_etat_processus);
 #endif  
         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 1435  instruction_detach(struct_processus *s_e Line 1434  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_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 1453  instruction_detach(struct_processus *s_e Line 1451  instruction_detach(struct_processus *s_e
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
   
 #if 0  
         if (pthread_mutex_destroy(&mutex_sections_critiques) != 0)          if (pthread_mutex_destroy(&mutex_sections_critiques) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 1472  instruction_detach(struct_processus *s_e Line 1469  instruction_detach(struct_processus *s_e
             BUG(1, uprintf("Process management error line %d\n", __LINE__));              BUG(1, uprintf("Process management error line %d\n", __LINE__));
             exit(EXIT_FAILURE);              exit(EXIT_FAILURE);
         }          }
 #endif  
   
         pthread_mutexattr_init(&attributs_mutex);          pthread_mutexattr_init(&attributs_mutex);
         pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);          pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
         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_pile_processus))  
                 != 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);  
         }  
   
         pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes));  
   
         if (pthread_mutex_unlock(&((*s_etat_processus)  
                 .protection_liste_mutexes)) != 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);  
         }  
   
         pthread_mutex_trylock(&((*s_etat_processus).mutex_interruptions));  
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions))  
                 != 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);  
         }  
   
         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')
         {          {
 #if 0  
             free((*s_etat_processus).instruction_courante);              free((*s_etat_processus).instruction_courante);
 #endif  
             (*s_etat_processus).instruction_courante = NULL;              (*s_etat_processus).instruction_courante = NULL;
         }          }
   
 #if 0  
         (*s_etat_processus).var_volatile_processus_pere = 0;          (*s_etat_processus).var_volatile_processus_pere = 0;
         (*s_etat_processus).var_volatile_processus_racine = 0;          (*s_etat_processus).var_volatile_processus_racine = 0;
   
Line 1598  instruction_detach(struct_processus *s_e Line 1497  instruction_detach(struct_processus *s_e
         liberation(s_etat_processus, (*s_etat_processus).at_poke);          liberation(s_etat_processus, (*s_etat_processus).at_poke);
         (*s_etat_processus).at_poke = NULL;          (*s_etat_processus).at_poke = NULL;
         (*s_etat_processus).traitement_at_poke = 'N';          (*s_etat_processus).traitement_at_poke = 'N';
 #endif  
   
         for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)          for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
         {          {
 #if 0  
             liberation(s_etat_processus,              liberation(s_etat_processus,
                     (*s_etat_processus).corps_interruptions[i]);                      (*s_etat_processus).corps_interruptions[i]);
 #endif  
   
             (*s_etat_processus).corps_interruptions[i] = NULL;              (*s_etat_processus).corps_interruptions[i] = NULL;
             (*s_etat_processus).masque_interruptions[i] = 'N';              (*s_etat_processus).masque_interruptions[i] = 'N';
             (*s_etat_processus).queue_interruptions[i] = 0;              (*s_etat_processus).queue_interruptions[i] = 0;
   
 #if 0  
             l_element_courant = (*s_etat_processus)              l_element_courant = (*s_etat_processus)
                     .pile_origine_interruptions[i];                      .pile_origine_interruptions[i];
   
Line 1622  instruction_detach(struct_processus *s_e Line 1517  instruction_detach(struct_processus *s_e
                 free(l_element_courant);                  free(l_element_courant);
                 l_element_courant = l_element_suivant;                  l_element_courant = l_element_suivant;
             }              }
 #endif  
   
             (*s_etat_processus).pile_origine_interruptions[i] = NULL;              (*s_etat_processus).pile_origine_interruptions[i] = NULL;
         }          }
Line 1644  instruction_detach(struct_processus *s_e Line 1538  instruction_detach(struct_processus *s_e
             scrutation_interruptions(s_etat_processus);              scrutation_interruptions(s_etat_processus);
         }          }
   
 #if 0  
         (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;          (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;
         (*s_etat_processus).presence_pipes = d_vrai;          (*s_etat_processus).presence_pipes = d_vrai;
         (*s_etat_processus).debug_programme = d_faux;          (*s_etat_processus).debug_programme = d_faux;
Line 1667  instruction_detach(struct_processus *s_e Line 1560  instruction_detach(struct_processus *s_e
         (*s_etat_processus).pid_erreur_processus_fils = getpid();          (*s_etat_processus).pid_erreur_processus_fils = getpid();
         (*s_etat_processus).sections_critiques = 0;          (*s_etat_processus).sections_critiques = 0;
         (*s_etat_processus).initialisation_scheduler = d_faux;          (*s_etat_processus).initialisation_scheduler = d_faux;
 #endif  
   
 #if 0  
         if ((*s_etat_processus).profilage == d_vrai)          if ((*s_etat_processus).profilage == d_vrai)
         {          {
             liberation_profil(s_etat_processus);              liberation_profil(s_etat_processus);
         }          }
 #endif  
   
         (*s_etat_processus).pile_profilage = NULL;          (*s_etat_processus).pile_profilage = NULL;
   
 #if 0  
         if ((*s_etat_processus).generateur_aleatoire != NULL)          if ((*s_etat_processus).generateur_aleatoire != NULL)
         {          {
             liberation_generateur_aleatoire(s_etat_processus);              liberation_generateur_aleatoire(s_etat_processus);
         }          }
 #endif  
   
         (*s_etat_processus).generateur_aleatoire = NULL;          (*s_etat_processus).generateur_aleatoire = NULL;
   
Line 1736  instruction_detach(struct_processus *s_e Line 1624  instruction_detach(struct_processus *s_e
                     printf("(*s_argument_thread2).nombre_references = %d\n",                      printf("(*s_argument_thread2).nombre_references = %d\n",
                     (int) (*s_argument_thread2).nombre_references));                      (int) (*s_argument_thread2).nombre_references));
   
 #if 0  
             if ((*s_argument_thread2).nombre_references == 0)              if ((*s_argument_thread2).nombre_references == 0)
             {              {
                 close((*s_argument_thread2).pipe_objets[0]);                  close((*s_argument_thread2).pipe_objets[0]);
Line 1761  instruction_detach(struct_processus *s_e Line 1648  instruction_detach(struct_processus *s_e
                 free((*(*l_element_courant).donnee).objet);                  free((*(*l_element_courant).donnee).objet);
                 free((*l_element_courant).donnee);                  free((*l_element_courant).donnee);
             }              }
 #endif  
   
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
             free((struct_liste_chainee *) l_element_courant);              free((struct_liste_chainee *) l_element_courant);
Line 1796  instruction_detach(struct_processus *s_e Line 1682  instruction_detach(struct_processus *s_e
          * Initialisation de la pile système           * Initialisation de la pile système
          */           */
   
 #if 0  
         l_element_courant = (struct_liste_chainee *)          l_element_courant = (struct_liste_chainee *)
                 (*s_etat_processus).l_base_pile_systeme;                  (*s_etat_processus).l_base_pile_systeme;
         while(l_element_courant != NULL)          while(l_element_courant != NULL)
Line 1823  instruction_detach(struct_processus *s_e Line 1708  instruction_detach(struct_processus *s_e
   
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
 #endif  
   
         (*s_etat_processus).l_base_pile_systeme = NULL;          (*s_etat_processus).l_base_pile_systeme = NULL;
         (*s_etat_processus).hauteur_pile_systeme = 0;          (*s_etat_processus).hauteur_pile_systeme = 0;
   
 #if 0  
         empilement_pile_systeme(s_etat_processus);          empilement_pile_systeme(s_etat_processus);
   
         if ((*s_etat_processus).erreur_systeme != d_es)          if ((*s_etat_processus).erreur_systeme != d_es)
Line 1851  instruction_detach(struct_processus *s_e Line 1734  instruction_detach(struct_processus *s_e
         }          }
   
         (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';          (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
 #endif  
   
 #if 0  
         l_element_courant = (struct_liste_chainee *)          l_element_courant = (struct_liste_chainee *)
                 (*s_etat_processus).s_marques;                  (*s_etat_processus).s_marques;
   
Line 1866  instruction_detach(struct_processus *s_e Line 1747  instruction_detach(struct_processus *s_e
             free((struct_marque *) l_element_courant);              free((struct_marque *) l_element_courant);
             l_element_courant = l_element_suivant;              l_element_courant = l_element_suivant;
         }          }
 #endif  
   
         (*s_etat_processus).s_marques = NULL;          (*s_etat_processus).s_marques = NULL;
   
Line 1875  instruction_detach(struct_processus *s_e Line 1755  instruction_detach(struct_processus *s_e
          * les variables dans le cas d'un programme compilé.           * les variables dans le cas d'un programme compilé.
          */           */
   
 #if 0  
         empilement_pile_systeme(s_etat_processus);          empilement_pile_systeme(s_etat_processus);
   
         if ((*s_etat_processus).erreur_systeme != d_es)          if ((*s_etat_processus).erreur_systeme != d_es)
Line 1898  instruction_detach(struct_processus *s_e Line 1777  instruction_detach(struct_processus *s_e
         }          }
   
         (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';          (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
 #endif  
   
         /*          /*
          * Destruction des sorties graphiques et PostScript           * Destruction des sorties graphiques et PostScript
          */           */
   
 #if 0  
         while((*s_etat_processus).fichiers_graphiques != NULL)          while((*s_etat_processus).fichiers_graphiques != NULL)
         {          {
             free((*(*s_etat_processus).fichiers_graphiques).nom);              free((*(*s_etat_processus).fichiers_graphiques).nom);
Line 1926  instruction_detach(struct_processus *s_e Line 1803  instruction_detach(struct_processus *s_e
             pclose((*s_etat_processus).entree_standard);              pclose((*s_etat_processus).entree_standard);
             (*s_etat_processus).entree_standard = NULL;              (*s_etat_processus).entree_standard = NULL;
         }          }
 #endif  
   
         (*s_etat_processus).requete_nouveau_plan = d_vrai;          (*s_etat_processus).requete_nouveau_plan = d_vrai;
         (*s_etat_processus).mise_a_jour_trace_requise = d_faux;          (*s_etat_processus).mise_a_jour_trace_requise = d_faux;
Line 1941  instruction_detach(struct_processus *s_e Line 1817  instruction_detach(struct_processus *s_e
          * Destruction des piles de fichiers           * Destruction des piles de fichiers
          */           */
   
 #if 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)
         {          {
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
   
               // On ne détruit pas le descripteur sous prétexte
               // d'avoir le fichier ou la socket fermée dans le processus père
   
               /*
             fclose((*((struct_descripteur_fichier *)              fclose((*((struct_descripteur_fichier *)
                     (*l_element_courant).donnee)).descripteur_c);                      (*l_element_courant).donnee)).descripteur_c);
   
Line 1957  instruction_detach(struct_processus *s_e Line 1836  instruction_detach(struct_processus *s_e
                 sqlite3_close((*((struct_descripteur_fichier *)                  sqlite3_close((*((struct_descripteur_fichier *)
                         (*l_element_courant).donnee)).descripteur_sqlite);                          (*l_element_courant).donnee)).descripteur_sqlite);
             }              }
               */
   
             free((*((struct_descripteur_fichier *) (*l_element_courant)              free((*((struct_descripteur_fichier *) (*l_element_courant)
                     .donnee)).nom);                      .donnee)).nom);
Line 1996  instruction_detach(struct_processus *s_e Line 1876  instruction_detach(struct_processus *s_e
          */           */
   
         (*s_etat_processus).s_connecteurs_sql = NULL;          (*s_etat_processus).s_connecteurs_sql = NULL;
 #endif  
   
         if ((*s_etat_processus).debug == d_vrai)          if ((*s_etat_processus).debug == d_vrai)
         {          {
Line 2014  instruction_detach(struct_processus *s_e Line 1893  instruction_detach(struct_processus *s_e
             }              }
         }          }
   
 #if 0  
         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              // Évite le warning variable s_copie might be clobbered by
Line 2119  instruction_detach(struct_processus *s_e Line 1997  instruction_detach(struct_processus *s_e
   
             free(s);              free(s);
         }          }
 #endif  
   
 #if 0  
         for(i = 0; i < (*s_etat_processus).sections_critiques; i++)          for(i = 0; i < (*s_etat_processus).sections_critiques; i++)
         {          {
             pthread_mutex_unlock(&mutex_sections_critiques);              pthread_mutex_unlock(&mutex_sections_critiques);
Line 2143  instruction_detach(struct_processus *s_e Line 2019  instruction_detach(struct_processus *s_e
         {          {
             pthread_cancel((*s_etat_processus).thread_fusible);              pthread_cancel((*s_etat_processus).thread_fusible);
         }          }
 #endif  
   
         caractere = 0;          caractere = 0;
   
Line 2248  instruction_detach(struct_processus *s_e Line 2123  instruction_detach(struct_processus *s_e
             }              }
         }          }
   
 #if 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 2384  instruction_detach(struct_processus *s_e Line 2258  instruction_detach(struct_processus *s_e
                 {                  {
                     if ((*s_etat_processus).var_volatile_alarme != 0)                      if ((*s_etat_processus).var_volatile_alarme != 0)
                     {                      {
                         envoi_signal_thread((*(*((struct_processus_fils *)                          envoi_signal_thread(s_etat_processus,
                                   (*(*((struct_processus_fils *)
                                 (*(*l_element_courant).donnee).objet)).thread)                                  (*(*l_element_courant).donnee).objet)).thread)
                                 .tid, rpl_sigurg);                                  .tid, rpl_sigurg);
                     }                      }
Line 2392  instruction_detach(struct_processus *s_e Line 2267  instruction_detach(struct_processus *s_e
                     {                      {
                         if ((*s_etat_processus).arret_depuis_abort == -1)                          if ((*s_etat_processus).arret_depuis_abort == -1)
                         {                          {
                             envoi_signal_thread((*(*((struct_processus_fils *)                              envoi_signal_thread(s_etat_processus,
                                       (*(*((struct_processus_fils *)
                                     (*(*l_element_courant).donnee).objet))                                      (*(*l_element_courant).donnee).objet))
                                     .thread).tid, rpl_sigabort);                                      .thread).tid, rpl_sigabort);
                         }                          }
                         else                          else
                         {                          {
                             envoi_signal_thread((*(*((struct_processus_fils *)                              envoi_signal_thread(s_etat_processus,
                                       (*(*((struct_processus_fils *)
                                     (*(*l_element_courant).donnee).objet))                                      (*(*l_element_courant).donnee).objet))
                                     .thread).tid, rpl_sigstop);                                      .thread).tid, rpl_sigstop);
                         }                          }
Line 2444  instruction_detach(struct_processus *s_e Line 2321  instruction_detach(struct_processus *s_e
                     (*(*((struct_processus_fils *) (*(*l_element_courant)                      (*(*((struct_processus_fils *) (*(*l_element_courant)
                             .donnee).objet)).thread).nombre_objets_dans_pipe--;                              .donnee).objet)).thread).nombre_objets_dans_pipe--;
   
                       if (pthread_mutex_lock(&mutex_sigaction) != 0)
                       {
                           destruction_queue_signaux(s_etat_processus);
                           (*s_etat_processus).erreur_systeme = d_es_processus;
                           exit(EXIT_FAILURE);
                       }
   
                     action.sa_handler = SIG_IGN;                      action.sa_handler = SIG_IGN;
                     action.sa_flags = SA_ONSTACK;                      action.sa_flags = 0;
   
                     if (sigaction(SIGPIPE, &action, &registre) != 0)                      if (sigaction(SIGPIPE, &action, &registre) != 0)
                     {                      {
                         pthread_mutex_unlock(&((*s_etat_processus)                          pthread_mutex_unlock(&((*s_etat_processus)
                                 .mutex_pile_processus));                                  .mutex_pile_processus));
                           pthread_mutex_unlock(&mutex_sigaction);
   
                         if (registre_stop == 0)                          if (registre_stop == 0)
                         {                          {
Line 2504  instruction_detach(struct_processus *s_e Line 2389  instruction_detach(struct_processus *s_e
                     {                      {
                         destruction_queue_signaux(s_etat_processus);                          destruction_queue_signaux(s_etat_processus);
   
                           pthread_mutex_unlock(&mutex_sigaction);
                         pthread_mutex_unlock(&((*s_etat_processus)                          pthread_mutex_unlock(&((*s_etat_processus)
                                 .mutex_pile_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);
                     }                      }
   
                       if (pthread_mutex_unlock(&mutex_sigaction) != 0)
                       {
                           destruction_queue_signaux(s_etat_processus);
                           pthread_mutex_unlock(&((*s_etat_processus)
                                   .mutex_pile_processus));
                           (*s_etat_processus).erreur_systeme = d_es_processus;
                           exit(EXIT_FAILURE);
                       }
                 }                  }
             }              }
   
Line 2554  instruction_detach(struct_processus *s_e Line 2449  instruction_detach(struct_processus *s_e
         {          {
             l_element_suivant = (*l_element_courant).suivant;              l_element_suivant = (*l_element_courant).suivant;
   
             if ((*((struct_socket *) (*(*l_element_courant).donnee)  
                     .objet)).socket_connectee == d_vrai)  
             {  
                 shutdown((*((struct_socket *) (*(*l_element_courant).donnee)  
                         .objet)).socket, SHUT_RDWR);  
             }  
   
             close((*((struct_socket *) (*(*l_element_courant).donnee)  
                     .objet)).socket);  
   
             if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))              if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
                     .pid == getpid()) && (pthread_equal((*((struct_socket *)                      .pid == getpid()) && (pthread_equal((*((struct_socket *)
                     (*(*l_element_courant).donnee).objet)).tid, pthread_self())                      (*(*l_element_courant).donnee).objet)).tid, pthread_self())
                     != 0))                      != 0))
             {              {
                   if ((*((struct_socket *) (*(*l_element_courant).donnee)
                           .objet)).socket_connectee == d_vrai)
                   {
                       shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
                               .objet)).socket, SHUT_RDWR);
                   }
   
                   close((*((struct_socket *) (*(*l_element_courant).donnee)
                           .objet)).socket);
   
                 if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))                  if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
                         .effacement == 'Y')                          .effacement == 'Y')
                 {                  {
Line 2862  instruction_detach(struct_processus *s_e Line 2757  instruction_detach(struct_processus *s_e
             liberation_profil(s_etat_processus);              liberation_profil(s_etat_processus);
         }          }
   
 #endif  
         attente.tv_sec = 0;          attente.tv_sec = 0;
         attente.tv_nsec = GRANULARITE_us * 1000;          attente.tv_nsec = GRANULARITE_us * 1000;
   
         while(nombre_thread_surveillance_processus != 0)          pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
   
           while(nombre_threads_surveillance_processus != 0)
         {          {
               pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
             nanosleep(&attente, NULL);              nanosleep(&attente, NULL);
             INCR_GRANULARITE(attente.tv_nsec);              INCR_GRANULARITE(attente.tv_nsec);
               pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
         }          }
   
 #if 0          pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
   
         closelog();          closelog();
   
         retrait_thread(s_etat_processus);          retrait_thread(s_etat_processus);
         liberation_contexte_cas(s_etat_processus);          liberation_contexte_cas(s_etat_processus);
 #endif  
         destruction_queue_signaux(s_etat_processus);  
   
 #       ifndef SEMAPHORES_NOMMES  
         sem_post(&((*s_etat_processus).semaphore_fork));  
         sem_destroy(&((*s_etat_processus).semaphore_fork));  
 #       else  
         sem_post((*s_etat_processus).semaphore_fork);  
         sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),  
                 pthread_self(), SEM_FORK);  
 #       endif  
   
 #if 0  
         clear_history();          clear_history();
   
         close((*s_argument_thread).pipe_erreurs[1]);          close((*s_argument_thread).pipe_erreurs[1]);
Line 2907  instruction_detach(struct_processus *s_e Line 2794  instruction_detach(struct_processus *s_e
         liberation_allocateur(s_etat_processus);          liberation_allocateur(s_etat_processus);
         liberation_allocateur_buffer(s_etat_processus);          liberation_allocateur_buffer(s_etat_processus);
   
           // Permet d'attendre la libération du mutex de la part
           // de surveillance_processus().
   
           attente.tv_sec = 0;
           attente.tv_nsec = GRANULARITE_us * 1000;
   
           while(pthread_mutex_trylock(&((*s_etat_processus).mutex_pile_processus))
                   == EBUSY)
           {
               nanosleep(&attente, NULL);
               INCR_GRANULARITE(attente.tv_nsec);
           }
   
           pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
   
           // Libération des mutexes.
   
         pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_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_allocation));
         pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));          pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));
Line 2915  instruction_detach(struct_processus *s_e Line 2819  instruction_detach(struct_processus *s_e
         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_sections_critiques);
         pthread_mutex_destroy(&mutex_liste_variables_partagees);          pthread_mutex_destroy(&mutex_liste_variables_partagees);
   
           destruction_queue_signaux(s_etat_processus);
         pthread_mutex_destroy(&mutex_liste_threads);          pthread_mutex_destroy(&mutex_liste_threads);
           pthread_mutex_destroy(&mutex_liste_threads_surveillance);
   
   #       ifndef SEMAPHORES_NOMMES
           sem_post(&((*s_etat_processus).semaphore_fork));
           sem_destroy(&((*s_etat_processus).semaphore_fork));
   #       else
           sem_post((*s_etat_processus).semaphore_fork);
           sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
                   pthread_self(), SEM_FORK);
   #       endif
   
         sys_free(s_etat_processus);          sys_free(s_etat_processus);
   
Line 2923  instruction_detach(struct_processus *s_e Line 2839  instruction_detach(struct_processus *s_e
         debug_memoire_verification();          debug_memoire_verification();
         analyse_post_mortem();          analyse_post_mortem();
 #       endif  #       endif
 #endif  
   
           pthread_mutex_destroy(&mutex_sigaction);
         exit(EXIT_SUCCESS);          exit(EXIT_SUCCESS);
     }      }
     else      else
     {      {
           deverrouillage_threads_concurrents(s_etat_processus);
         (*s_etat_processus).erreur_systeme = d_es_processus;          (*s_etat_processus).erreur_systeme = d_es_processus;
         return;          return;
     }      }
Line 3033  instruction_detach(struct_processus *s_e Line 2950  instruction_detach(struct_processus *s_e
     }      }
   
     return;      return;
 #endif  
 }  }
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.154  
changed lines
  Added in v.1.179


CVSweb interface <joel.bertrand@systella.fr>