--- rpl/src/instructions_d5.c 2015/01/05 15:32:17 1.121 +++ rpl/src/instructions_d5.c 2016/03/09 10:57:41 1.139 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.20 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1088,6 +1088,18 @@ instruction_detach(struct_processus *s_e return; } + if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + fflush(NULL); /* @@ -1097,7 +1109,18 @@ instruction_detach(struct_processus *s_e verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); - deverrouillage_threads_concurrents(s_etat_processus); + + if ((*s_argument_thread).pid > 0) + { + deverrouillage_threads_concurrents(s_etat_processus); + } + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_allocation_buffer)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } (*s_argument_thread).thread_pere = pthread_self(); (*s_argument_thread).processus_detache = d_vrai; @@ -1119,6 +1142,12 @@ instruction_detach(struct_processus *s_e * Processus père */ + if (pthread_mutex_unlock(&mutex_liste_variables_partagees) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie); @@ -1256,13 +1285,28 @@ instruction_detach(struct_processus *s_e * Processus fils */ + pthread_mutex_destroy(&mutex_liste_variables_partagees); + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutex_destroy(&mutex_liste_threads); + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_liste_threads, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + liberation_queue_signaux(s_etat_processus); + creation_queue_signaux(s_etat_processus); + if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur) { (*s_etat_processus).erreur_systeme = d_es_processus; } - liberation_queue_signaux(s_etat_processus); - creation_queue_signaux(s_etat_processus); routine_recursive = 0; (*s_etat_processus).pointeur_signal_lecture = 0; @@ -2775,7 +2819,6 @@ instruction_detach(struct_processus *s_e closelog(); - liberation_allocateur(s_etat_processus); retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus)); @@ -2802,7 +2845,10 @@ instruction_detach(struct_processus *s_e destruction_queue_signaux(s_etat_processus); liberation_contexte_cas(s_etat_processus); arret_thread_signaux(s_etat_processus); - free(s_etat_processus); + liberation_allocateur(s_etat_processus); + liberation_allocateur_buffer(s_etat_processus); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); + sys_free(s_etat_processus); # ifdef DEBUG_MEMOIRE debug_memoire_verification();