--- rpl/src/instructions_d5.c 2010/04/28 11:05:45 1.16 +++ rpl/src/instructions_d5.c 2010/05/25 18:09:44 1.23 @@ -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. @@ -1062,6 +1062,12 @@ instruction_detach(struct_processus *s_e return; } + if (sigaddset(&set, SIGFABORT) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (sigaddset(&set, SIGURG) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1271,13 +1277,25 @@ instruction_detach(struct_processus *s_e (*s_argument_thread).s_etat_processus = s_etat_processus; +# ifdef DEBUG_MEMOIRE + debug_memoire_verrouillage(); +# endif + if (pthread_create(&thread_surveillance, &attributs, surveillance_processus, s_argument_thread) != 0) { +# ifdef DEBUG_MEMOIRE + debug_memoire_deverrouillage(); +# endif + (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# ifdef DEBUG_MEMOIRE + debug_memoire_deverrouillage(); +# endif + if (pthread_attr_destroy(&attributs) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1824,6 +1842,12 @@ instruction_detach(struct_processus *s_e * Destruction des piles de connecteurs SQL */ +/* +================================================================================ + À 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; while(l_element_courant != NULL) @@ -1834,6 +1858,9 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, (*l_element_courant).donnee); 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 @@ -2234,11 +2261,6 @@ instruction_detach(struct_processus *s_e l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; - if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) - { - affectation_interruptions_logicielles(s_etat_processus); - } - registre_stop = (*s_etat_processus) .var_volatile_traitement_retarde_stop; (*s_etat_processus).var_volatile_traitement_retarde_stop = 1; @@ -2321,6 +2343,12 @@ instruction_detach(struct_processus *s_e } pthread_mutex_unlock(&((*s_etat_processus).mutex)); + + if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) + { + affectation_interruptions_logicielles(s_etat_processus); + } + nanosleep(&attente, NULL); pthread_mutex_lock(&((*s_etat_processus).mutex)); } @@ -2623,6 +2651,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 @@ -2678,7 +2708,6 @@ instruction_detach(struct_processus *s_e # endif free((*s_etat_processus).localisation); - free(s_etat_processus); free(s_argument_thread); # ifndef SEMAPHORES_NOMMES @@ -2697,8 +2726,11 @@ 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 exit(EXIT_SUCCESS);