--- rpl/src/instructions_d5.c 2019/02/17 16:08:41 1.170 +++ rpl/src/instructions_d5.c 2023/11/22 10:55:15 1.178 @@ -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. @@ -1307,6 +1307,11 @@ instruction_detach(struct_processus *s_e 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); @@ -1338,7 +1343,6 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).erreur_systeme = d_es_processus; } - close(pipe_initialisation_segment_signaux[0]); close(pipe_initialisation_segment_signaux[1]); if ((*s_etat_processus).debug == d_vrai) @@ -1818,6 +1822,10 @@ instruction_detach(struct_processus *s_e { l_element_suivant = (*l_element_courant).suivant; + // On ne détruit pas le descripteur sous prétexte + // d'avoir le fichier ou la socket fermée dans le processus père + + /* fclose((*((struct_descripteur_fichier *) (*l_element_courant).donnee)).descripteur_c); @@ -1827,6 +1835,7 @@ instruction_detach(struct_processus *s_e sqlite3_close((*((struct_descripteur_fichier *) (*l_element_courant).donnee)).descripteur_sqlite); } + */ free((*((struct_descripteur_fichier *) (*l_element_courant) .donnee)).nom); @@ -2439,21 +2448,21 @@ instruction_detach(struct_processus *s_e { l_element_suivant = (*l_element_courant).suivant; - if ((*((struct_socket *) (*(*l_element_courant).donnee) - .objet)).socket_connectee == d_vrai) - { - shutdown((*((struct_socket *) (*(*l_element_courant).donnee) - .objet)).socket, SHUT_RDWR); - } - - close((*((struct_socket *) (*(*l_element_courant).donnee) - .objet)).socket); - if (((*((struct_socket *) (*(*l_element_courant).donnee).objet)) .pid == getpid()) && (pthread_equal((*((struct_socket *) (*(*l_element_courant).donnee).objet)).tid, pthread_self()) != 0)) { + if ((*((struct_socket *) (*(*l_element_courant).donnee) + .objet)).socket_connectee == d_vrai) + { + shutdown((*((struct_socket *) (*(*l_element_courant).donnee) + .objet)).socket, SHUT_RDWR); + } + + close((*((struct_socket *) (*(*l_element_courant).donnee) + .objet)).socket); + if ((*((struct_socket *) (*(*l_element_courant).donnee).objet)) .effacement == 'Y') { @@ -2812,6 +2821,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)); @@ -2920,7 +2930,6 @@ instruction_detach(struct_processus *s_e } close(pipe_initialisation_segment_signaux[0]); - close(pipe_initialisation_segment_signaux[1]); // Le fils peut être présent sans être en attente du signal de départ.