--- rpl/src/rpl.c 2017/07/04 10:28:08 1.195 +++ rpl/src/rpl.c 2018/12/24 15:56:37 1.203 @@ -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.30 + Copyright (C) 1989-2018 Dr. BERTRAND Joël This file is part of RPL/2. @@ -129,7 +129,6 @@ rplinit(int argc, char *argv[], char *en routine_recursive = 0; nombre_thread_surveillance_processus = 0; pid_processus_pere = getpid(); - affichage_rplso = d_vrai; # ifdef DEBUG_PROC __proc = 0; @@ -450,11 +449,11 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).langue == 'F') { - printf("+++Copyright (C) 1989 à 2016, 2017 BERTRAND Joël\n"); + printf("+++Copyright (C) 1989 à 2017, 2018 BERTRAND Joël\n"); } else { - printf("+++Copyright (C) 1989 to 2016, 2017 BERTRAND Joel\n"); + printf("+++Copyright (C) 1989 to 2017, 2018 BERTRAND Joel\n"); } } @@ -4134,9 +4133,7 @@ rplinit(int argc, char *argv[], char *en return(EXIT_FAILURE); } - affichage_rplso = d_faux; instruction_use(s_etat_processus); - affichage_rplso = d_vrai; if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &((*l_bibliotheque_courante) @@ -5085,73 +5082,6 @@ rplinit(int argc, char *argv[], char *en { if (setjmp(contexte_initial) == 0) { - // Libération des bibliothèques - - l_bibliotheque_courante = l_bibliotheques; - - while(l_bibliotheque_courante != NULL) - { - if (empilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - (*l_bibliotheque_courante).donnee) - == d_erreur) - { -# 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 - - liberation_contexte_cas( - s_etat_processus); - destruction_queue_signaux( - s_etat_processus); - -# ifdef HAVE_STACK_OVERFLOW_RECOVERY - stackoverflow_deinstall_handler(); -# endif - -# ifdef HAVE_SIGSEGV_RECOVERY - if (debug == d_faux) - { - sigsegv_deinstall_handler(); - } -# endif - - erreur = d_es_allocation_memoire; - - if ((*s_etat_processus).langue == 'F') - { - printf("+++Système : Mémoire " - "insuffisante\n"); - } - else - { - printf("+++System : Not enough " - "memory\n"); - } - - return(EXIT_FAILURE); - } - - affichage_rplso = d_faux; - instruction_remove(s_etat_processus); - affichage_rplso = d_vrai; - - l_nouvelle_bibliotheque = - (*l_bibliotheque_courante).suivant; - free(l_bibliotheque_courante); - l_bibliotheque_courante = - l_nouvelle_bibliotheque; - } - erreur = sequenceur(s_etat_processus); if (erreur == d_absence_erreur) @@ -5970,41 +5900,6 @@ rplinit(int argc, char *argv[], char *en l_element_courant = l_element_suivant; } - for(i = 0; i < (*s_etat_processus) - .nombre_instructions_externes; i++) - { - free((*s_etat_processus).s_instructions_externes[i] - .nom); - free((*s_etat_processus).s_instructions_externes[i] - .nom_bibliotheque); - } - - if ((*s_etat_processus).nombre_instructions_externes != 0) - { - free((*s_etat_processus).s_instructions_externes); - } - - l_element_courant = (void *) (*s_etat_processus) - .s_bibliotheques; - - while(l_element_courant != NULL) - { - l_element_suivant = (*((struct_liste_chainee *) - l_element_courant)).suivant; - - free((*((struct_bibliotheque *) - (*((struct_liste_chainee *) - l_element_courant)).donnee)).nom); - dlclose((*((struct_bibliotheque *) - (*((struct_liste_chainee *) - l_element_courant)).donnee)).descripteur); - free((*((struct_liste_chainee *) l_element_courant)) - .donnee); - free(l_element_courant); - - l_element_courant = l_element_suivant; - } - l_element_courant = (void *) (*s_etat_processus) .l_base_pile_last; while(l_element_courant != NULL) @@ -6020,6 +5915,14 @@ rplinit(int argc, char *argv[], char *en l_element_courant = l_element_suivant; } + while((*s_etat_processus).s_bibliotheques != NULL) + { + retrait_bibliotheque(s_etat_processus, + (struct_bibliotheque *) + (*((struct_liste_chainee *) + (*s_etat_processus).s_bibliotheques)).donnee); + } + l_element_courant = (void *) (*s_etat_processus) .l_base_pile_systeme; while(l_element_courant != NULL) @@ -6213,13 +6116,29 @@ rplinit(int argc, char *argv[], char *en INCR_GRANULARITE(attente.tv_nsec); } + 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)); 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(&mutex_sections_critiques); pthread_mutex_destroy(&mutex_liste_variables_partagees); + free((*s_etat_processus).localisation); + + destruction_queue_signaux(s_etat_processus); + pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux)); + liberation_contexte_cas(s_etat_processus); + # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); sem_destroy(&((*s_etat_processus).semaphore_fork)); @@ -6229,11 +6148,6 @@ rplinit(int argc, char *argv[], char *en SEM_FORK); # endif - free((*s_etat_processus).localisation); - - destruction_queue_signaux(s_etat_processus); - liberation_contexte_cas(s_etat_processus); - free((*s_etat_processus).chemin_fichiers_temporaires); if ((*s_etat_processus).requete_redemarrage == d_vrai) @@ -6250,6 +6164,7 @@ rplinit(int argc, char *argv[], char *en liberation_allocateur_buffer(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); + pthread_mutex_destroy(&mutex_liste_threads); sys_free(s_etat_processus); sys_free(arg_exec);