--- rpl/src/instructions_d5.c 2010/06/04 07:48:20 1.25 +++ rpl/src/instructions_d5.c 2010/06/19 15:54:51 1.29 @@ -1183,15 +1183,33 @@ 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; } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + (*((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_processus; + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } @@ -1520,6 +1538,8 @@ instruction_detach(struct_processus *s_e exit(EXIT_FAILURE); } + pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes)); + if (pthread_mutex_unlock(&((*s_etat_processus) .protection_liste_mutexes)) != 0) { @@ -1698,15 +1718,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) @@ -1732,6 +1754,8 @@ instruction_detach(struct_processus *s_e } free(s_argument_thread2); + free((*(*l_element_courant).donnee).objet); + free((*l_element_courant).donnee); } l_element_suivant = (*l_element_courant).suivant; @@ -2825,6 +2849,7 @@ instruction_detach(struct_processus *s_e retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); pthread_key_delete(semaphore_fork_processus_courant); @@ -2869,40 +2894,6 @@ instruction_detach(struct_processus *s_e { (*s_etat_processus).erreur_systeme = d_es_processus; 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; - return; } // Si le pid existe déjà dans la pile des processus, il s'agit forcement