--- rpl/src/instructions_d5.c 2019/02/11 06:18:20 1.168 +++ rpl/src/instructions_d5.c 2023/08/07 17:42:54 1.176 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 - Copyright (C) 1989-2019 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2023 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1306,6 +1306,16 @@ instruction_detach(struct_processus *s_e pthread_mutexattr_destroy(&attributs_mutex); pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_liste_threads_surveillance, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_sigaction, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); pthread_mutex_init(&((*s_etat_processus).mutex_pile_processus), &attributs_mutex); @@ -1321,7 +1331,7 @@ instruction_detach(struct_processus *s_e creation_queue_signaux(s_etat_processus); routine_recursive = 0; - nombre_thread_surveillance_processus = 0; + nombre_threads_surveillance_processus = 0; (*s_etat_processus).pointeur_signal_lecture = 0; (*s_etat_processus).pointeur_signal_ecriture = 0; @@ -2306,6 +2316,13 @@ instruction_detach(struct_processus *s_e (*(*((struct_processus_fils *) (*(*l_element_courant) .donnee).objet)).thread).nombre_objets_dans_pipe--; + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { + destruction_queue_signaux(s_etat_processus); + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } + action.sa_handler = SIG_IGN; action.sa_flags = 0; @@ -2313,6 +2330,7 @@ instruction_detach(struct_processus *s_e { pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); + pthread_mutex_unlock(&mutex_sigaction); if (registre_stop == 0) { @@ -2366,11 +2384,21 @@ instruction_detach(struct_processus *s_e { destruction_queue_signaux(s_etat_processus); + pthread_mutex_unlock(&mutex_sigaction); pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); } + + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + destruction_queue_signaux(s_etat_processus); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } } } @@ -2729,7 +2757,7 @@ instruction_detach(struct_processus *s_e pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); - while(nombre_thread_surveillance_processus != 0) + while(nombre_threads_surveillance_processus != 0) { pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); nanosleep(&attente, NULL); @@ -2789,6 +2817,7 @@ instruction_detach(struct_processus *s_e destruction_queue_signaux(s_etat_processus); pthread_mutex_destroy(&mutex_liste_threads); + pthread_mutex_destroy(&mutex_liste_threads_surveillance); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -2806,6 +2835,7 @@ instruction_detach(struct_processus *s_e analyse_post_mortem(); # endif + pthread_mutex_destroy(&mutex_sigaction); exit(EXIT_SUCCESS); } else