--- rpl/src/instructions_d5.c 2013/09/06 10:30:53 1.114 +++ rpl/src/instructions_d5.c 2016/03/16 11:10:47 1.143 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.16 - Copyright (C) 1989-2013 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. @@ -767,6 +767,7 @@ instruction_der(struct_processus *s_etat if ((s_objet_simplifie = simplification(s_etat_processus, s_objet_resultat)) == NULL) { + liberation(s_etat_processus, s_objet_resultat); return; } @@ -1087,6 +1088,20 @@ 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; + } + + verrouillage_threads_concurrents(s_etat_processus); + + if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + fflush(NULL); /* @@ -1094,9 +1109,21 @@ instruction_detach(struct_processus *s_e * de mémoire, ni libération, ni copie d'objet concurrent au fork(). */ - verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); - 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; + } + + if ((*s_argument_thread).pid > 0) + { + // On ne déverrouille les threads concurrents que dans le processus + // père. Dans le fils, les valeurs sont non initialisées. + deverrouillage_threads_concurrents(s_etat_processus); + } (*s_argument_thread).thread_pere = pthread_self(); (*s_argument_thread).processus_detache = d_vrai; @@ -1118,6 +1145,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); @@ -1255,13 +1288,27 @@ instruction_detach(struct_processus *s_e * Processus fils */ + pthread_mutex_destroy(&mutex_liste_variables_partagees); + pthread_mutex_destroy(&mutex_liste_threads); + + 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_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; @@ -2149,14 +2196,6 @@ instruction_detach(struct_processus *s_e } } - 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]); - l_element_courant = (*s_etat_processus).s_fichiers; while(l_element_courant != NULL) @@ -2719,8 +2758,6 @@ instruction_detach(struct_processus *s_e l_element_courant = l_element_suivant; } - free((*s_etat_processus).chemin_fichiers_temporaires); - if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_debug_processus) != 0) @@ -2774,15 +2811,15 @@ instruction_detach(struct_processus *s_e closelog(); - liberation_allocateur(s_etat_processus); - retrait_thread(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]); - 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)); - pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux)); - pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); - pthread_mutex_destroy(&mutex_sections_critiques); + retrait_thread(s_etat_processus); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -2793,15 +2830,27 @@ instruction_detach(struct_processus *s_e pthread_self(), SEM_FORK); # endif + clear_history(); + + liberation_contexte_cas(s_etat_processus); + destruction_queue_signaux(s_etat_processus); + + liberation_allocateur(s_etat_processus); + liberation_allocateur_buffer(s_etat_processus); + free((*s_etat_processus).localisation); + free((*s_etat_processus).chemin_fichiers_temporaires); free(s_argument_thread); - clear_history(); + 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)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux)); + pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); + pthread_mutex_destroy(&mutex_sections_critiques); - destruction_queue_signaux(s_etat_processus); - liberation_contexte_cas(s_etat_processus); - arret_thread_signaux(s_etat_processus); - free(s_etat_processus); + sys_free(s_etat_processus); # ifdef DEBUG_MEMOIRE debug_memoire_verification();