--- rpl/src/gestion_processus.c 2010/01/26 15:22:45 1.1 +++ rpl/src/gestion_processus.c 2010/06/09 12:19:13 1.16 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -76,6 +76,7 @@ surveillance_processus(void *argument) sigemptyset(&masque); sigaddset(&masque, SIGINJECT); sigaddset(&masque, SIGFSTOP); + sigaddset(&masque, SIGFABORT); sigaddset(&masque, SIGURG); sigaddset(&masque, SIGALRM); sigaddset(&masque, SIGCONT); @@ -84,8 +85,22 @@ surveillance_processus(void *argument) s_argument_thread = argument; s_etat_processus = (*s_argument_thread).s_etat_processus; + + if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + BUG(1, uprintf("General mutex error!\n")); + } + insertion_thread_surveillance(s_etat_processus, s_argument_thread); + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + BUG(1, uprintf("General mutex error!\n")); + } + + attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -713,7 +728,7 @@ surveillance_processus(void *argument) } BUG(l_element_courant == NULL, - printf("Process or thread not found")); + printf("Process or thread not found\n")); if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) @@ -1753,6 +1768,23 @@ 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 *) @@ -1762,6 +1794,24 @@ surveillance_processus(void *argument) { (*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); } @@ -1774,52 +1824,53 @@ surveillance_processus(void *argument) } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; - } - } - - if ((*s_etat_processus).debug == d_vrai) - if (((*s_etat_processus).type_debug & - d_debug_processus) != 0) - { - if ((*s_argument_thread).processus_detache == d_vrai) + if ((*s_etat_processus).debug == d_vrai) + if (((*s_etat_processus).type_debug & + d_debug_processus) != 0) { - if ((*s_etat_processus).langue == 'F') + if ((*s_argument_thread).processus_detache == d_vrai) { - printf("[%d] Arrêt du thread de surveillance du" - " processus %d\n", (int) getpid(), - (int) (*s_argument_thread).pid); + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Arrêt du thread de surveillance du" + " processus %d\n", (int) getpid(), + (int) (*s_argument_thread).pid); + } + else + { + printf("[%d] Stop monitoring of process %d", (int) getpid(), + (int) (*s_argument_thread).pid); + } } else { - printf("[%d] Stop monitoring of process %d", (int) getpid(), - (int) (*s_argument_thread).pid); + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Arrêt du thread de surveillance du" + " thread %llu\n", (int) getpid(), + (unsigned long long) (*s_argument_thread) + .tid); + } + else + { + printf("[%d] Stop monitoring of thread %llu", + (int) getpid(), + (unsigned long long) (*s_argument_thread) + .tid); + } } + + fflush(stdout); } - else + + retrait_thread_surveillance(s_etat_processus, s_argument_thread); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { - if ((*s_etat_processus).langue == 'F') - { - printf("[%d] Arrêt du thread de surveillance du" - " thread %llu\n", (int) getpid(), - (unsigned long long) (*s_argument_thread) - .tid); - } - else - { - printf("[%d] Stop monitoring of thread %llu", (int) getpid(), - (unsigned long long) (*s_argument_thread) - .tid); - } + (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; } - - fflush(stdout); } - retrait_thread_surveillance(s_etat_processus, s_argument_thread); - pthread_exit(NULL); } @@ -3378,12 +3429,16 @@ lecture_pipe(struct_processus *s_etat_pr ================================================================================ */ -inline void +extern inline void scrutation_injection(struct_processus *s_etat_processus) { fd_set ensemble_descripteurs; - struct timespec timeout; +# ifndef OpenBSD + struct timespec timeout; +# else + struct timeval timeout; +# endif unsigned char tampon; @@ -3395,11 +3450,19 @@ scrutation_injection(struct_processus *s FD_SET((*s_etat_processus).pipe_nombre_injections, &ensemble_descripteurs); +# ifndef OpenBSD timeout.tv_sec = 0; timeout.tv_nsec = 0; if (pselect((*s_etat_processus).pipe_nombre_injections + 1, &ensemble_descripteurs, NULL, NULL, &timeout, NULL) > 0) +# else + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if (select((*s_etat_processus).pipe_nombre_injections + 1, + &ensemble_descripteurs, NULL, NULL, &timeout) > 0) +# endif { if (read_atomic(s_etat_processus, (*s_etat_processus).pipe_nombre_injections, @@ -3432,7 +3495,7 @@ scrutation_injection(struct_processus *s /* ================================================================================ - Fonction de test du draeau d'arrêt + Fonction de test du drapeau d'arrêt ================================================================================ Entrées : pointeur sur une structure --------------------------------------------------------------------------------