Diff for /rpl/src/rpl.c between versions 1.106 and 1.122

version 1.106, 2011/12/16 13:46:56 version 1.122, 2012/10/14 21:37:11
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.5    RPL/2 (R) version 4.1.11
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 80  rplinit(int argc, char *argv[], char *en Line 80  rplinit(int argc, char *argv[], char *en
   
     struct_processus                    *s_etat_processus;      struct_processus                    *s_etat_processus;
   
       struct_liste_variables_statiques    *l_element_statique_courant;
       struct_liste_variables_statiques    *l_element_statique_suivant;
   
     struct_table_variables_partagees    s_variables_partagees;      struct_table_variables_partagees    s_variables_partagees;
   
     struct sigaction                    action;      struct sigaction                    action;
Line 251  rplinit(int argc, char *argv[], char *en Line 254  rplinit(int argc, char *argv[], char *en
             &attributs_mutex);              &attributs_mutex);
     pthread_mutexattr_destroy(&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  #   ifndef SEMAPHORES_NOMMES
         sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);          sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
 #   else  #   else
Line 345  rplinit(int argc, char *argv[], char *en Line 353  rplinit(int argc, char *argv[], char *en
   
     if ((*s_etat_processus).langue == 'F')      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      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)      if (getenv("HOME") != NULL)
Line 406  rplinit(int argc, char *argv[], char *en Line 414  rplinit(int argc, char *argv[], char *en
         }          }
 #   endif  #   endif
   
       if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur)
       {
           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_handler = interruption1;
     action.sa_flags = 0;      action.sa_flags = 0;
   
Line 429  rplinit(int argc, char *argv[], char *en Line 454  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGINT);      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)      if (signal_test != SIGINT)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 466  rplinit(int argc, char *argv[], char *en Line 499  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGTERM);      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)      if (signal_test != SIGTERM)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 503  rplinit(int argc, char *argv[], char *en Line 544  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGALRM);      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)      if (signal_test != SIGALRM)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 541  rplinit(int argc, char *argv[], char *en Line 590  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGTSTP);      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)      if (signal_test != SIGTSTP)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 581  rplinit(int argc, char *argv[], char *en Line 638  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGPIPE);      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)      if (signal_test != SIGPIPE)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 621  rplinit(int argc, char *argv[], char *en Line 686  rplinit(int argc, char *argv[], char *en
     signal_test = SIGTEST;      signal_test = SIGTEST;
     kill(getpid(), SIGUSR1);      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)      if (signal_test != SIGUSR1)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
Line 1590  rplinit(int argc, char *argv[], char *en Line 1663  rplinit(int argc, char *argv[], char *en
             signal_test = SIGTEST;              signal_test = SIGTEST;
             kill(getpid(), SIGSEGV);              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)              if (signal_test != SIGSEGV)
             {              {
                 erreur = d_es_signal;                  erreur = d_es_signal;
Line 1609  rplinit(int argc, char *argv[], char *en Line 1690  rplinit(int argc, char *argv[], char *en
             }              }
 #   endif  #   endif
   
               action.sa_handler = interruption3;
               action.sa_flags = 0;
   
             if (sigaction(SIGBUS, &action, NULL) != 0)              if (sigaction(SIGBUS, &action, NULL) != 0)
             {              {
                 if ((*s_etat_processus).langue == 'F')                  if ((*s_etat_processus).langue == 'F')
Line 1628  rplinit(int argc, char *argv[], char *en Line 1712  rplinit(int argc, char *argv[], char *en
             signal_test = SIGTEST;              signal_test = SIGTEST;
             kill(getpid(), SIGBUS);              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)              if (signal_test != SIGBUS)
             {              {
                 erreur = d_es_signal;                  erreur = d_es_signal;
Line 1861  rplinit(int argc, char *argv[], char *en Line 1953  rplinit(int argc, char *argv[], char *en
             gettimeofday(&((*s_etat_processus).horodatage_profilage), NULL);              gettimeofday(&((*s_etat_processus).horodatage_profilage), NULL);
   
             (*s_etat_processus).liste_mutexes = NULL;              (*s_etat_processus).liste_mutexes = NULL;
               (*s_etat_processus).sections_critiques = 0;
   
             (*s_etat_processus).test_instruction = 'N';              (*s_etat_processus).test_instruction = 'N';
             (*s_etat_processus).nombre_arguments = 0;              (*s_etat_processus).nombre_arguments = 0;
Line 1896  rplinit(int argc, char *argv[], char *en Line 1989  rplinit(int argc, char *argv[], char *en
             (*s_etat_processus).l_liste_variables_par_niveau = NULL;              (*s_etat_processus).l_liste_variables_par_niveau = NULL;
             (*s_etat_processus).gel_liste_variables = d_faux;              (*s_etat_processus).gel_liste_variables = d_faux;
             (*s_etat_processus).pointeur_variable_courante = NULL;              (*s_etat_processus).pointeur_variable_courante = NULL;
             (*s_etat_processus).s_liste_variables_statiques = NULL;              (*s_etat_processus).pointeur_variable_statique_courante = NULL;
             (*s_etat_processus).nombre_variables_statiques = 0;              (*s_etat_processus).l_liste_variables_statiques = NULL;
             (*s_etat_processus).nombre_variables_statiques_allouees = 0;  
             (*s_etat_processus).niveau_courant = 0;              (*s_etat_processus).niveau_courant = 0;
             (*s_etat_processus).niveau_initial = 0;              (*s_etat_processus).niveau_initial = 0;
             (*s_etat_processus).creation_variables_statiques = d_faux;              (*s_etat_processus).creation_variables_statiques = d_faux;
             (*s_etat_processus).creation_variables_partagees = 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_bibliotheques = NULL;
             (*s_etat_processus).s_instructions_externes = NULL;              (*s_etat_processus).s_instructions_externes = NULL;
Line 2032  rplinit(int argc, char *argv[], char *en Line 2123  rplinit(int argc, char *argv[], char *en
             (*s_etat_processus).arbre_instructions = NULL;              (*s_etat_processus).arbre_instructions = NULL;
   
             (*s_etat_processus).tid_processus_pere = pthread_self();              (*s_etat_processus).tid_processus_pere = pthread_self();
             (*s_etat_processus).tid= pthread_self();              (*s_etat_processus).tid = pthread_self();
             (*s_etat_processus).pid_processus_pere = getpid();              (*s_etat_processus).pid_processus_pere = getpid();
             (*s_etat_processus).processus_detache = d_vrai;              (*s_etat_processus).processus_detache = d_vrai;
             (*s_etat_processus).var_volatile_processus_pere = -1;              (*s_etat_processus).var_volatile_processus_pere = -1;
Line 2129  rplinit(int argc, char *argv[], char *en Line 2220  rplinit(int argc, char *argv[], char *en
                 (*((*s_etat_processus).l_base_pile_systeme))                  (*((*s_etat_processus).l_base_pile_systeme))
                         .retour_definition = 'Y';                          .retour_definition = 'Y';
   
                 (*s_etat_processus).indep = (struct_objet *) malloc(                  (*s_etat_processus).indep = allocation(s_etat_processus, NON);
                         sizeof(struct_objet));                  (*s_etat_processus).depend = allocation(s_etat_processus, NON);
                 (*s_etat_processus).depend = (struct_objet *) malloc(  
                         sizeof(struct_objet));  
                 (*s_etat_processus).parametres_courbes_de_niveau =                  (*s_etat_processus).parametres_courbes_de_niveau =
                         (struct_objet *) malloc(sizeof(struct_objet));                          allocation(s_etat_processus, NON);
   
                 if (((*s_etat_processus).indep != NULL) &&                  if (((*s_etat_processus).indep != NULL) &&
                         ((*s_etat_processus).depend != NULL) &&                          ((*s_etat_processus).depend != NULL) &&
Line 2544  rplinit(int argc, char *argv[], char *en Line 2633  rplinit(int argc, char *argv[], char *en
                             home, ds_fichier_historique);                              home, ds_fichier_historique);
   
                     using_history();                      using_history();
   
                       // Pour pouvoir utiliser le keymap avant le premier
                       // appel à readline().
                       rl_initialize();
   
                     erreur_historique = read_history(                      erreur_historique = read_history(
                             (*s_etat_processus).nom_fichier_historique);                              (*s_etat_processus).nom_fichier_historique);
   
Line 2840  rplinit(int argc, char *argv[], char *en Line 2934  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_exit);
                     liberation(s_etat_processus, (*s_etat_processus).at_poke);                      liberation(s_etat_processus, (*s_etat_processus).at_poke);
   
Line 3266  rplinit(int argc, char *argv[], char *en Line 3365  rplinit(int argc, char *argv[], char *en
                             (*s_etat_processus).s_arbre_variables, d_vrai);                              (*s_etat_processus).s_arbre_variables, d_vrai);
                     free((*s_etat_processus).pointeurs_caracteres_variables);                      free((*s_etat_processus).pointeurs_caracteres_variables);
   
                     for(i = 0; i < (*s_etat_processus)                      l_element_statique_courant = (*s_etat_processus)
                             .nombre_variables_statiques; i++)                              .l_liste_variables_statiques;
   
                       while(l_element_statique_courant != NULL)
                     {                      {
                         liberation(s_etat_processus, (*s_etat_processus)                          l_element_statique_suivant =
                                 .s_liste_variables_statiques[i].objet);                              (*l_element_statique_courant).suivant;
                         free((*s_etat_processus)                          free(l_element_statique_courant);
                                 .s_liste_variables_statiques[i].nom);                          l_element_statique_courant = l_element_statique_suivant;
                     }                      }
   
                     free((*s_etat_processus).s_liste_variables_statiques);  
   
                     for(i = 0; i < (*((*s_etat_processus)                      for(i = 0; i < (*((*s_etat_processus)
                             .s_liste_variables_partagees)).nombre_variables;                              .s_liste_variables_partagees)).nombre_variables;
                             i++)                              i++)
Line 3633  rplinit(int argc, char *argv[], char *en Line 3732  rplinit(int argc, char *argv[], char *en
   
     pthread_mutex_destroy(&((*s_etat_processus).mutex));      pthread_mutex_destroy(&((*s_etat_processus).mutex));
     pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));      pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
       pthread_mutex_destroy(&mutex_sections_critiques);
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
     sem_post(&((*s_etat_processus).semaphore_fork));      sem_post(&((*s_etat_processus).semaphore_fork));
Line 3645  rplinit(int argc, char *argv[], char *en Line 3745  rplinit(int argc, char *argv[], char *en
   
     free((*s_etat_processus).localisation);      free((*s_etat_processus).localisation);
   
     pthread_mutex_destroy(&mutex_liste_threads);  
     pthread_mutex_destroy(&mutex_gestionnaires_signaux_atomique);  
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
     sem_post(&semaphore_gestionnaires_signaux);      sem_post(&semaphore_gestionnaires_signaux);
     sem_destroy(&semaphore_gestionnaires_signaux);      sem_destroy(&semaphore_gestionnaires_signaux);
Line 3669  rplinit(int argc, char *argv[], char *en Line 3766  rplinit(int argc, char *argv[], char *en
     }      }
   
     free(arg_exec);      free(arg_exec);
       arret_thread_signaux(s_etat_processus);
     free(s_etat_processus);      free(s_etat_processus);
   
 #   ifdef DEBUG_MEMOIRE  #   ifdef DEBUG_MEMOIRE

Removed from v.1.106  
changed lines
  Added in v.1.122


CVSweb interface <joel.bertrand@systella.fr>