--- rpl/src/instructions_d5.c 2010/04/28 07:05:38 1.14 +++ rpl/src/instructions_d5.c 2010/04/29 07:30:57 1.17 @@ -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; @@ -1862,6 +1868,22 @@ instruction_detach(struct_processus *s_e 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)) + { + (*s_etat_processus).var_volatile_requete_arret = 0; + + if (evaluation(s_etat_processus, + (*s_etat_processus).at_exit, 'E') == d_erreur) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } + } + } } else { @@ -1878,6 +1900,8 @@ instruction_detach(struct_processus *s_e { if ((*s_etat_processus).at_exit != NULL) { + (*s_etat_processus).var_volatile_requete_arret = 0; + if (evaluation(s_etat_processus, (*s_etat_processus).at_exit, 'E') == d_erreur) { @@ -1888,10 +1912,11 @@ instruction_detach(struct_processus *s_e } liberation(s_etat_processus, s_copie); - liberation(s_etat_processus, (*s_etat_processus).at_exit); } } + liberation(s_etat_processus, (*s_etat_processus).at_exit); + l_element_courant = (*s_etat_processus).liste_mutexes; while(l_element_courant != NULL) { @@ -2118,9 +2143,18 @@ instruction_detach(struct_processus *s_e } else { - kill((*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread).pid, - SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort == -1) + { + kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)).thread) + .pid, SIGFABORT); + } + else + { + kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)).thread) + .pid, SIGFSTOP); + } } } else @@ -2167,9 +2201,18 @@ instruction_detach(struct_processus *s_e } else { - pthread_kill((*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread) - .tid, SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort == -1) + { + pthread_kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)) + .thread).tid, SIGFABORT); + } + else + { + pthread_kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)) + .thread).tid, SIGFSTOP); + } } } @@ -2197,11 +2240,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; @@ -2284,6 +2322,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)); }