--- rpl/src/rpl.c 2010/01/31 19:45:10 1.3 +++ rpl/src/rpl.c 2011/09/19 17:33:17 1.88 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -21,7 +21,7 @@ #define MAIN_RPL -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -31,16 +31,15 @@ */ int -rplinit(int argc, char *argv[], unsigned char ***resultats) +rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home) { -# include "copyright.conv.h" -# include "licence.conv.h" +# include "copyright-conv.h" +# include "licence-conv.h" file *f_source; int erreur_historique; int option_P; - int status; logical1 core; logical1 debug; @@ -99,41 +98,105 @@ rplinit(int argc, char *argv[], unsigned volatile int erreur; volatile unsigned char traitement_fichier_temporaire; + errno = 0; + s_queue_signaux = NULL; + pid_processus_pere = getpid(); + +# ifdef DEBUG_MEMOIRE + debug_memoire_initialisation(); +# endif + setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stderr, NULL, _IOLBF, 0); - sem_init(&semaphore_liste_threads, 0, 1); +# ifndef SEMAPHORES_NOMMES sem_init(&semaphore_gestionnaires_signaux, 0, 0); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); +# else + semaphore_gestionnaires_signaux = sem_init2(0, getpid()); + + if (semaphore_gestionnaires_signaux == SEM_FAILED) + { + 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); + } +# endif if ((s_etat_processus = malloc(sizeof(struct_processus))) == NULL) { erreur = d_es_allocation_memoire; - if ((*s_etat_processus).langue == 'F') + if ((langue = getenv("LANG")) != NULL) { - printf("+++Système : Mémoire insuffisante\n"); + if (strncmp(langue, "fr", 2) == 0) + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } } else { - printf("+++System : Not enough memory\n"); + uprintf("+++System : Not enough memory\n"); } return(EXIT_FAILURE); } + if ((langue = getenv("LANG")) != NULL) + { + (*s_etat_processus).langue = (strncmp(langue, "fr", 2) == 0) + ? 'F' : 'E'; + } + else + { + (*s_etat_processus).langue = 'E'; + } + + initialisation_contexte_cas(s_etat_processus); + (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex; + (*s_etat_processus).compteur_violation_d_acces = 0; - insertion_thread(s_etat_processus, d_vrai); + (*s_etat_processus).rpl_home = rpl_home; pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); pthread_mutex_init(&((*s_etat_processus).mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + pthread_mutex_init(&((*s_etat_processus).mutex_allocation), + &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_fork), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutex_lock(&((*s_etat_processus).mutex_fork)); pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); @@ -153,30 +216,56 @@ rplinit(int argc, char *argv[], unsigned .mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); - if ((langue = getenv("LANG")) != NULL) - { - (*s_etat_processus).langue = (strncmp(langue, "fr", 2) == 0) - ? 'F' : 'E'; - } - else - { - (*s_etat_processus).langue = 'E'; - } + (*s_etat_processus).chemin_fichiers_temporaires = + recherche_chemin_fichiers_temporaires(s_etat_processus); - localisation_courante(s_etat_processus); + insertion_thread(s_etat_processus, d_vrai); + creation_queue_signaux(s_etat_processus); +# ifndef OS2 + localisation_courante(s_etat_processus); +# else if ((*s_etat_processus).erreur_systeme != d_es) { - if ((*s_etat_processus).langue == 'F') + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * + sizeof(unsigned char))) == NULL) { - uprintf("+++Système : Mémoire insuffisante\n"); + if ((*s_etat_processus).langue == 'F') + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); } - else + + strcpy((*s_etat_processus).localisation, d_locale); + } +# endif + + (*s_etat_processus).erreur_systeme = d_es; + + if ((*s_etat_processus).localisation == NULL) + { + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * + sizeof(unsigned char))) == NULL) { - uprintf("+++System : Not enough memory\n"); + if ((*s_etat_processus).langue == 'F') + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); } - return(EXIT_FAILURE); + strcpy((*s_etat_processus).localisation, d_locale); } printf("+++RPL/2 (R) version %s (%s)\n", d_version_rpl, @@ -184,11 +273,11 @@ rplinit(int argc, char *argv[], unsigned if ((*s_etat_processus).langue == 'F') { - printf("+++Copyright (C) 1989 à 2009, 2010 BERTRAND Joël\n"); + printf("+++Copyright (C) 1989 à 2010, 2011 BERTRAND Joël\n"); } else { - printf("+++Copyright (C) 1989 to 2009, 2010 BERTRAND Joel\n"); + printf("+++Copyright (C) 1989 to 2010, 2011 BERTRAND Joel\n"); } if (getenv("HOME") != NULL) @@ -213,40 +302,10 @@ rplinit(int argc, char *argv[], unsigned home = ""; } - // Initialisation d'une clef - - if (pthread_key_create(&semaphore_fork_processus_courant, NULL) != 0) - { - if ((*s_etat_processus).langue == 'F') - { - printf("+++Système : Mémoire insuffisante\n"); - } - else - { - printf("+++System : Not enough memory\n"); - } - - return(EXIT_FAILURE); - } - - if (pthread_setspecific(semaphore_fork_processus_courant, - &((*s_etat_processus).semaphore_fork)) != 0) - { - if ((*s_etat_processus).langue == 'F') - { - printf("+++Système : Mémoire insuffisante\n"); - } - else - { - printf("+++System : Not enough memory\n"); - } - - return(EXIT_FAILURE); - } - // Initialisation d'une pile de signal pour récupérer les // débordement de pile +# if !defined(Cygwin) && !defined(OpenBSD) if (((*s_etat_processus).pile_signal.ss_sp = malloc((*s_etat_processus).pile_signal.ss_size = SIGSTKSZ)) == NULL) @@ -283,9 +342,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# endif - action.sa_sigaction = interruption1; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + action.sa_handler = interruption1; + action.sa_flags = SA_ONSTACK; if (sigaction(SIGINT, &action, NULL) != 0) { @@ -304,11 +364,13 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption2; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + signal_test = SIGTEST; + kill(getpid(), SIGINT); - if (sigaction(SIGTSTP, &action, NULL) != 0) + if (signal_test != SIGINT) { + erreur = d_es_signal; + if ((*s_etat_processus).langue == 'F') { printf("+++Système : Initialisation des signaux POSIX " @@ -322,11 +384,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption4; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; - - if (sigaction(SIGSTART, &action, NULL) != 0) + if (sigaction(SIGTERM, &action, NULL) != 0) { + erreur = d_es_signal; + if ((*s_etat_processus).langue == 'F') { printf("+++Système : Initialisation des signaux POSIX " @@ -340,8 +401,13 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - if (sigaction(SIGCONT, &action, NULL) != 0) + signal_test = SIGTEST; + kill(getpid(), SIGTERM); + + if (signal_test != SIGTERM) { + erreur = d_es_signal; + if ((*s_etat_processus).langue == 'F') { printf("+++Système : Initialisation des signaux POSIX " @@ -355,13 +421,11 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption5; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + action.sa_handler = interruption2; + action.sa_flags = SA_NODEFER | SA_ONSTACK; - if (sigaction(SIGFSTOP, &action, NULL) != 0) + if (sigaction(SIGTSTP, &action, NULL) != 0) { - erreur = d_es_signal; - if ((*s_etat_processus).langue == 'F') { printf("+++Système : Initialisation des signaux POSIX " @@ -375,10 +439,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption8; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + signal_test = SIGTEST; + kill(getpid(), SIGTSTP); - if (sigaction(SIGURG, &action, NULL) != 0) + if (signal_test != SIGTSTP) { erreur = d_es_signal; @@ -395,8 +459,8 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption7; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + action.sa_handler = interruption5; + action.sa_flags = SA_NODEFER | SA_ONSTACK; if (sigaction(SIGPIPE, &action, NULL) != 0) { @@ -415,10 +479,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption6; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + signal_test = SIGTEST; + kill(getpid(), SIGPIPE); - if (sigaction(SIGINJECT, &action, NULL) != 0) + if (signal_test != SIGPIPE) { erreur = d_es_signal; @@ -435,10 +499,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption9; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + action.sa_handler = interruption1; + action.sa_flags = SA_NODEFER | SA_ONSTACK; - if (sigaction(SIGABORT, &action, NULL) != 0) + if (sigaction(SIGALRM, &action, NULL) != 0) { erreur = d_es_signal; @@ -455,10 +519,10 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption1; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + signal_test = SIGTEST; + kill(getpid(), SIGALRM); - if (sigaction(SIGALRM, &action, NULL) != 0) + if (signal_test != SIGALRM) { erreur = d_es_signal; @@ -475,13 +539,9 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - action.sa_sigaction = interruption3; - action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; - - (*s_etat_processus).chemin_fichiers_temporaires = - recherche_chemin_fichiers_temporaires(s_etat_processus); + signal_test = SIGTEST + 1; - erreur = d_os; + erreur = d_absence_erreur; core = d_faux; mode_interactif = d_faux; (*s_etat_processus).nom_fichier_source = NULL; @@ -502,7 +562,7 @@ rplinit(int argc, char *argv[], unsigned if (argc == 1) { - erreur = d_os_ligne_de_commande; + erreur = d_erreur; informations(s_etat_processus); } else @@ -527,6 +587,15 @@ rplinit(int argc, char *argv[], unsigned option_t = d_faux; option_v = d_faux; + // Lorsque le programme est appelé depuis un shebang, argv[0] contient + // le chemin du programme et argv[1] tous les arguments. + // argv[2] contient quant à lui le nom du script RPL/2. + // + // Exemple : + // argv[0] : /usr/local/bin/rpl + // argv[1] : -csdp -t 800 + // argv[2] : ./on_exit.rpl + while((--argc) > 0) { if ((*(++argv))[0] == '-') @@ -554,31 +623,6 @@ rplinit(int argc, char *argv[], unsigned } option_a = d_vrai; - printf("\n"); - - if ((*s_etat_processus).langue == 'F') - { - printf(" Auteur: Joël BERTRAND,\n"); - printf(" Email : " - "joel.bertrand@systella.fr\n"); - printf(" Liste de diffusion : " - "rpl2@systella.fr\n"); - printf(" Page : " - "http://www.rpl2.fr"); - printf("\n"); - } - else - { - printf(" Author: Joël BERTRAND,\n"); - printf(" Email : " - "joel.bertrand@systella.fr\n"); - printf(" Mailing list : " - "rpl2@systella.fr\n"); - printf(" Web page : " - "http://www.rpl2/net"); - printf("\n"); - } - break; } @@ -1293,6 +1337,7 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } + free(type_debug); break; } @@ -1346,6 +1391,12 @@ rplinit(int argc, char *argv[], unsigned break; } + case '-': + case ' ': + { + break; + } + default : { if ((*s_etat_processus).langue == 'F') @@ -1380,7 +1431,7 @@ rplinit(int argc, char *argv[], unsigned printf("+++Error : More than one definition\n"); } - erreur = d_os_ligne_de_commande; + erreur = d_erreur; } else { @@ -1392,6 +1443,9 @@ rplinit(int argc, char *argv[], unsigned if (debug == d_faux) { + action.sa_handler = interruption3; + action.sa_flags = SA_NODEFER | SA_ONSTACK; + if (sigaction(SIGSEGV, &action, NULL) != 0) { if ((*s_etat_processus).langue == 'F') @@ -1427,8 +1481,8 @@ rplinit(int argc, char *argv[], unsigned if (option_n == d_vrai) { - action.sa_sigaction = interruption10; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + action.sa_handler = interruption4; + action.sa_flags = SA_ONSTACK; if (sigaction(SIGHUP, &action, NULL) != 0) { @@ -1566,8 +1620,6 @@ rplinit(int argc, char *argv[], unsigned &existence, &ouverture, &unite_fichier); } - (*s_etat_processus).recherche_types_speciaux = 'N'; - if (((existence == d_faux) || (erreur_fichier != d_absence_erreur)) && (option_S == d_faux)) { @@ -1584,7 +1636,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).nom_fichier_source); } - erreur = d_os_fichier_introuvable; + erreur = d_erreur; } else { @@ -1631,7 +1683,7 @@ rplinit(int argc, char *argv[], unsigned } } - if ((erreur == d_os) && (presence_definition == 'O')) + if ((erreur == d_absence_erreur) && (presence_definition == 'O')) { (*s_etat_processus).profilage = (option_P != 0) ? d_vrai : d_faux; (*s_etat_processus).niveau_profilage = option_P; @@ -1644,9 +1696,22 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).test_instruction = 'N'; (*s_etat_processus).nombre_arguments = 0; (*s_etat_processus).affichage_arguments = 'N'; + (*s_etat_processus).autorisation_conversion_chaine = 'Y'; (*s_etat_processus).autorisation_evaluation_nom = 'Y'; + + if (mode_interactif == d_vrai) + { + (*s_etat_processus).autorisation_nom_implicite = 'Y'; + } + else + { + (*s_etat_processus).autorisation_nom_implicite = 'N'; + } + (*s_etat_processus).autorisation_empilement_programme = 'N'; (*s_etat_processus).requete_arret = 'N'; + (*s_etat_processus).evaluation_forcee = 'N'; + (*s_etat_processus).recherche_type = 'N'; (*s_etat_processus).constante_symbolique = 'N'; (*s_etat_processus).traitement_symbolique = 'N'; @@ -1658,10 +1723,10 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).l_base_pile = NULL; (*s_etat_processus).l_base_pile_last = NULL; - (*s_etat_processus).s_liste_variables = NULL; + (*s_etat_processus).s_arbre_variables = NULL; + (*s_etat_processus).l_liste_variables_par_niveau = NULL; (*s_etat_processus).gel_liste_variables = d_faux; - (*s_etat_processus).nombre_variables = 0; - (*s_etat_processus).nombre_variables_allouees = 0; + (*s_etat_processus).pointeur_variable_courante = NULL; (*s_etat_processus).s_liste_variables_statiques = NULL; (*s_etat_processus).nombre_variables_statiques = 0; (*s_etat_processus).nombre_variables_statiques_allouees = 0; @@ -1669,7 +1734,6 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).niveau_initial = 0; (*s_etat_processus).creation_variables_statiques = d_faux; (*s_etat_processus).creation_variables_partagees = d_faux; - (*s_etat_processus).position_variable_courante = 0; (*s_etat_processus).position_variable_statique_courante = 0; (*s_etat_processus).s_bibliotheques = NULL; @@ -1791,6 +1855,10 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).pile_origine_interruptions[i] = NULL; } + (*s_etat_processus).at_exit = NULL; + (*s_etat_processus).at_poke = NULL; + (*s_etat_processus).traitement_at_poke = 'N'; + (*s_etat_processus).pointeurs_caracteres = NULL; (*s_etat_processus).arbre_instructions = NULL; @@ -1798,6 +1866,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).pid_processus_pere = getpid(); (*s_etat_processus).processus_detache = d_vrai; (*s_etat_processus).var_volatile_processus_pere = -1; + (*s_etat_processus).var_volatile_processus_racine = -1; (*s_etat_processus).var_volatile_traitement_retarde_stop = 0; (*s_etat_processus).var_volatile_alarme = 0; (*s_etat_processus).var_volatile_requete_arret = 0; @@ -1806,9 +1875,14 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).var_volatile_traitement_sigint = 0; (*s_etat_processus).var_volatile_recursivite = 0; (*s_etat_processus).var_volatile_exception_gsl = 0; + (*s_etat_processus).arret_depuis_abort = 0; + (*s_etat_processus).pointeur_signal_lecture = 0; + (*s_etat_processus).pointeur_signal_ecriture = 0; initialisation_allocateur(s_etat_processus); initialisation_drapeaux(s_etat_processus); + initialisation_variables(s_etat_processus); + initialisation_instructions(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { @@ -1825,7 +1899,7 @@ rplinit(int argc, char *argv[], unsigned } if (((*s_etat_processus).instruction_derniere_erreur = - malloc(2 * sizeof(unsigned char))) == NULL) + malloc(sizeof(unsigned char))) == NULL) { erreur = d_es_allocation_memoire; @@ -1876,7 +1950,7 @@ rplinit(int argc, char *argv[], unsigned free((*s_etat_processus).instruction_courante); - if ((*s_etat_processus).erreur_systeme == d_es_allocation_memoire) + if ((*s_etat_processus).erreur_systeme != d_es) { erreur = d_es_allocation_memoire; } @@ -2194,7 +2268,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).position_courante = 0; (*s_etat_processus).traitement_cycle_exit = 'N'; - if ((*s_etat_processus).nombre_variables == 0) + if ((*s_etat_processus).s_arbre_variables == NULL) { if ((*s_etat_processus).langue == 'F') { @@ -2254,9 +2328,8 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].niveau != 0) + if ((*(*s_etat_processus).pointeur_variable_courante) + .niveau != 0) { if ((*s_etat_processus).langue == 'F') { @@ -2342,8 +2415,6 @@ rplinit(int argc, char *argv[], unsigned fflush(stdout); - initialisation_instructions(s_etat_processus); - if (arguments != NULL) { tampon = (*s_etat_processus).definitions_chainees; @@ -2543,26 +2614,69 @@ rplinit(int argc, char *argv[], unsigned free(arguments); } - if (option_D == d_vrai) + if (option_a == d_vrai) { - lancement_daemon(s_etat_processus); + fprintf(stdout, "%s\n", (*s_etat_processus) + .definitions_chainees); } - - if (option_p == d_faux) + else { - if (setjmp(contexte_initial) == 0) + if (option_D == d_vrai) { - erreur = sequenceur(s_etat_processus); + lancement_daemon(s_etat_processus); } - } - else - { - if (setjmp(contexte_initial) == 0) + +// A FIXER +// création signaux + if (option_p == d_faux) + { + if (setjmp(contexte_initial) == 0) + { + erreur = sequenceur(s_etat_processus); + + if (erreur == d_absence_erreur) + { + if (((*s_etat_processus).var_volatile_alarme + == 0) && ((*s_etat_processus) + .arret_depuis_abort == 0) && + ((*s_etat_processus).at_exit + != NULL)) + { + erreur = evaluation(s_etat_processus, + (*s_etat_processus).at_exit, + 'E'); + } + } + } + } + else { - erreur = sequenceur_optimise(s_etat_processus); + if (setjmp(contexte_initial) == 0) + { + erreur = sequenceur_optimise(s_etat_processus); + + if (erreur == d_absence_erreur) + { + if (((*s_etat_processus).var_volatile_alarme + == 0) && ((*s_etat_processus) + .arret_depuis_abort == 0) && + ((*s_etat_processus).at_exit + != NULL)) + { + erreur = evaluation(s_etat_processus, + (*s_etat_processus).at_exit, + 'E'); + } + } + } } +// A FIXER +// destruction signaux } + liberation(s_etat_processus, (*s_etat_processus).at_exit); + liberation(s_etat_processus, (*s_etat_processus).at_poke); + if ((*s_etat_processus).generateur_aleatoire != NULL) { liberation_generateur_aleatoire(s_etat_processus); @@ -2672,17 +2786,31 @@ rplinit(int argc, char *argv[], unsigned { if ((*s_etat_processus).var_volatile_alarme != 0) { - kill((*(*((struct_processus_fils *) + envoi_signal_processus( + (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) - .thread).pid, SIGURG); + .thread).pid, rpl_sigurg); } else { - kill((*(*((struct_processus_fils *) - (*(*((struct_liste_chainee *) - l_element_courant)).donnee).objet)) - .thread).pid, SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort + == -1) + { + envoi_signal_processus( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee).objet)) + .thread).pid, rpl_sigabort); + } + else + { + envoi_signal_processus( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee).objet)) + .thread).pid, rpl_sigstop); + } } } else @@ -2700,17 +2828,33 @@ rplinit(int argc, char *argv[], unsigned if ((*s_etat_processus).var_volatile_alarme != 0) { - pthread_kill((*(*((struct_processus_fils *) + envoi_signal_thread( + (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) l_element_courant)).donnee).objet)) - .thread).tid, SIGURG); + .thread).tid, rpl_sigurg); } else { - pthread_kill((*(*((struct_processus_fils *) - (*(*((struct_liste_chainee *) - l_element_courant)).donnee).objet)) - .thread).tid, SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort + == -1) + { + envoi_signal_thread( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee) + .objet)).thread).tid, + rpl_sigabort); + } + else + { + envoi_signal_thread( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee) + .objet)).thread).tid, + rpl_sigstop); + } } } @@ -2738,18 +2882,9 @@ rplinit(int argc, char *argv[], unsigned while((*s_etat_processus).l_base_pile_processus != NULL) { - status = 0; - l_element_courant = (void *) (*s_etat_processus).l_base_pile_processus; - if ((*s_etat_processus) - .nombre_interruptions_non_affectees != 0) - { - affectation_interruptions_logicielles( - s_etat_processus); - } - for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *) (*(*((struct_liste_chainee *) @@ -2808,7 +2943,16 @@ rplinit(int argc, char *argv[], unsigned } pthread_mutex_unlock(&((*s_etat_processus).mutex)); + + if ((*s_etat_processus) + .nombre_interruptions_non_affectees != 0) + { + affectation_interruptions_logicielles( + s_etat_processus); + } + nanosleep(&attente, NULL); + scrutation_interruptions(s_etat_processus); pthread_mutex_lock(&((*s_etat_processus).mutex)); } @@ -2962,14 +3106,9 @@ rplinit(int argc, char *argv[], unsigned * le libérer... */ - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) - { - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[i].objet); - free((*s_etat_processus).s_liste_variables[i].nom); - } - - free((*s_etat_processus).s_liste_variables); + liberation_arbre_variables(s_etat_processus, + (*s_etat_processus).s_arbre_variables, d_vrai); + free((*s_etat_processus).pointeurs_caracteres_variables); for(i = 0; i < (*s_etat_processus) .nombre_variables_statiques; i++) @@ -3186,7 +3325,17 @@ rplinit(int argc, char *argv[], unsigned fclose((*((struct_descripteur_fichier *) (*((struct_liste_chainee *) l_element_courant)).donnee)) - .descripteur); + .descripteur_c); + + if ((*((struct_descripteur_fichier *) + (*((struct_liste_chainee *) + l_element_courant)).donnee)).type != 'C') + { + sqlite3_close((*((struct_descripteur_fichier *) + (*((struct_liste_chainee *) + l_element_courant)).donnee)) + .descripteur_sqlite); + } if ((*((struct_descripteur_fichier *) (*((struct_liste_chainee *) @@ -3267,8 +3416,6 @@ rplinit(int argc, char *argv[], unsigned l_element_courant = l_element_suivant; } - free((*s_etat_processus).chemin_fichiers_temporaires); - l_element_courant = (*s_etat_processus).s_marques; while(l_element_courant != NULL) { @@ -3320,7 +3467,6 @@ rplinit(int argc, char *argv[], unsigned } } - free((*s_etat_processus).pile_signal.ss_sp); closelog(); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); @@ -3330,18 +3476,36 @@ rplinit(int argc, char *argv[], unsigned retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex)); - sem_post(&((*s_etat_processus).semaphore_fork)); - sem_destroy(&((*s_etat_processus).semaphore_fork)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + + pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_fork)); free((*s_etat_processus).localisation); - free(s_etat_processus); - sem_destroy(&semaphore_liste_threads); + pthread_mutex_destroy(&mutex_liste_threads); + pthread_mutex_destroy(&mutex_gestionnaires_signaux_atomique); + +# ifndef SEMAPHORES_NOMMES sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux); - sem_destroy(&semaphore_gestionnaires_signaux_atomique); +# else + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, getpid()); +# endif + + destruction_queue_signaux(s_etat_processus); + liberation_contexte_cas(s_etat_processus); + + free((*s_etat_processus).chemin_fichiers_temporaires); + free(s_etat_processus); + +# ifdef DEBUG_MEMOIRE + debug_memoire_verification(); + analyse_post_mortem(); +# endif - return((erreur == d_os) ? EXIT_SUCCESS : EXIT_FAILURE); + return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -3353,7 +3517,7 @@ informations(struct_processus *s_etat_pr if ((*s_etat_processus).langue == 'F') { printf(" rpl [-options] [programme]\n"); - printf(" -a : informations sur l'auteur\n"); + printf(" -a : analyse du code\n"); printf(" -A : paramètres passés au programme principal\n"); printf(" -c : génération de fichier de débogage (rpl-core)\n"); printf(" -d : option de déverminage interne\n"); @@ -3372,7 +3536,7 @@ informations(struct_processus *s_etat_pr else { printf(" rpl [-options] [program]\n"); - printf(" -a : displays informations about the author\n"); + printf(" -a : analyzes program\n"); printf(" -A : sends parameters to main program\n"); printf(" -c : allows creation of a rpl-core file, providing a way" "\n"