--- rpl/src/rpl.c 2010/04/28 06:41:06 1.20 +++ rpl/src/rpl.c 2011/04/14 08:46:50 1.58.2.3 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.0.23 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -21,7 +21,13 @@ #define MAIN_RPL -#include "rpl.conv.h" +#include "rpl-conv.h" + +#ifdef IPCS_SYSV +#ifndef OS2 + unsigned char *chemin_semaphores_SysV; +#endif +#endif /* @@ -33,8 +39,8 @@ int 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; @@ -99,6 +105,16 @@ rplinit(int argc, char *argv[], unsigned volatile int erreur; volatile unsigned char traitement_fichier_temporaire; + errno = 0; + +# ifdef DMALLOC + atexit(dmalloc_shutdown()); +# endif + +# ifdef DEBUG_MEMOIRE + debug_memoire_initialisation(); +# endif + setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stderr, NULL, _IOLBF, 0); @@ -177,13 +193,17 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).rpl_home = rpl_home; - insertion_thread(s_etat_processus, d_vrai); - 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); + 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); + # ifndef SEMAPHORES_NOMMES sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); # else @@ -221,7 +241,49 @@ rplinit(int argc, char *argv[], unsigned .mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + (*s_etat_processus).chemin_fichiers_temporaires = + recherche_chemin_fichiers_temporaires(s_etat_processus); + +# ifdef IPCS_SYSV +# ifndef OS2 + chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires; +# endif +# endif + +# ifdef _BROKEN_SIGINFO + creation_fifos_signaux(s_etat_processus); +# ifdef return +# undef return +# endif +# define return destruction_fifos_signaux(s_etat_processus); return +# endif + + insertion_thread(s_etat_processus, d_vrai); + +# ifndef OS2 localisation_courante(s_etat_processus); +# else + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * + sizeof(unsigned char))) == NULL) + { + if ((*s_etat_processus).langue == 'F') + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); + } + + strcpy((*s_etat_processus).localisation, d_locale); + } +# endif + (*s_etat_processus).erreur_systeme = d_es; if ((*s_etat_processus).localisation == NULL) @@ -249,11 +311,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) @@ -317,7 +379,7 @@ rplinit(int argc, char *argv[], unsigned // Initialisation d'une pile de signal pour récupérer les // débordement de pile -# ifndef Cygwin +# if !defined(Cygwin) && !defined(OpenBSD) if (((*s_etat_processus).pile_signal.ss_sp = malloc((*s_etat_processus).pile_signal.ss_size = SIGSTKSZ)) == NULL) @@ -356,7 +418,11 @@ rplinit(int argc, char *argv[], unsigned } # endif +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption1; +# else + action.sa_handler = interruption1; +# endif action.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGINT, &action, NULL) != 0) @@ -376,7 +442,28 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } + if (sigaction(SIGTERM, &action, NULL) != 0) + { + 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); + } + +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption2; +# else + action.sa_handler = interruption2; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGTSTP, &action, NULL) != 0) @@ -394,7 +481,12 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption4; +# else + action.sa_handler = interruption4; +# endif + // SIGCONT ne doit pas pouvoir être appelé depuis son gestionnaire. action.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGSTART, &action, NULL) != 0) @@ -427,7 +519,11 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption5; +# else + action.sa_handler = interruption5; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGFSTOP, &action, NULL) != 0) @@ -447,7 +543,35 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO + action.sa_sigaction = interruption11; +# else + action.sa_handler = interruption11; +# endif + action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; + + if (sigaction(SIGFABORT, &action, NULL) != 0) + { + 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); + } + +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption8; +# else + action.sa_handler = interruption8; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGURG, &action, NULL) != 0) @@ -467,7 +591,11 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption7; +# else + action.sa_handler = interruption7; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGPIPE, &action, NULL) != 0) @@ -487,8 +615,12 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption6; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; +# else + action.sa_handler = interruption6; +# endif + action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; if (sigaction(SIGINJECT, &action, NULL) != 0) { @@ -507,8 +639,12 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption9; - action.sa_flags = SA_ONSTACK | SA_SIGINFO; +# else + action.sa_handler = interruption9; +# endif + action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; if (sigaction(SIGABORT, &action, NULL) != 0) { @@ -527,7 +663,11 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption1; +# else + action.sa_handler = interruption1; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGALRM, &action, NULL) != 0) @@ -547,12 +687,13 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption3; +# else + action.sa_handler = interruption3; +# endif action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; - (*s_etat_processus).chemin_fichiers_temporaires = - recherche_chemin_fichiers_temporaires(s_etat_processus); - erreur = d_absence_erreur; core = d_faux; mode_interactif = d_faux; @@ -1475,7 +1616,11 @@ rplinit(int argc, char *argv[], unsigned if (option_n == d_vrai) { +# ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption10; +# else + action.sa_handler = interruption10; +# endif action.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGHUP, &action, NULL) != 0) @@ -1692,10 +1837,20 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).affichage_arguments = 'N'; (*s_etat_processus).autorisation_conversion_chaine = 'Y'; (*s_etat_processus).autorisation_evaluation_nom = 'Y'; - (*s_etat_processus).autorisation_nom_implicite = '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'; @@ -1841,6 +1996,8 @@ rplinit(int argc, char *argv[], unsigned } (*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; @@ -1849,6 +2006,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; @@ -1857,6 +2015,7 @@ 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; initialisation_allocateur(s_etat_processus); initialisation_drapeaux(s_etat_processus); @@ -1876,7 +2035,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; @@ -1927,7 +2086,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; } @@ -2623,14 +2782,20 @@ rplinit(int argc, char *argv[], unsigned if (erreur == d_absence_erreur) { - erreur = evaluation(s_etat_processus, - (*s_etat_processus).at_exit, 'E'); + 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'); + } } - - liberation(s_etat_processus, - (*s_etat_processus).at_exit); } + 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); @@ -2747,10 +2912,21 @@ rplinit(int argc, char *argv[], unsigned } else { - kill((*(*((struct_processus_fils *) - (*(*((struct_liste_chainee *) - l_element_courant)).donnee).objet)) - .thread).pid, SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort + == -1) + { + kill((*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee).objet)) + .thread).pid, SIGFABORT); + } + else + { + kill((*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee).objet)) + .thread).pid, SIGFSTOP); + } } } else @@ -2775,10 +2951,25 @@ rplinit(int argc, char *argv[], unsigned } 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) + { + pthread_kill( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee) + .objet)).thread).tid, + SIGFABORT); + } + else + { + pthread_kill( + (*(*((struct_processus_fils *) + (*(*((struct_liste_chainee *) + l_element_courant)).donnee) + .objet)).thread).tid, + SIGFSTOP); + } } } @@ -2811,13 +3002,6 @@ rplinit(int argc, char *argv[], unsigned 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 *) @@ -2876,6 +3060,14 @@ 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); pthread_mutex_lock(&((*s_etat_processus).mutex)); } @@ -3345,8 +3537,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) { @@ -3398,10 +3588,6 @@ rplinit(int argc, char *argv[], unsigned } } -# ifndef Cygwin - free((*s_etat_processus).pile_signal.ss_sp); -# endif - closelog(); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); @@ -3411,6 +3597,8 @@ rplinit(int argc, char *argv[], unsigned retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); sem_destroy(&((*s_etat_processus).semaphore_fork)); @@ -3420,7 +3608,6 @@ rplinit(int argc, char *argv[], unsigned # endif free((*s_etat_processus).localisation); - free(s_etat_processus); # ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_liste_threads); @@ -3438,8 +3625,17 @@ rplinit(int argc, char *argv[], unsigned sem_gestionnaires_signaux_atomique); # endif +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# undef return +# endif + + free((*s_etat_processus).chemin_fichiers_temporaires); + free(s_etat_processus); + # ifdef DEBUG_MEMOIRE - debug_memoire_verification(s_etat_processus); + debug_memoire_verification(); + analyse_post_mortem(); # endif return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE);