--- rpl/src/gestion_processus.c 2010/06/09 12:19:13 1.16 +++ rpl/src/gestion_processus.c 2010/06/19 15:54:51 1.19 @@ -53,6 +53,7 @@ surveillance_processus(void *argument) pid_t pid; pid_t pid_candidat; + pid_t pid_erreur; pthread_t tid_candidat; @@ -71,7 +72,8 @@ surveillance_processus(void *argument) unsigned char caractere; - unsigned int tampon_erreur; + unsigned int tampon_erreur_execution; + unsigned int tampon_erreur_systeme; sigemptyset(&masque); sigaddset(&masque, SIGINJECT); @@ -100,7 +102,6 @@ surveillance_processus(void *argument) BUG(1, uprintf("General mutex error!\n")); } - attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -1443,7 +1444,7 @@ surveillance_processus(void *argument) attente.tv_nsec = GRANULARITE_us * 1000; while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0], - &((*s_etat_processus).erreur_execution_processus_fils), + &tampon_erreur_execution, sizeof((*s_etat_processus).erreur_execution_processus_fils)) != sizeof((*s_etat_processus).erreur_execution_processus_fils)) { @@ -1455,7 +1456,7 @@ surveillance_processus(void *argument) attente.tv_nsec = GRANULARITE_us * 1000; while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0], - &tampon_erreur, + &tampon_erreur_systeme, sizeof((*s_etat_processus).erreur_systeme_processus_fils)) != sizeof((*s_etat_processus).erreur_systeme_processus_fils)) { @@ -1463,13 +1464,11 @@ surveillance_processus(void *argument) INCR_GRANULARITE(attente.tv_nsec); } - (*s_etat_processus).erreur_systeme_processus_fils = tampon_erreur; - attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0], - &((*s_etat_processus).pid_erreur_processus_fils), + &pid_erreur, sizeof((*s_etat_processus).pid_erreur_processus_fils)) != sizeof((*s_etat_processus).pid_erreur_processus_fils)) { @@ -1478,18 +1477,6 @@ surveillance_processus(void *argument) } /* - * Si une erreur est déclarée dans le processus fils, le message - * d'erreur a déjà été affiché. - */ - - if (((*s_etat_processus).erreur_systeme_processus_fils != d_es) || - ((*s_etat_processus).erreur_execution_processus_fils != d_ex)) - { - (*s_etat_processus).erreur_processus_fils = d_vrai; - (*s_etat_processus).invalidation_message_erreur = d_vrai; - } - - /* * Retrait du processus de la pile des processus */ @@ -1504,6 +1491,24 @@ surveillance_processus(void *argument) } else { + (*s_etat_processus).erreur_execution_processus_fils = + tampon_erreur_execution; + (*s_etat_processus).erreur_systeme_processus_fils = + tampon_erreur_systeme; + (*s_etat_processus).pid_erreur_processus_fils = pid_erreur; + + /* + * Si une erreur est déclarée dans le processus fils, le message + * d'erreur a déjà été affiché. + */ + + if (((*s_etat_processus).erreur_systeme_processus_fils != d_es) || + ((*s_etat_processus).erreur_execution_processus_fils != d_ex)) + { + (*s_etat_processus).erreur_processus_fils = d_vrai; + (*s_etat_processus).invalidation_message_erreur = d_vrai; + } + do { drapeau_fin = d_faux; @@ -1767,54 +1772,16 @@ surveillance_processus(void *argument) { (*s_etat_processus).l_base_pile_processus = (*l_element_courant).suivant; - - (*(*((struct_processus_fils *) (*(*l_element_courant) - .donnee).objet)).thread).nombre_references--; - - // Cette référence ne peut être nulle car l'objet est encore - // référencé par la liste des threads de surveillance. - - BUG((*(*((struct_processus_fils *) (*(*l_element_courant) - .donnee).objet)).thread).nombre_references <= 0, - uprintf("(*(*((struct_processus_fils *) " - "(*(*l_element_courant).donnee).objet)).thread)" - ".nombre_references = %d\n", - (*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread) - .nombre_references)); - - free((*(*l_element_courant).donnee).objet); - free((*l_element_courant).donnee); - free(l_element_courant); - - l_element_courant = (struct_liste_chainee *) - (*s_etat_processus).l_base_pile_processus; } else { (*l_element_precedent).suivant = (*l_element_courant).suivant; - - (*(*((struct_processus_fils *) (*(*l_element_courant) - .donnee).objet)).thread).nombre_references--; - - // Cette référence ne peut être nulle car l'objet est encore - // référencé par la liste des threads de surveillance. - - BUG((*(*((struct_processus_fils *) (*(*l_element_courant) - .donnee).objet)).thread).nombre_references <= 0, - uprintf("(*(*((struct_processus_fils *) " - "(*(*l_element_courant).donnee).objet)).thread)" - ".nombre_references = %d\n", - (*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread) - .nombre_references)); - - free((*(*l_element_courant).donnee).objet); - free((*l_element_courant).donnee); - free(l_element_courant); } + liberation(s_etat_processus, (*l_element_courant).donnee); + free(l_element_courant); + break; } else