Diff for /rpl/src/rpl.c between versions 1.45 and 1.86

version 1.45, 2010/08/30 14:14:07 version 1.86, 2011/09/16 09:09:35
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.19    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2011 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 23 Line 23
 #define  MAIN_RPL  #define  MAIN_RPL
 #include "rpl-conv.h"  #include "rpl-conv.h"
   
 #ifdef SEMAPHORES_SYSV  #ifdef IPCS_SYSV
 #ifndef OS2  #ifndef OS2
     unsigned char       *chemin_semaphores_SysV;      unsigned char       *chemin_semaphores_SysV;
 #endif  #endif
Line 46  rplinit(int argc, char *argv[], unsigned Line 46  rplinit(int argc, char *argv[], unsigned
   
     int                                 erreur_historique;      int                                 erreur_historique;
     int                                 option_P;      int                                 option_P;
     int                                 status;  
   
     logical1                            core;      logical1                            core;
     logical1                            debug;      logical1                            debug;
Line 106  rplinit(int argc, char *argv[], unsigned Line 105  rplinit(int argc, char *argv[], unsigned
     volatile unsigned char              traitement_fichier_temporaire;      volatile unsigned char              traitement_fichier_temporaire;
   
     errno = 0;      errno = 0;
       s_queue_signaux = NULL;
       pid_processus_pere = getpid();
   
 #   ifdef DEBUG_MEMOIRE  #   ifdef DEBUG_MEMOIRE
     debug_memoire_initialisation();      debug_memoire_initialisation();
Line 115  rplinit(int argc, char *argv[], unsigned Line 116  rplinit(int argc, char *argv[], unsigned
     setvbuf(stderr, NULL, _IOLBF, 0);      setvbuf(stderr, NULL, _IOLBF, 0);
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
     sem_init(&semaphore_liste_threads, 0, 1);  
     sem_init(&semaphore_gestionnaires_signaux, 0, 0);      sem_init(&semaphore_gestionnaires_signaux, 0, 0);
     sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);  
 #   else  #   else
     semaphore_liste_threads = sem_init2(1, sem_liste_threads);  
     semaphore_gestionnaires_signaux = sem_init2(0, sem_gestionnaires_signaux);      semaphore_gestionnaires_signaux = sem_init2(0, sem_gestionnaires_signaux);
     semaphore_gestionnaires_signaux_atomique = sem_init2(1,      
             sem_gestionnaires_signaux_atomique);      if (semaphore_gestionnaires_signaux == SEM_FAILED)
   
     if ((semaphore_liste_threads == SEM_FAILED) ||  
             (semaphore_gestionnaires_signaux == SEM_FAILED) ||  
             (semaphore_gestionnaires_signaux_atomique == SEM_FAILED))  
     {      {
         erreur = d_es_allocation_memoire;          erreur = d_es_allocation_memoire;
   
Line 183  rplinit(int argc, char *argv[], unsigned Line 177  rplinit(int argc, char *argv[], unsigned
         (*s_etat_processus).langue = 'E';          (*s_etat_processus).langue = 'E';
     }      }
   
       initialisation_contexte_cas(s_etat_processus);
   
     (*s_etat_processus).exception = d_ep;      (*s_etat_processus).exception = d_ep;
     (*s_etat_processus).erreur_systeme = d_es;      (*s_etat_processus).erreur_systeme = d_es;
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
       (*s_etat_processus).compteur_violation_d_acces = 0;
   
     (*s_etat_processus).rpl_home = rpl_home;      (*s_etat_processus).rpl_home = rpl_home;
   
Line 200  rplinit(int argc, char *argv[], unsigned Line 197  rplinit(int argc, char *argv[], unsigned
             &attributs_mutex);              &attributs_mutex);
     pthread_mutexattr_destroy(&attributs_mutex);      pthread_mutexattr_destroy(&attributs_mutex);
   
 #   ifndef SEMAPHORES_NOMMES      pthread_mutexattr_init(&attributs_mutex);
     sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);      pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
 #   else      pthread_mutex_init(&((*s_etat_processus).mutex_fork),
     if (((*s_etat_processus).semaphore_fork = sem_init2(0, sem_fork)) ==              &attributs_mutex);
             SEM_FAILED)      pthread_mutexattr_destroy(&attributs_mutex);
     {      pthread_mutex_lock(&((*s_etat_processus).mutex_fork));
         if ((*s_etat_processus).langue == 'F')  
         {  
             uprintf("+++Système : Mémoire insuffisante\n");  
         }  
         else  
         {  
             uprintf("+++System : Not enough memory\n");  
         }  
   
         return(EXIT_FAILURE);  
     }  
 #   endif  
   
     pthread_mutexattr_init(&attributs_mutex);      pthread_mutexattr_init(&attributs_mutex);
     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);      pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
Line 240  rplinit(int argc, char *argv[], unsigned Line 225  rplinit(int argc, char *argv[], unsigned
     (*s_etat_processus).chemin_fichiers_temporaires =      (*s_etat_processus).chemin_fichiers_temporaires =
             recherche_chemin_fichiers_temporaires(s_etat_processus);              recherche_chemin_fichiers_temporaires(s_etat_processus);
   
 #   ifdef SEMAPHORES_SYSV  #   ifdef IPCS_SYSV
 #   ifndef OS2  #       ifndef OS2
     chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires;              chemin_semaphores_SysV =
 #   endif                      (*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  #   endif
   
     insertion_thread(s_etat_processus, d_vrai);      insertion_thread(s_etat_processus, d_vrai);
       creation_queue_signaux(s_etat_processus);
   
 #   ifndef OS2  #   ifndef OS2
     localisation_courante(s_etat_processus);      localisation_courante(s_etat_processus);
Line 307  rplinit(int argc, char *argv[], unsigned Line 286  rplinit(int argc, char *argv[], unsigned
   
     if ((*s_etat_processus).langue == 'F')      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      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)      if (getenv("HOME") != NULL)
Line 336  rplinit(int argc, char *argv[], unsigned Line 315  rplinit(int argc, char *argv[], unsigned
         home = "";          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);  
     }  
   
 #   ifndef SEMAPHORES_NOMMES  
     if (pthread_setspecific(semaphore_fork_processus_courant,  
             &((*s_etat_processus).semaphore_fork)) != 0)  
 #   else  
     if (pthread_setspecific(semaphore_fork_processus_courant,  
             (*s_etat_processus).semaphore_fork) != 0)  
 #   endif  
     {  
         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      // Initialisation d'une pile de signal pour récupérer les
     // débordement de pile      // débordement de pile
   
Line 414  rplinit(int argc, char *argv[], unsigned Line 357  rplinit(int argc, char *argv[], unsigned
     }      }
 #   endif  #   endif
   
 #   ifndef _BROKEN_SIGINFO  
     action.sa_sigaction = interruption1;  
 #   else  
     action.sa_handler = interruption1;      action.sa_handler = interruption1;
 #   endif      action.sa_flags = SA_ONSTACK;
     action.sa_flags = SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGINT, &action, NULL) != 0)      if (sigaction(SIGINT, &action, NULL) != 0)
     {      {
Line 438  rplinit(int argc, char *argv[], unsigned Line 377  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST;
     action.sa_sigaction = interruption2;      kill(getpid(), SIGINT);
 #   else  
     action.sa_handler = interruption2;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGTSTP, &action, NULL) != 0)      if (signal_test != SIGINT)
     {      {
         if ((*s_etat_processus).langue == 'F')          erreur = d_es_signal;
         {  
             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 = 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)  
     {  
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("+++Système : Initialisation des signaux POSIX "              printf("+++Système : Initialisation des signaux POSIX "
Line 483  rplinit(int argc, char *argv[], unsigned Line 397  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
     if (sigaction(SIGCONT, &action, NULL) != 0)      if (sigaction(SIGTERM, &action, NULL) != 0)
     {      {
           erreur = d_es_signal;
   
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("+++Système : Initialisation des signaux POSIX "              printf("+++Système : Initialisation des signaux POSIX "
Line 498  rplinit(int argc, char *argv[], unsigned Line 414  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST;
     action.sa_sigaction = interruption5;      kill(getpid(), SIGTERM);
 #   else  
     action.sa_handler = interruption5;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGFSTOP, &action, NULL) != 0)      if (signal_test != SIGTERM)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
   
Line 522  rplinit(int argc, char *argv[], unsigned Line 434  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      action.sa_handler = interruption2;
     action.sa_sigaction = interruption11;      action.sa_flags = SA_NODEFER | SA_ONSTACK;
 #   else  
     action.sa_handler = interruption11;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGFABORT, &action, NULL) != 0)      if (sigaction(SIGTSTP, &action, NULL) != 0)
     {      {
         erreur = d_es_signal;  
   
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("+++Système : Initialisation des signaux POSIX "              printf("+++Système : Initialisation des signaux POSIX "
Line 546  rplinit(int argc, char *argv[], unsigned Line 452  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST;
     action.sa_sigaction = interruption8;      kill(getpid(), SIGTSTP);
 #   else  
     action.sa_handler = interruption8;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGURG, &action, NULL) != 0)      if (signal_test != SIGTSTP)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
   
Line 570  rplinit(int argc, char *argv[], unsigned Line 472  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      action.sa_handler = interruption5;
     action.sa_sigaction = interruption7;      action.sa_flags = SA_NODEFER | SA_ONSTACK;
 #   else  
     action.sa_handler = interruption7;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGPIPE, &action, NULL) != 0)      if (sigaction(SIGPIPE, &action, NULL) != 0)
     {      {
Line 594  rplinit(int argc, char *argv[], unsigned Line 492  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST;
     action.sa_sigaction = interruption6;      kill(getpid(), SIGPIPE);
 #   else  
     action.sa_handler = interruption6;  
 #   endif  
     action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER;  
   
     if (sigaction(SIGINJECT, &action, NULL) != 0)      if (signal_test != SIGPIPE)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
   
Line 618  rplinit(int argc, char *argv[], unsigned Line 512  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      action.sa_handler = interruption1;
     action.sa_sigaction = interruption9;      action.sa_flags = SA_NODEFER | SA_ONSTACK;
 #   else  
     action.sa_handler = interruption9;  
 #   endif  
     action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER;  
   
     if (sigaction(SIGABORT, &action, NULL) != 0)      if (sigaction(SIGALRM, &action, NULL) != 0)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
   
Line 642  rplinit(int argc, char *argv[], unsigned Line 532  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST;
     action.sa_sigaction = interruption1;      kill(getpid(), SIGALRM);
 #   else  
     action.sa_handler = interruption1;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     if (sigaction(SIGALRM, &action, NULL) != 0)      if (signal_test != SIGALRM)
     {      {
         erreur = d_es_signal;          erreur = d_es_signal;
   
Line 666  rplinit(int argc, char *argv[], unsigned Line 552  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
 #   ifndef _BROKEN_SIGINFO      signal_test = SIGTEST + 1;
     action.sa_sigaction = interruption3;  
 #   else  
     action.sa_handler = interruption3;  
 #   endif  
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;  
   
     erreur = d_absence_erreur;      erreur = d_absence_erreur;
     core = d_faux;      core = d_faux;
Line 719  rplinit(int argc, char *argv[], unsigned Line 600  rplinit(int argc, char *argv[], unsigned
         option_t = d_faux;          option_t = d_faux;
         option_v = 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)          while((--argc) > 0)
         {          {
             if ((*(++argv))[0] == '-')              if ((*(++argv))[0] == '-')
Line 1514  rplinit(int argc, char *argv[], unsigned Line 1404  rplinit(int argc, char *argv[], unsigned
                             break;                              break;
                         }                          }
   
                           case '-':
                           case ' ':
                           {
                               break;
                           }
   
                         default :                          default :
                         {                          {
                             if ((*s_etat_processus).langue == 'F')                              if ((*s_etat_processus).langue == 'F')
Line 1560  rplinit(int argc, char *argv[], unsigned Line 1456  rplinit(int argc, char *argv[], unsigned
   
         if (debug == d_faux)          if (debug == d_faux)
         {          {
               action.sa_handler = interruption3;
               action.sa_flags = SA_NODEFER | SA_ONSTACK;
   
             if (sigaction(SIGSEGV, &action, NULL) != 0)              if (sigaction(SIGSEGV, &action, NULL) != 0)
             {              {
                 if ((*s_etat_processus).langue == 'F')                  if ((*s_etat_processus).langue == 'F')
Line 1595  rplinit(int argc, char *argv[], unsigned Line 1494  rplinit(int argc, char *argv[], unsigned
   
         if (option_n == d_vrai)          if (option_n == d_vrai)
         {          {
 #           ifndef _BROKEN_SIGINFO              action.sa_handler = interruption4;
             action.sa_sigaction = interruption10;              action.sa_flags = SA_ONSTACK;
 #           else  
             action.sa_handler = interruption10;  
 #           endif  
             action.sa_flags = SA_ONSTACK | SA_SIGINFO;  
   
             if (sigaction(SIGHUP, &action, NULL) != 0)              if (sigaction(SIGHUP, &action, NULL) != 0)
             {              {
Line 1816  rplinit(int argc, char *argv[], unsigned Line 1711  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).affichage_arguments = 'N';              (*s_etat_processus).affichage_arguments = 'N';
             (*s_etat_processus).autorisation_conversion_chaine = 'Y';              (*s_etat_processus).autorisation_conversion_chaine = 'Y';
             (*s_etat_processus).autorisation_evaluation_nom = '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).autorisation_empilement_programme = 'N';
             (*s_etat_processus).requete_arret = 'N';              (*s_etat_processus).requete_arret = 'N';
             (*s_etat_processus).evaluation_forcee = 'N';              (*s_etat_processus).evaluation_forcee = 'N';
               (*s_etat_processus).recherche_type = 'N';
   
             (*s_etat_processus).constante_symbolique = 'N';              (*s_etat_processus).constante_symbolique = 'N';
             (*s_etat_processus).traitement_symbolique = 'N';              (*s_etat_processus).traitement_symbolique = 'N';
Line 1831  rplinit(int argc, char *argv[], unsigned Line 1736  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).l_base_pile = NULL;              (*s_etat_processus).l_base_pile = NULL;
             (*s_etat_processus).l_base_pile_last = 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).gel_liste_variables = d_faux;
             (*s_etat_processus).nombre_variables = 0;              (*s_etat_processus).pointeur_variable_courante = NULL;
             (*s_etat_processus).nombre_variables_allouees = 0;  
             (*s_etat_processus).s_liste_variables_statiques = NULL;              (*s_etat_processus).s_liste_variables_statiques = NULL;
             (*s_etat_processus).nombre_variables_statiques = 0;              (*s_etat_processus).nombre_variables_statiques = 0;
             (*s_etat_processus).nombre_variables_statiques_allouees = 0;              (*s_etat_processus).nombre_variables_statiques_allouees = 0;
Line 1842  rplinit(int argc, char *argv[], unsigned Line 1747  rplinit(int argc, char *argv[], unsigned
             (*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_courante = 0;  
             (*s_etat_processus).position_variable_statique_courante = 0;              (*s_etat_processus).position_variable_statique_courante = 0;
   
             (*s_etat_processus).s_bibliotheques = NULL;              (*s_etat_processus).s_bibliotheques = NULL;
Line 1985  rplinit(int argc, char *argv[], unsigned Line 1889  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).var_volatile_recursivite = 0;              (*s_etat_processus).var_volatile_recursivite = 0;
             (*s_etat_processus).var_volatile_exception_gsl = 0;              (*s_etat_processus).var_volatile_exception_gsl = 0;
             (*s_etat_processus).arret_depuis_abort = 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_allocateur(s_etat_processus);
             initialisation_drapeaux(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)              if ((*s_etat_processus).erreur_systeme != d_es)
             {              {
Line 2373  rplinit(int argc, char *argv[], unsigned Line 2281  rplinit(int argc, char *argv[], unsigned
                     (*s_etat_processus).position_courante = 0;                      (*s_etat_processus).position_courante = 0;
                     (*s_etat_processus).traitement_cycle_exit = 'N';                      (*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')                          if ((*s_etat_processus).langue == 'F')
                         {                          {
Line 2433  rplinit(int argc, char *argv[], unsigned Line 2341  rplinit(int argc, char *argv[], unsigned
                         return(EXIT_FAILURE);                          return(EXIT_FAILURE);
                     }                      }
   
                     if ((*s_etat_processus).s_liste_variables                      if ((*(*s_etat_processus).pointeur_variable_courante)
                             [(*s_etat_processus)                              .niveau != 0)
                             .position_variable_courante].niveau != 0)  
                     {                      {
                         if ((*s_etat_processus).langue == 'F')                          if ((*s_etat_processus).langue == 'F')
                         {                          {
Line 2521  rplinit(int argc, char *argv[], unsigned Line 2428  rplinit(int argc, char *argv[], unsigned
   
                     fflush(stdout);                      fflush(stdout);
   
                     initialisation_instructions(s_etat_processus);  
   
                     if (arguments != NULL)                      if (arguments != NULL)
                     {                      {
                         tampon = (*s_etat_processus).definitions_chainees;                          tampon = (*s_etat_processus).definitions_chainees;
Line 2734  rplinit(int argc, char *argv[], unsigned Line 2639  rplinit(int argc, char *argv[], unsigned
                             lancement_daemon(s_etat_processus);                              lancement_daemon(s_etat_processus);
                         }                          }
   
   // A FIXER
   // création signaux
                         if (option_p == d_faux)                          if (option_p == d_faux)
                         {                          {
                             if (setjmp(contexte_initial) == 0)                              if (setjmp(contexte_initial) == 0)
                             {                              {
                                 erreur = sequenceur(s_etat_processus);                                  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                          else
Line 2746  rplinit(int argc, char *argv[], unsigned Line 2667  rplinit(int argc, char *argv[], unsigned
                             if (setjmp(contexte_initial) == 0)                              if (setjmp(contexte_initial) == 0)
                             {                              {
                                 erreur = sequenceur_optimise(s_etat_processus);                                  erreur = sequenceur_optimise(s_etat_processus);
                             }  
                         }  
   
                         if (erreur == d_absence_erreur)                                  if (erreur == d_absence_erreur)
                         {                                  {
                             if (((*s_etat_processus).var_volatile_alarme == 0)                                      if (((*s_etat_processus).var_volatile_alarme
                                     && ((*s_etat_processus).arret_depuis_abort                                              == 0) && ((*s_etat_processus)
                                     == 0) && ((*s_etat_processus).at_exit                                              .arret_depuis_abort == 0) &&
                                     != NULL))                                              ((*s_etat_processus).at_exit
                             {                                              != NULL))
                                 erreur = evaluation(s_etat_processus,                                      {
                                         (*s_etat_processus).at_exit, 'E');                                          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_exit);
Line 2874  rplinit(int argc, char *argv[], unsigned Line 2799  rplinit(int argc, char *argv[], unsigned
                         {                          {
                             if ((*s_etat_processus).var_volatile_alarme != 0)                              if ((*s_etat_processus).var_volatile_alarme != 0)
                             {                              {
                                 kill((*(*((struct_processus_fils *)                                  envoi_signal_processus(
                                           (*(*((struct_processus_fils *)
                                         (*(*((struct_liste_chainee *)                                          (*(*((struct_liste_chainee *)
                                         l_element_courant)).donnee).objet))                                          l_element_courant)).donnee).objet))
                                         .thread).pid, SIGURG);                                          .thread).pid, rpl_sigurg);
                             }                              }
                             else                              else
                             {                              {
                                 if ((*s_etat_processus).arret_depuis_abort                                  if ((*s_etat_processus).arret_depuis_abort
                                         == -1)                                          == -1)
                                 {                                  {
                                     kill((*(*((struct_processus_fils *)                                      envoi_signal_processus(
                                               (*(*((struct_processus_fils *)
                                             (*(*((struct_liste_chainee *)                                              (*(*((struct_liste_chainee *)
                                             l_element_courant)).donnee).objet))                                              l_element_courant)).donnee).objet))
                                             .thread).pid, SIGFABORT);                                              .thread).pid, rpl_sigabort);
                                 }                                  }
                                 else                                  else
                                 {                                  {
                                     kill((*(*((struct_processus_fils *)                                      envoi_signal_processus(
                                               (*(*((struct_processus_fils *)
                                             (*(*((struct_liste_chainee *)                                              (*(*((struct_liste_chainee *)
                                             l_element_courant)).donnee).objet))                                              l_element_courant)).donnee).objet))
                                             .thread).pid, SIGFSTOP);                                              .thread).pid, rpl_sigstop);
                                 }                                  }
                             }                              }
                         }                          }
Line 2913  rplinit(int argc, char *argv[], unsigned Line 2841  rplinit(int argc, char *argv[], unsigned
                                 if ((*s_etat_processus).var_volatile_alarme                                  if ((*s_etat_processus).var_volatile_alarme
                                         != 0)                                          != 0)
                                 {                                  {
                                     pthread_kill((*(*((struct_processus_fils *)                                      envoi_signal_thread(
                                               (*(*((struct_processus_fils *)
                                             (*(*((struct_liste_chainee *)                                              (*(*((struct_liste_chainee *)
                                             l_element_courant)).donnee).objet))                                              l_element_courant)).donnee).objet))
                                             .thread).tid, SIGURG);                                              .thread).tid, rpl_sigurg);
                                 }                                  }
                                 else                                  else
                                 {                                  {
                                     if ((*s_etat_processus).arret_depuis_abort                                      if ((*s_etat_processus).arret_depuis_abort
                                             == -1)                                              == -1)
                                     {                                      {
                                         pthread_kill(                                          envoi_signal_thread(
                                                 (*(*((struct_processus_fils *)                                                  (*(*((struct_processus_fils *)
                                                 (*(*((struct_liste_chainee *)                                                  (*(*((struct_liste_chainee *)
                                                 l_element_courant)).donnee)                                                  l_element_courant)).donnee)
                                                 .objet)).thread).tid,                                                  .objet)).thread).tid,
                                                 SIGFABORT);                                                  rpl_sigabort);
                                     }                                      }
                                     else                                      else
                                     {                                      {
                                         pthread_kill(                                          envoi_signal_thread(
                                                 (*(*((struct_processus_fils *)                                                  (*(*((struct_processus_fils *)
                                                 (*(*((struct_liste_chainee *)                                                  (*(*((struct_liste_chainee *)
                                                 l_element_courant)).donnee)                                                  l_element_courant)).donnee)
                                                 .objet)).thread).tid,                                                  .objet)).thread).tid,
                                                 SIGFSTOP);                                                  rpl_sigstop);
                                     }                                      }
                                 }                                  }
                             }                              }
Line 2966  rplinit(int argc, char *argv[], unsigned Line 2895  rplinit(int argc, char *argv[], unsigned
   
                     while((*s_etat_processus).l_base_pile_processus != NULL)                      while((*s_etat_processus).l_base_pile_processus != NULL)
                     {                      {
                         status = 0;  
   
                         l_element_courant = (void *)                          l_element_courant = (void *)
                                 (*s_etat_processus).l_base_pile_processus;                                  (*s_etat_processus).l_base_pile_processus;
   
Line 3038  rplinit(int argc, char *argv[], unsigned Line 2965  rplinit(int argc, char *argv[], unsigned
                         }                          }
   
                         nanosleep(&attente, NULL);                          nanosleep(&attente, NULL);
                           scrutation_interruptions(s_etat_processus);
                         pthread_mutex_lock(&((*s_etat_processus).mutex));                          pthread_mutex_lock(&((*s_etat_processus).mutex));
                     }                      }
   
Line 3191  rplinit(int argc, char *argv[], unsigned Line 3119  rplinit(int argc, char *argv[], unsigned
                      * le libérer...                       * le libérer...
                      */                       */
   
                     for(i = 0; i < (*s_etat_processus).nombre_variables; i++)                      liberation_arbre_variables(s_etat_processus,
                     {                              (*s_etat_processus).s_arbre_variables, d_vrai);
                         liberation(s_etat_processus,                      free((*s_etat_processus).pointeurs_caracteres_variables);
                                 (*s_etat_processus).s_liste_variables[i].objet);  
                         free((*s_etat_processus).s_liste_variables[i].nom);  
                     }  
   
                     free((*s_etat_processus).s_liste_variables);  
   
                     for(i = 0; i < (*s_etat_processus)                      for(i = 0; i < (*s_etat_processus)
                             .nombre_variables_statiques; i++)                              .nombre_variables_statiques; i++)
Line 3557  rplinit(int argc, char *argv[], unsigned Line 3480  rplinit(int argc, char *argv[], unsigned
         }          }
     }      }
   
 #   if !defined(Cygwin) && !defined(OpenBSD)  
     (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE;  
     sigaltstack(&((*s_etat_processus).pile_signal), NULL);  
     free((*s_etat_processus).pile_signal.ss_sp);  
 #   endif  
   
     closelog();      closelog();
   
     pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));      pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
Line 3574  rplinit(int argc, char *argv[], unsigned Line 3491  rplinit(int argc, char *argv[], unsigned
     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));
   
 #   ifndef SEMAPHORES_NOMMES      pthread_mutex_unlock(&((*s_etat_processus).mutex_fork));
     sem_post(&((*s_etat_processus).semaphore_fork));      pthread_mutex_destroy(&((*s_etat_processus).mutex_fork));
     sem_destroy(&((*s_etat_processus).semaphore_fork));  
 #   else  
     sem_post((*s_etat_processus).semaphore_fork);  
     sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork);  
 #   endif  
   
     free((*s_etat_processus).localisation);      free((*s_etat_processus).localisation);
   
 #   ifndef SEMAPHORES_NOMMES      pthread_mutex_destroy(&mutex_liste_threads);
     sem_destroy(&semaphore_liste_threads);      pthread_mutex_destroy(&mutex_gestionnaires_signaux_atomique);
 #   else  
     sem_destroy2(semaphore_liste_threads, sem_liste_threads);  
 #   endif  
 #   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);
     sem_destroy(&semaphore_gestionnaires_signaux_atomique);  
 #   else  #   else
     sem_post(semaphore_gestionnaires_signaux);      sem_post(semaphore_gestionnaires_signaux);
     sem_destroy2(semaphore_gestionnaires_signaux, sem_gestionnaires_signaux);      sem_destroy2(semaphore_gestionnaires_signaux, sem_gestionnaires_signaux);
     sem_destroy2(semaphore_gestionnaires_signaux_atomique,  
             sem_gestionnaires_signaux_atomique);  
 #   endif  #   endif
   
 #   ifdef _BROKEN_SIGINFO      destruction_queue_signaux(s_etat_processus);
     destruction_fifos_signaux(s_etat_processus);      liberation_contexte_cas(s_etat_processus);
 #   undef return  
 #   endif  
   
     free((*s_etat_processus).chemin_fichiers_temporaires);      free((*s_etat_processus).chemin_fichiers_temporaires);
     free(s_etat_processus);      free(s_etat_processus);

Removed from v.1.45  
changed lines
  Added in v.1.86


CVSweb interface <joel.bertrand@systella.fr>