--- rpl/src/rpl.c 2014/07/24 14:38:44 1.160 +++ rpl/src/rpl.c 2019/02/07 21:44:15 1.207 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.19 - Copyright (C) 1989-2014 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -86,6 +86,10 @@ rplinit(int argc, char *argv[], char *en struct_processus *s_etat_processus; + struct_liste_chainee *l_bibliotheques; + struct_liste_chainee *l_bibliotheque_courante; + struct_liste_chainee *l_nouvelle_bibliotheque; + struct_liste_variables_partagees *l_element_partage_courant; struct_liste_variables_partagees *l_element_partage_suivant; @@ -123,8 +127,13 @@ rplinit(int argc, char *argv[], char *en errno = 0; s_queue_signaux = NULL; routine_recursive = 0; + nombre_thread_surveillance_processus = 0; pid_processus_pere = getpid(); +# ifdef DEBUG_PROC + __proc = 0; +# endif + # ifdef DEBUG_MEMOIRE debug_memoire_initialisation(); # endif @@ -132,7 +141,57 @@ rplinit(int argc, char *argv[], char *en setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stderr, NULL, _IOLBF, 0); - if ((s_etat_processus = malloc(sizeof(struct_processus))) == NULL) + if ((s_etat_processus = sys_malloc(sizeof(struct_processus))) == NULL) + { + erreur = d_es_allocation_memoire; + + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); + } + + (*s_etat_processus).erreur_systeme = d_es; + + initialisation_allocateur_buffer(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + erreur = d_es_allocation_memoire; + + if ((langue = getenv("LANG")) != NULL) + { + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); + } + + if (initialisation_etat_processus_readline() != 0) { erreur = d_es_allocation_memoire; @@ -179,7 +238,7 @@ rplinit(int argc, char *argv[], char *en return(EXIT_FAILURE); } - if ((arg_exec = malloc((((size_t) argc) + 1) * sizeof(char *))) == NULL) + if ((arg_exec = sys_malloc((((size_t) argc) + 1) * sizeof(char *))) == NULL) { if ((*s_etat_processus).langue == 'F') { @@ -198,7 +257,7 @@ rplinit(int argc, char *argv[], char *en arg_exec[i] = argv[i]; } - argv[argc] = NULL; + arg_exec[argc] = NULL; initialisation_contexte_cas(s_etat_processus); @@ -234,6 +293,12 @@ rplinit(int argc, char *argv[], char *en 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_allocation_buffer), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&mutex_sections_critiques, &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); @@ -243,8 +308,16 @@ rplinit(int argc, char *argv[], char *en pthread_mutex_init(&mutex_liste_variables_partagees, &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_liste_threads, &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + # ifndef SEMAPHORES_NOMMES sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); +uprintf("[%d-%llu] Semaphore fork %p (rpl.c)\n", (int) getpid(), + (unsigned long long) pthread_self(), + &((*s_etat_processus).semaphore_fork)); # else if (((*s_etat_processus).semaphore_fork = sem_init3(0, getpid(), pthread_self(), SEM_FORK)) == SEM_FAILED) @@ -320,7 +393,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); if ((*s_etat_processus).langue == 'F') { @@ -354,7 +427,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); if ((*s_etat_processus).langue == 'F') { @@ -379,11 +452,11 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).langue == 'F') { - printf("+++Copyright (C) 1989 à 2013, 2014 BERTRAND Joël\n"); + printf("+++Copyright (C) 1989 à 2018, 2019 BERTRAND Joël\n"); } else { - printf("+++Copyright (C) 1989 to 2013, 2014 BERTRAND Joel\n"); + printf("+++Copyright (C) 1989 to 2018, 2019 BERTRAND Joel\n"); } } @@ -423,7 +496,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); erreur = d_es_signal; @@ -453,39 +526,6 @@ rplinit(int argc, char *argv[], char *en } # endif - if (lancement_thread_signaux(s_etat_processus) != d_absence_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); - liberation_queue_signaux(s_etat_processus); - -# ifdef HAVE_STACK_OVERFLOW_RECOVERY - stackoverflow_deinstall_handler(); -# endif - - erreur = d_es_signal; - - if ((*s_etat_processus).langue == 'F') - { - printf("+++Système : Initialisation des signaux POSIX " - "impossible\n"); - } - else - { - printf("+++System : Initialization of POSIX signals failed\n"); - } - - return(EXIT_FAILURE); - } - action.sa_handler = interruption1; action.sa_flags = 0; @@ -501,7 +541,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -545,7 +585,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -578,7 +618,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -622,7 +662,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -643,7 +683,7 @@ rplinit(int argc, char *argv[], char *en return(EXIT_FAILURE); } - if (sigaction(SIGALRM, &action, NULL) != 0) + if (sigaction(SIGUSR2, &action, NULL) != 0) { # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -655,7 +695,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -677,7 +717,7 @@ rplinit(int argc, char *argv[], char *en } signal_test = SIGTEST; - raise(SIGALRM); + raise(SIGUSR2); attente.tv_sec = 0; attente.tv_nsec = 1000000; @@ -687,7 +727,7 @@ rplinit(int argc, char *argv[], char *en nanosleep(&attente, NULL); } - if (signal_test != SIGALRM) + if (signal_test != SIGUSR2) { # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -699,7 +739,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -735,7 +775,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -777,7 +817,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -813,7 +853,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -857,7 +897,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -893,7 +933,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -937,7 +977,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -971,6 +1011,7 @@ rplinit(int argc, char *argv[], char *en drapeau_encart = 'Y'; debug = d_faux; arguments = NULL; + l_bibliotheques = NULL; (*s_etat_processus).s_fichiers = NULL; (*s_etat_processus).s_sockets = NULL; @@ -1038,7 +1079,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1077,7 +1118,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1121,7 +1162,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1177,7 +1218,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1225,7 +1266,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1263,7 +1304,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1303,7 +1344,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1343,7 +1384,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1382,7 +1423,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1422,7 +1463,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1454,7 +1495,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1486,7 +1527,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1527,7 +1568,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1561,6 +1602,301 @@ rplinit(int argc, char *argv[], char *en break; } + case 'm' : + { + while(*(++argv[0]) == ' '); + argv[0]--; + + if ((*(++argv[0])) != '\0') + { + if ((l_nouvelle_bibliotheque = malloc( + sizeof(struct_liste_chainee))) == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + (*l_nouvelle_bibliotheque).suivant = + l_bibliotheques; + + if (((*l_nouvelle_bibliotheque).donnee = + allocation(s_etat_processus, CHN)) + == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + if (((*(*l_nouvelle_bibliotheque).donnee) + .objet = malloc((strlen(argv[0]) + 1) * + sizeof(unsigned char))) == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + strcpy((*(*l_nouvelle_bibliotheque).donnee) + .objet, argv[0]); + argv[0] += strlen((unsigned char *) + (*(*l_nouvelle_bibliotheque).donnee) + .objet) - 1; + + l_bibliotheques = l_nouvelle_bibliotheque; + } + else if ((--argc) > 0) + { + argv++; + + if ((l_nouvelle_bibliotheque = malloc( + sizeof(struct_liste_chainee))) == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + (*l_nouvelle_bibliotheque).suivant = + l_bibliotheques; + + if (((*l_nouvelle_bibliotheque).donnee = + allocation(s_etat_processus, CHN)) + == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + if (((*(*l_nouvelle_bibliotheque).donnee) + .objet = malloc((strlen(argv[0]) + 1) * + sizeof(unsigned char))) == NULL) + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire " + "insuffisante\n"); + } + else + { + printf("+++System : Not enough " + "memory\n"); + } + + return(EXIT_FAILURE); + } + + strcpy((*(*l_nouvelle_bibliotheque).donnee) + .objet, argv[0]); + argv[0] += strlen((unsigned char *) + (*(*l_nouvelle_bibliotheque).donnee) + .objet) - 1; + + l_bibliotheques = l_nouvelle_bibliotheque; + } + else + { +# 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Erreur : Aucune bibliothèque " + "spécifiée après l'option -A\n"); + } + else + { + printf("+++Error : Library required after " + "-m option\n"); + } + + return(EXIT_FAILURE); + } + + break; + } + case 'n' : { if (option_n == d_vrai) @@ -1576,7 +1912,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1616,7 +1952,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1648,7 +1984,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1688,7 +2024,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1728,7 +2064,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1768,7 +2104,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1800,7 +2136,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1845,7 +2181,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1899,7 +2235,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1944,7 +2280,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -1965,8 +2301,9 @@ rplinit(int argc, char *argv[], char *en } if (((*s_etat_processus).definitions_chainees = - compactage((*s_etat_processus) - .definitions_chainees)) == NULL) + compactage(s_etat_processus, + (*s_etat_processus).definitions_chainees)) + == NULL) { # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -1979,7 +2316,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2021,7 +2358,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2066,7 +2403,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2120,7 +2457,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2164,7 +2501,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2228,7 +2565,7 @@ rplinit(int argc, char *argv[], char *en liberation_contexte_cas( s_etat_processus); - liberation_queue_signaux( + destruction_queue_signaux( s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY @@ -2269,7 +2606,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2308,7 +2645,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2432,7 +2769,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2470,7 +2807,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2514,7 +2851,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2553,7 +2890,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2604,7 +2941,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2653,7 +2990,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2719,7 +3056,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2758,7 +3095,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2796,7 +3133,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2835,7 +3172,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2873,7 +3210,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2933,7 +3270,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -2988,7 +3325,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3250,7 +3587,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3288,7 +3625,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3340,7 +3677,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3425,7 +3762,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3472,7 +3809,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3547,7 +3884,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3598,7 +3935,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3690,7 +4027,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3731,6 +4068,138 @@ rplinit(int argc, char *argv[], char *en } } + /* + * Chargement des bibliothèques pour gérer des + * types externes lors des l'analyse syntaxique et + * compilation. + */ + + 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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Fatal :" + " Chargement de la bibliothèse %s" + " impossible\n", (unsigned char *) + (*(*l_bibliotheque_courante).donnee) + .objet); + } + else + { + printf("+++Fatal : Cannot load library %s\n", + (*(*l_bibliotheque_courante).donnee) + .objet); + } + + if (traitement_fichier_temporaire == 'Y') + { + if (destruction_fichier( + nom_fichier_temporaire) + == d_erreur) + { + return(EXIT_FAILURE); + } + + free(nom_fichier_temporaire); + } + + return(EXIT_FAILURE); + } + + instruction_use(s_etat_processus); + + if (depilement(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 + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Fatal :" + " Chargement de la bibliothèse %s" + " impossible\n", (unsigned char *) + (*(*l_bibliotheque_courante).donnee) + .objet); + } + else + { + printf("+++Fatal : Cannot load library %s\n", + (*(*l_bibliotheque_courante).donnee) + .objet); + } + + if (traitement_fichier_temporaire == 'Y') + { + if (destruction_fichier( + nom_fichier_temporaire) + == d_erreur) + { + return(EXIT_FAILURE); + } + + free(nom_fichier_temporaire); + } + + return(EXIT_FAILURE); + } + + l_bibliotheque_courante = + (*l_bibliotheque_courante).suivant; + } + if ((erreur = compilation(s_etat_processus)) != d_absence_erreur) { @@ -3744,7 +4213,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3826,7 +4295,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3869,7 +4338,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3913,7 +4382,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -3956,7 +4425,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4004,7 +4473,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4070,7 +4539,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4133,7 +4602,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4177,7 +4646,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4225,7 +4694,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4282,7 +4751,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4325,7 +4794,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4362,7 +4831,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4406,7 +4875,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4446,7 +4915,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4493,7 +4962,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4530,7 +4999,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4577,7 +5046,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -4717,7 +5186,8 @@ rplinit(int argc, char *argv[], char *en { if (setjmp(contexte_initial) == 0) { - erreur = sequenceur_optimise(s_etat_processus); + erreur = sequenceur_optimise(s_etat_processus, + l_bibliotheques); if (erreur == d_absence_erreur) { @@ -4928,7 +5398,7 @@ rplinit(int argc, char *argv[], char *en (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) - .thread).pid, rpl_sigurg); + .thread).pid, rpl_sigurg, d_faux); } else { @@ -4939,7 +5409,7 @@ rplinit(int argc, char *argv[], char *en (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) - .thread).pid, rpl_sigabort); + .thread).pid, rpl_sigabort, d_faux); } else { @@ -4947,7 +5417,7 @@ rplinit(int argc, char *argv[], char *en (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) - .thread).pid, rpl_sigstop); + .thread).pid, rpl_sigstop, d_faux); } } } @@ -5062,7 +5532,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -5113,7 +5583,7 @@ rplinit(int argc, char *argv[], char *en # endif liberation_contexte_cas(s_etat_processus); - liberation_queue_signaux(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifdef HAVE_STACK_OVERFLOW_RECOVERY stackoverflow_deinstall_handler(); @@ -5344,9 +5814,9 @@ rplinit(int argc, char *argv[], char *en { if ((*resultats) != NULL) { - free((*resultats)); + sys_free((*resultats)); - if (((*resultats) = malloc(((size_t) + if (((*resultats) = sys_malloc(((size_t) ((*s_etat_processus) .hauteur_pile_operationnelle + 1)) * sizeof(unsigned char **))) != NULL) @@ -5433,41 +5903,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) @@ -5483,6 +5918,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) @@ -5667,13 +6110,38 @@ rplinit(int argc, char *argv[], char *en retrait_thread(s_etat_processus); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while(nombre_thread_surveillance_processus != 0) + { + nanosleep(&attente, NULL); + 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)); @@ -5683,11 +6151,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) @@ -5700,9 +6163,14 @@ rplinit(int argc, char *argv[], char *en erreur = d_erreur; } - free(arg_exec); - arret_thread_signaux(s_etat_processus); - free(s_etat_processus); + liberation_etat_processus_readline(); + + 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); # ifdef DEBUG_MEMOIRE debug_memoire_verification(); @@ -5741,6 +6209,8 @@ informations(struct_processus *s_etat_pr printf(" -i : fonctionnement interactif\n"); printf(" -l : licence d'utilisation\n"); printf(" -n : ignorance du signal HUP\n"); + printf(" -m : chargement d'un module RPL/SO avant la " + "compilation\n"); printf(" -p : précompilation du script avant exécution\n"); printf(" -P : profilage (-P ou -PP)\n"); printf(" -s : empêchement de l'ouverture de l'écran initial\n"); @@ -5762,6 +6232,7 @@ informations(struct_processus *s_etat_pr printf(" -i : runs the RPL/2 sequencer in interactive mode\n"); printf(" -l : prints the user licence of the software\n"); printf(" -n : ignores HUP signal\n"); + printf(" -m : loads RPL/SO object before compilation\n"); printf(" -p : precompiles script\n"); printf(" -P : computes profile data (-P or -PP)\n"); printf(" -s : disables splash screen\n"); @@ -5828,7 +6299,7 @@ controle_integrite(struct_processus *s_e unsigned char * -date_compilation() +date_compilation(struct_processus *s_etat_processus) { unsigned char *date;