--- rpl/src/instructions_d5.c 2012/08/22 10:47:15 1.90 +++ rpl/src/instructions_d5.c 2012/09/15 12:57:09 1.91 @@ -1423,6 +1423,42 @@ instruction_detach(struct_processus *s_e exit(EXIT_FAILURE); } + if (pthread_mutex_destroy(&mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + + pid_final = -2; + + while((longueur_ecriture = write_atomic(s_etat_processus, + (*s_argument_thread).pipe_nombre_interruptions_attente[1], + &pid_final, sizeof(pid_final))) != sizeof(pid_final)) + { + if (longueur_ecriture == -1) + { + break; + } + } + + while((longueur_ecriture = write_atomic(s_etat_processus, + (*s_argument_thread).pipe_nombre_objets_attente[1], + &pid_final, sizeof(pid_final))) != sizeof(pid_final)) + { + if (longueur_ecriture == -1) + { + break; + } + } + + destruction_queue_signaux(s_etat_processus); + BUG(1, uprintf("Process management error line %d\n", __LINE__)); + exit(EXIT_FAILURE); + } + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1578,6 +1614,7 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).presence_fusible = d_faux; (*s_etat_processus).thread_fusible = 0; (*s_etat_processus).pid_erreur_processus_fils = getpid(); + (*s_etat_processus).sections_critiques = 0; if ((*s_etat_processus).profilage == d_vrai) { @@ -2027,6 +2064,11 @@ instruction_detach(struct_processus *s_e free(s); } + for(i = 0; i < (*s_etat_processus).sections_critiques; i++) + { + pthread_mutex_unlock(&mutex_sections_critiques); + } + liberation(s_etat_processus, (*s_etat_processus).at_exit); liberation(s_etat_processus, (*s_etat_processus).at_poke); @@ -2773,6 +2815,7 @@ instruction_detach(struct_processus *s_e 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_mutex_destroy(&mutex_sections_critiques); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork));