--- rpl/src/rpl.c 2011/11/30 20:40:08 1.104 +++ rpl/src/rpl.c 2012/10/04 15:21:26 1.119 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.5 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.11 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -251,6 +251,11 @@ rplinit(int argc, char *argv[], char *en &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); + # ifndef SEMAPHORES_NOMMES sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); # else @@ -345,11 +350,11 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).langue == 'F') { - printf("+++Copyright (C) 1989 à 2010, 2011 BERTRAND Joël\n"); + printf("+++Copyright (C) 1989 à 2011, 2012 BERTRAND Joël\n"); } else { - printf("+++Copyright (C) 1989 to 2010, 2011 BERTRAND Joel\n"); + printf("+++Copyright (C) 1989 to 2011, 2012 BERTRAND Joel\n"); } if (getenv("HOME") != NULL) @@ -429,6 +434,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGINT); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGINT) { erreur = d_es_signal; @@ -466,6 +479,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGTERM); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGTERM) { erreur = d_es_signal; @@ -483,6 +504,51 @@ rplinit(int argc, char *argv[], char *en return(EXIT_FAILURE); } + if (sigaction(SIGALRM, &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); + } + + signal_test = SIGTEST; + kill(getpid(), SIGALRM); + + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + + if (signal_test != SIGALRM) + { + 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 = interruption2; action.sa_flags = 0; @@ -504,6 +570,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGTSTP); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGTSTP) { erreur = d_es_signal; @@ -544,6 +618,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGPIPE); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGPIPE) { erreur = d_es_signal; @@ -584,6 +666,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGUSR1); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGUSR1) { erreur = d_es_signal; @@ -1553,6 +1643,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGSEGV); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGSEGV) { erreur = d_es_signal; @@ -1572,6 +1670,9 @@ rplinit(int argc, char *argv[], char *en } # endif + action.sa_handler = interruption3; + action.sa_flags = 0; + if (sigaction(SIGBUS, &action, NULL) != 0) { if ((*s_etat_processus).langue == 'F') @@ -1591,6 +1692,14 @@ rplinit(int argc, char *argv[], char *en signal_test = SIGTEST; kill(getpid(), SIGBUS); + attente.tv_sec = 0; + attente.tv_nsec = 1000000; + + for(i = 0; (i < 1000) && (signal_test == SIGTEST); i++) + { + nanosleep(&attente, NULL); + } + if (signal_test != SIGBUS) { erreur = d_es_signal; @@ -1824,6 +1933,7 @@ rplinit(int argc, char *argv[], char *en gettimeofday(&((*s_etat_processus).horodatage_profilage), NULL); (*s_etat_processus).liste_mutexes = NULL; + (*s_etat_processus).sections_critiques = 0; (*s_etat_processus).test_instruction = 'N'; (*s_etat_processus).nombre_arguments = 0; @@ -1859,14 +1969,12 @@ rplinit(int argc, char *argv[], char *en (*s_etat_processus).l_liste_variables_par_niveau = NULL; (*s_etat_processus).gel_liste_variables = d_faux; (*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; + (*s_etat_processus).pointeur_variable_statique_courante = NULL; + (*s_etat_processus).l_liste_variables_statiques = NULL; (*s_etat_processus).niveau_courant = 0; (*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_statique_courante = 0; (*s_etat_processus).s_bibliotheques = NULL; (*s_etat_processus).s_instructions_externes = NULL; @@ -1995,6 +2103,7 @@ rplinit(int argc, char *argv[], char *en (*s_etat_processus).arbre_instructions = NULL; (*s_etat_processus).tid_processus_pere = pthread_self(); + (*s_etat_processus).tid = pthread_self(); (*s_etat_processus).pid_processus_pere = getpid(); (*s_etat_processus).processus_detache = d_vrai; (*s_etat_processus).var_volatile_processus_pere = -1; @@ -2091,12 +2200,10 @@ rplinit(int argc, char *argv[], char *en (*((*s_etat_processus).l_base_pile_systeme)) .retour_definition = 'Y'; - (*s_etat_processus).indep = (struct_objet *) malloc( - sizeof(struct_objet)); - (*s_etat_processus).depend = (struct_objet *) malloc( - sizeof(struct_objet)); + (*s_etat_processus).indep = allocation(s_etat_processus, NON); + (*s_etat_processus).depend = allocation(s_etat_processus, NON); (*s_etat_processus).parametres_courbes_de_niveau = - (struct_objet *) malloc(sizeof(struct_objet)); + allocation(s_etat_processus, NON); if (((*s_etat_processus).indep != NULL) && ((*s_etat_processus).depend != NULL) && @@ -2506,6 +2613,11 @@ rplinit(int argc, char *argv[], char *en home, ds_fichier_historique); using_history(); + + // Pour pouvoir utiliser le keymap avant le premier + // appel à readline(). + rl_initialize(); + erreur_historique = read_history( (*s_etat_processus).nom_fichier_historique); @@ -2802,6 +2914,11 @@ rplinit(int argc, char *argv[], char *en } } + for(i = 0; i < (*s_etat_processus).sections_critiques; i++) + { + pthread_mutex_unlock(&mutex_sections_critiques); + } + liberation(s_etat_processus, (*s_etat_processus).at_exit); liberation(s_etat_processus, (*s_etat_processus).at_poke); @@ -3228,6 +3345,8 @@ rplinit(int argc, char *argv[], char *en (*s_etat_processus).s_arbre_variables, d_vrai); free((*s_etat_processus).pointeurs_caracteres_variables); +#warning A FIXER + /* for(i = 0; i < (*s_etat_processus) .nombre_variables_statiques; i++) { @@ -3238,6 +3357,7 @@ rplinit(int argc, char *argv[], char *en } free((*s_etat_processus).s_liste_variables_statiques); + */ for(i = 0; i < (*((*s_etat_processus) .s_liste_variables_partagees)).nombre_variables; @@ -3595,6 +3715,7 @@ rplinit(int argc, char *argv[], char *en pthread_mutex_destroy(&((*s_etat_processus).mutex)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + pthread_mutex_destroy(&mutex_sections_critiques); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -3607,9 +3728,6 @@ rplinit(int argc, char *argv[], char *en free((*s_etat_processus).localisation); - 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); @@ -3626,7 +3744,7 @@ rplinit(int argc, char *argv[], char *en if ((*s_etat_processus).requete_redemarrage == d_vrai) { chdir(repertoire_initial); - execve(arg_exec[0], &(arg_exec[0]), envp); + execvp(arg_exec[0], &(arg_exec[0])); erreur = d_erreur; }