--- rpl/src/gestion_processus.c 2010/05/16 19:36:20 1.11 +++ rpl/src/gestion_processus.c 2010/06/09 12:19:13 1.16 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -85,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; @@ -1754,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 *) @@ -1763,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); } @@ -1775,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); }