--- rpl/src/gestion_processus.c 2010/06/04 07:48:19 1.14 +++ rpl/src/gestion_processus.c 2010/06/08 10:22:36 1.15 @@ -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,21 @@ 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); @@ -1766,6 +1795,21 @@ 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);