--- rpl/src/instructions_d5.c 2017/08/02 14:41:35 1.158 +++ rpl/src/instructions_d5.c 2024/01/17 16:57:13 1.181 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.27 - Copyright (C) 1989-2017 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.36 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -815,10 +815,6 @@ instruction_der(struct_processus *s_etat void instruction_detach(struct_processus *s_etat_processus) { -#ifndef EXPERIMENTAL_CODE - printf("DETACH currently broken is replaced by SPAWN...\n"); - instruction_spawn(s_etat_processus); -#else int pipe_initialisation_segment_signaux[2]; logical1 drapeau; @@ -1299,7 +1295,6 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); #endif - pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex); @@ -1311,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); @@ -1326,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; @@ -1429,7 +1434,6 @@ instruction_detach(struct_processus *s_e (*s_argument_thread).pipe_nombre_elements_attente[1], &caractere, sizeof(caractere)) != sizeof(caractere)) { - pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; while((longueur_ecriture = write_atomic(s_etat_processus, @@ -1471,100 +1475,6 @@ instruction_detach(struct_processus *s_e pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) - != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - - caractere = 0; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_argument_thread).pipe_nombre_elements_attente[1], - &caractere, sizeof(caractere))) != sizeof(caractere)) - { - if (longueur_ecriture == -1) - { - break; - } - } - - destruction_queue_signaux(s_etat_processus); - BUG(1, uprintf("Process management error line %d\n", __LINE__)); - exit(EXIT_FAILURE); - } - - pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes)); - - if (pthread_mutex_unlock(&((*s_etat_processus) - .protection_liste_mutexes)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - - caractere = 0; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_argument_thread).pipe_nombre_elements_attente[1], - &caractere, sizeof(caractere))) != sizeof(caractere)) - { - if (longueur_ecriture == -1) - { - break; - } - } - - destruction_queue_signaux(s_etat_processus); - BUG(1, uprintf("Process management error line %d\n", __LINE__)); - exit(EXIT_FAILURE); - } - - pthread_mutex_trylock(&((*s_etat_processus).mutex_interruptions)); - - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)) - != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - - caractere = 0; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_argument_thread).pipe_nombre_elements_attente[1], - &caractere, sizeof(caractere))) != sizeof(caractere)) - { - if (longueur_ecriture == -1) - { - break; - } - } - - destruction_queue_signaux(s_etat_processus); - BUG(1, uprintf("Process management error line %d\n", __LINE__)); - exit(EXIT_FAILURE); - } - - pthread_mutex_trylock(&((*s_etat_processus).mutex_signaux)); - - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_signaux)) - != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - - caractere = 0; - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_argument_thread).pipe_nombre_elements_attente[1], - &caractere, sizeof(caractere))) != sizeof(caractere)) - { - if (longueur_ecriture == -1) - { - break; - } - } - - destruction_queue_signaux(s_etat_processus); - BUG(1, uprintf("Process management error line %d\n", __LINE__)); - exit(EXIT_FAILURE); - } - if ((*s_etat_processus).evaluation_expression_compilee == 'N') { free((*s_etat_processus).instruction_courante); @@ -1913,6 +1823,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); @@ -1922,6 +1836,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); @@ -2343,7 +2258,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); } @@ -2351,13 +2267,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); } @@ -2403,13 +2321,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) { @@ -2463,11 +2389,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); + } } } @@ -2513,21 +2449,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') { @@ -2824,26 +2760,22 @@ 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); liberation_contexte_cas(s_etat_processus); - destruction_queue_signaux(s_etat_processus); - -# ifndef SEMAPHORES_NOMMES - sem_post(&((*s_etat_processus).semaphore_fork)); - sem_destroy(&((*s_etat_processus).semaphore_fork)); -# else - sem_post((*s_etat_processus).semaphore_fork); - sem_destroy3((*s_etat_processus).semaphore_fork, getpid(), - pthread_self(), SEM_FORK); -# endif clear_history(); @@ -2862,6 +2794,23 @@ instruction_detach(struct_processus *s_e liberation_allocateur(s_etat_processus); liberation_allocateur_buffer(s_etat_processus); + // Permet d'attendre la libération du mutex de la part + // de surveillance_processus(). + + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while(pthread_mutex_trylock(&((*s_etat_processus).mutex_pile_processus)) + == EBUSY) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); + + // Libération des mutexes. + 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)); @@ -2870,7 +2819,19 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); pthread_mutex_destroy(&mutex_sections_critiques); pthread_mutex_destroy(&mutex_liste_variables_partagees); + + 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)); + sem_destroy(&((*s_etat_processus).semaphore_fork)); +# else + sem_post((*s_etat_processus).semaphore_fork); + sem_destroy3((*s_etat_processus).semaphore_fork, getpid(), + pthread_self(), SEM_FORK); +# endif sys_free(s_etat_processus); @@ -2879,10 +2840,12 @@ instruction_detach(struct_processus *s_e analyse_post_mortem(); # endif + pthread_mutex_destroy(&mutex_sigaction); exit(EXIT_SUCCESS); } else { + deverrouillage_threads_concurrents(s_etat_processus); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -2987,7 +2950,6 @@ instruction_detach(struct_processus *s_e } return; -#endif } // vim: ts=4