--- rpl/src/gestion_threads.c 2010/04/28 07:05:38 1.12 +++ rpl/src/gestion_threads.c 2010/04/29 07:30:57 1.15 @@ -263,8 +263,12 @@ lancement_thread(void *argument) } 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; + if (evaluation(s_etat_processus, (*s_etat_processus).at_exit, 'E') == d_erreur) { @@ -488,8 +492,16 @@ lancement_thread(void *argument) } 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 @@ -579,9 +591,18 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread) .thread_actif == d_vrai) { - 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); + } } if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) @@ -621,11 +642,6 @@ lancement_thread(void *argument) 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; @@ -718,6 +734,12 @@ lancement_thread(void *argument) } 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)); }