--- rpl/src/instructions_d5.c 2011/11/18 20:24:40 1.78 +++ rpl/src/instructions_d5.c 2012/04/13 14:12:53 1.88 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.4 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.8 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1367,13 +1367,6 @@ instruction_detach(struct_processus *s_e l_element_courant = (*s_etat_processus).liste_mutexes; while(l_element_courant != NULL) { - pthread_mutex_trylock(&((*((struct_mutex *) (*(*l_element_courant) - .donnee).objet)).mutex)); - pthread_mutex_unlock(&((*((struct_mutex *) (*(*l_element_courant) - .donnee).objet)).mutex)); - pthread_mutex_destroy(&((*((struct_mutex *) (*(*l_element_courant) - .donnee).objet)).mutex)); - liberation(s_etat_processus, (*l_element_courant).donnee); l_element_suivant = (*l_element_courant).suivant; free(l_element_courant); @@ -1955,6 +1948,18 @@ instruction_detach(struct_processus *s_e if ((*s_etat_processus).erreur_systeme == d_es) { + // Évite le warning variable s_copie might be clobbered by + // longjmp or vfork + struct_objet **s; + + if ((s = malloc(sizeof(struct_objet *))) == NULL) + { + (*s_etat_processus).erreur_execution = d_es_allocation_memoire; + return; + } + + (*s) = s_copie; + if (setjmp(contexte_processus) == 0) { if (variable_partagee == d_faux) @@ -1988,7 +1993,7 @@ instruction_detach(struct_processus *s_e } else { - if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur) + if (evaluation(s_etat_processus, (*s), 'E') == d_erreur) { if (((*s_etat_processus).erreur_execution == d_ex) && ((*s_etat_processus).erreur_systeme == d_es)) @@ -1999,7 +2004,9 @@ instruction_detach(struct_processus *s_e } else { - if ((*s_etat_processus).at_exit != NULL) + if (((*s_etat_processus).var_volatile_alarme == 0) + && ((*s_etat_processus).arret_depuis_abort == 0) + && ((*s_etat_processus).at_exit != NULL)) { (*s_etat_processus).var_volatile_requete_arret = 0; @@ -2013,9 +2020,11 @@ instruction_detach(struct_processus *s_e } } - liberation(s_etat_processus, s_copie); + liberation(s_etat_processus, (*s)); } } + + free(s); } liberation(s_etat_processus, (*s_etat_processus).at_exit); @@ -2024,13 +2033,6 @@ instruction_detach(struct_processus *s_e l_element_courant = (*s_etat_processus).liste_mutexes; while(l_element_courant != NULL) { - pthread_mutex_trylock(&((*((struct_mutex *) - (*(*l_element_courant).donnee).objet)).mutex)); - pthread_mutex_unlock(&((*((struct_mutex *) - (*(*l_element_courant).donnee).objet)).mutex)); - pthread_mutex_destroy(&((*((struct_mutex *) - (*(*l_element_courant).donnee).objet)).mutex)); - liberation(s_etat_processus, (*l_element_courant).donnee); l_element_suivant = (*l_element_courant).suivant; free(l_element_courant);