--- rpl/src/instructions_d5.c 2010/06/04 07:48:20 1.25 +++ rpl/src/instructions_d5.c 2010/06/08 10:22:37 1.26 @@ -1183,18 +1183,42 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_copie); } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + liberation(s_etat_processus, s_objet); + + if ((s_objet = allocation(s_etat_processus, PRC)) == NULL) { - (*s_etat_processus).erreur_systeme = d_es_processus; + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } + (*((struct_processus_fils *) (*s_objet).objet)).thread = + s_argument_thread; + (*(*((struct_processus_fils *) (*s_objet).objet)).thread) + .nombre_objets_dans_pipe = 0; + (*(*((struct_processus_fils *) (*s_objet).objet)).thread) + .nombre_interruptions_dans_pipe = 0; + (*(*((struct_processus_fils *) (*s_objet).objet)).thread) + .nombre_references = 1; + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + /* + * On copie l'objet plutôt que le pointeur car cet objet peut être + * accédé depuis deux threads distincts et aboutir à un blocage lors + * d'une copie. + */ + + if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O')) + == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + if (close((*s_argument_thread).pipe_erreurs[1]) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1698,15 +1722,17 @@ instruction_detach(struct_processus *s_e l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; + while(l_element_courant != NULL) { s_argument_thread2 = (struct_descripteur_thread *) - (*l_element_courant).donnee; + (*((struct_processus_fils *) (*(*l_element_courant).donnee) + .objet)).thread; (*s_argument_thread2).nombre_references--; BUG((*s_argument_thread2).nombre_references < 0, - printf("(*s_argument_thread).nombre_references = %d\n", + printf("(*s_argument_thread2).nombre_references = %d\n", (int) (*s_argument_thread2).nombre_references)); if ((*s_argument_thread2).nombre_references == 0) @@ -2871,34 +2897,6 @@ instruction_detach(struct_processus *s_e return; } - liberation(s_etat_processus, s_objet); - - if ((s_objet = allocation(s_etat_processus, PRC)) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - (*((struct_processus_fils *) (*s_objet).objet)).thread = s_argument_thread; - (*(*((struct_processus_fils *) (*s_objet).objet)).thread) - .nombre_objets_dans_pipe = 0; - (*(*((struct_processus_fils *) (*s_objet).objet)).thread) - .nombre_interruptions_dans_pipe = 0; - (*(*((struct_processus_fils *) (*s_objet).objet)).thread) - .nombre_references = 1; - - /* - * On copie l'objet plutôt que le pointeur car cet objet peut être - * accédé depuis deux threads distincts et aboutir à un blocage lors d'une - * copie. - */ - - if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O')) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus;