--- rpl/src/instructions_d5.c 2016/03/29 12:28:02 1.150 +++ rpl/src/instructions_d5.c 2016/04/06 21:14:56 1.151 @@ -1288,6 +1288,7 @@ instruction_detach(struct_processus *s_e * Processus fils */ + // EPERM pthread_mutex_destroy(&mutex_liste_variables_partagees); pthread_mutex_destroy(&mutex_liste_threads); @@ -2805,17 +2806,20 @@ instruction_detach(struct_processus *s_e liberation_profil(s_etat_processus); } - closelog(); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; - close((*s_argument_thread).pipe_erreurs[1]); - close((*s_argument_thread).pipe_interruptions[1]); - close((*s_argument_thread).pipe_nombre_elements_attente[1]); - close((*s_argument_thread).pipe_objets[1]); - close((*s_argument_thread).pipe_injections[0]); - close((*s_argument_thread).pipe_nombre_injections[0]); - close((*s_argument_thread).pipe_acquittement[0]); + while(nombre_thread_surveillance_processus != 0) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + + closelog(); retrait_thread(s_etat_processus); + liberation_contexte_cas(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -2828,8 +2832,13 @@ instruction_detach(struct_processus *s_e clear_history(); - liberation_contexte_cas(s_etat_processus); - destruction_queue_signaux(s_etat_processus); + close((*s_argument_thread).pipe_erreurs[1]); + close((*s_argument_thread).pipe_interruptions[1]); + close((*s_argument_thread).pipe_nombre_elements_attente[1]); + close((*s_argument_thread).pipe_objets[1]); + close((*s_argument_thread).pipe_injections[0]); + close((*s_argument_thread).pipe_nombre_injections[0]); + close((*s_argument_thread).pipe_acquittement[0]); free((*s_etat_processus).localisation); free((*s_etat_processus).chemin_fichiers_temporaires); @@ -2838,15 +2847,6 @@ instruction_detach(struct_processus *s_e liberation_allocateur(s_etat_processus); liberation_allocateur_buffer(s_etat_processus); - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - - while(nombre_thread_surveillance_processus != 0) - { - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - } - pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions)); @@ -2854,6 +2854,8 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); pthread_mutex_destroy(&mutex_sections_critiques); + pthread_mutex_destroy(&mutex_liste_variables_partagees); + pthread_mutex_destroy(&mutex_liste_threads); sys_free(s_etat_processus);