--- rpl/src/instructions_d5.c 2010/05/13 19:09:18 1.19 +++ rpl/src/instructions_d5.c 2010/06/02 10:28:45 1.24 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1644,8 +1644,29 @@ instruction_detach(struct_processus *s_e * Initialisation de la pile des processus */ + l_element_courant = (struct_liste_chainee *) + (*s_etat_processus).l_base_pile_processus; + + while(l_element_courant != NULL) + { + l_element_suivant = (*l_element_courant).suivant; + + if ((*((*(struct_processus_fils *) (*(*l_element_courant).donnee) + .objet)).thread).processus_detache == d_faux) + { + liberation(s_etat_processus, (*((*(struct_processus_fils *) + (*(*l_element_courant).donnee).objet)).thread) + .argument); + } + + free((*(*l_element_courant).donnee).objet); + free((*l_element_courant).donnee); + free(l_element_courant); + + l_element_courant = l_element_suivant; + } + (*s_etat_processus).l_base_pile_processus = NULL; - // Les données associées sont déjà effacées par liberation_thread(). /* * Initialisation de la pile système @@ -1835,6 +1856,7 @@ instruction_detach(struct_processus *s_e À noter : on ne ferme pas la connexion car la conséquence immédiate est une destruction de l'objet pour le processus père. ================================================================================ +*/ l_element_courant = (*s_etat_processus).s_connecteurs_sql; @@ -1842,11 +1864,10 @@ instruction_detach(struct_processus *s_e { l_element_suivant = (*l_element_courant).suivant; - sqlclose((*l_element_courant).donnee); +// sqlclose((*l_element_courant).donnee); liberation(s_etat_processus, (*l_element_courant).donnee); l_element_courant = l_element_suivant; } -*/ (*s_etat_processus).s_connecteurs_sql = NULL; @@ -2639,6 +2660,8 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_objet); # ifndef Cygwin + (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; + sigaltstack(&((*s_etat_processus).pile_signal), NULL); free((*s_etat_processus).pile_signal.ss_sp); # endif @@ -2712,12 +2735,13 @@ instruction_detach(struct_processus *s_e clear_history(); + free(s_etat_processus); + # ifdef DEBUG_MEMOIRE - debug_memoire_verification(s_etat_processus); + debug_memoire_verification(); + analyse_post_mortem(); # endif - free(s_etat_processus); - exit(EXIT_SUCCESS); } else