--- rpl/src/instructions_d5.c 2019/02/06 14:23:26 1.166 +++ rpl/src/instructions_d5.c 2019/10/31 15:40:10 1.172 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 + RPL/2 (R) version 4.1.32 Copyright (C) 1989-2019 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; @@ -2243,7 +2253,8 @@ instruction_detach(struct_processus *s_e { if ((*s_etat_processus).var_volatile_alarme != 0) { - envoi_signal_thread((*(*((struct_processus_fils *) + envoi_signal_thread(s_etat_processus, + (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .tid, rpl_sigurg); } @@ -2251,13 +2262,15 @@ instruction_detach(struct_processus *s_e { if ((*s_etat_processus).arret_depuis_abort == -1) { - envoi_signal_thread((*(*((struct_processus_fils *) + envoi_signal_thread(s_etat_processus, + (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) .thread).tid, rpl_sigabort); } else { - envoi_signal_thread((*(*((struct_processus_fils *) + envoi_signal_thread(s_etat_processus, + (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) .thread).tid, rpl_sigstop); } @@ -2303,13 +2316,21 @@ 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 = SA_ONSTACK; + action.sa_flags = 0; if (sigaction(SIGPIPE, &action, ®istre) != 0) { pthread_mutex_unlock(&((*s_etat_processus) .mutex_pile_processus)); + pthread_mutex_unlock(&mutex_sigaction); if (registre_stop == 0) { @@ -2363,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); + } } } @@ -2724,12 +2755,18 @@ instruction_detach(struct_processus *s_e attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - while(nombre_thread_surveillance_processus != 0) + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); + + while(nombre_threads_surveillance_processus != 0) { + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); + pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)); } + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); + closelog(); retrait_thread(s_etat_processus); @@ -2780,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)); @@ -2797,6 +2835,7 @@ instruction_detach(struct_processus *s_e analyse_post_mortem(); # endif + pthread_mutex_destroy(&mutex_sigaction); exit(EXIT_SUCCESS); } else