--- rpl/src/gestion_threads.c 2011/04/11 12:10:06 1.34 +++ rpl/src/gestion_threads.c 2011/09/03 10:31:50 1.49 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.0 + RPL/2 (R) version 4.1.3 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -251,33 +251,37 @@ lancement_thread(void *argument) if ((*s_etat_processus).erreur_systeme == d_es) { - if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E') - == d_erreur) + if (setjmp(contexte_thread) == 0) { - if (((*s_etat_processus).erreur_execution == d_ex) && - ((*s_etat_processus).erreur_systeme == d_es)) + if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E') + == d_erreur) { - (*s_etat_processus).erreur_execution = - d_ex_erreur_evaluation; + if (((*s_etat_processus).erreur_execution == d_ex) && + ((*s_etat_processus).erreur_systeme == d_es)) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } } - } - else - { - if (((*s_etat_processus).var_volatile_alarme == 0) - && ((*s_etat_processus).arret_depuis_abort == 0) - && ((*s_etat_processus).at_exit != NULL)) + else { - (*s_etat_processus).var_volatile_requete_arret = 0; - (*s_etat_processus).var_volatile_traitement_retarde_stop = -1; - - if (evaluation(s_etat_processus, (*s_etat_processus).at_exit, - 'E') == d_erreur) + if (((*s_etat_processus).var_volatile_alarme == 0) + && ((*s_etat_processus).arret_depuis_abort == 0) + && ((*s_etat_processus).at_exit != NULL)) { - if (((*s_etat_processus).erreur_execution == d_ex) && - ((*s_etat_processus).erreur_systeme == d_es)) + (*s_etat_processus).var_volatile_requete_arret = 0; + (*s_etat_processus).var_volatile_traitement_retarde_stop = + -1; + + if (evaluation(s_etat_processus, + (*s_etat_processus).at_exit, 'E') == d_erreur) { - (*s_etat_processus).erreur_execution = - d_ex_erreur_evaluation; + if (((*s_etat_processus).erreur_execution == d_ex) && + ((*s_etat_processus).erreur_systeme == d_es)) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } } } } @@ -882,21 +886,8 @@ lancement_thread(void *argument) (*s_etat_processus).instruction_derniere_erreur = NULL; } - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) - { - // Les définitions ne sont pas libérées parce qu'elles sont partagées - // avec le thread père. - - if ((*s_etat_processus).s_liste_variables[i].niveau != 0) - { - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[i].objet); - } - - free((*s_etat_processus).s_liste_variables[i].nom); - } - - free((*s_etat_processus).s_liste_variables); + liberation_arbre_variables(s_etat_processus, + (*s_etat_processus).s_arbre_variables, d_faux); for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++) { @@ -1083,6 +1074,7 @@ lancement_thread(void *argument) sem_destroy(&((*s_etat_processus).semaphore_fork)); + liberation_contexte_cas(s_etat_processus); free((*s_etat_processus).localisation); free(s_etat_processus);