Diff for /rpl/src/rpl.c between versions 1.20 and 1.41

version 1.20, 2010/04/28 06:41:06 version 1.41, 2010/08/18 12:56:55
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.15    RPL/2 (R) version 4.0.18
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 21 Line 21
   
   
 #define  MAIN_RPL  #define  MAIN_RPL
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   #ifdef SEMAPHORES_SYSV
   #ifndef OS2
       unsigned char       *chemin_semaphores_SysV;
   #endif
   #endif
   
   
 /*  /*
Line 33 Line 39
 int  int
 rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home)  rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home)
 {  {
 #   include                             "copyright.conv.h"  #   include                             "copyright-conv.h"
 #   include                             "licence.conv.h"  #   include                             "licence-conv.h"
   
     file                                *f_source;      file                                *f_source;
   
Line 99  rplinit(int argc, char *argv[], unsigned Line 105  rplinit(int argc, char *argv[], unsigned
     volatile int                        erreur;      volatile int                        erreur;
     volatile unsigned char              traitement_fichier_temporaire;      volatile unsigned char              traitement_fichier_temporaire;
   
       errno = 0;
   
   #   ifdef DEBUG_MEMOIRE
       debug_memoire_initialisation();
   #   endif
   
     setvbuf(stdout, NULL, _IOLBF, 0);      setvbuf(stdout, NULL, _IOLBF, 0);
     setvbuf(stderr, NULL, _IOLBF, 0);      setvbuf(stderr, NULL, _IOLBF, 0);
   
Line 184  rplinit(int argc, char *argv[], unsigned Line 196  rplinit(int argc, char *argv[], unsigned
     pthread_mutex_init(&((*s_etat_processus).mutex), &attributs_mutex);      pthread_mutex_init(&((*s_etat_processus).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_NORMAL);
       pthread_mutex_init(&((*s_etat_processus).mutex_allocation),
               &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 221  rplinit(int argc, char *argv[], unsigned Line 239  rplinit(int argc, char *argv[], unsigned
             .mutex), &attributs_mutex);              .mutex), &attributs_mutex);
     pthread_mutexattr_destroy(&attributs_mutex);      pthread_mutexattr_destroy(&attributs_mutex);
   
       (*s_etat_processus).chemin_fichiers_temporaires =
               recherche_chemin_fichiers_temporaires(s_etat_processus);
   
   #   ifdef SEMAPHORES_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
   
     localisation_courante(s_etat_processus);      localisation_courante(s_etat_processus);
     (*s_etat_processus).erreur_systeme = d_es;      (*s_etat_processus).erreur_systeme = d_es;
   
Line 317  rplinit(int argc, char *argv[], unsigned Line 353  rplinit(int argc, char *argv[], unsigned
     // 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
   
 #   ifndef Cygwin  #   if !defined(Cygwin) && !defined(OpenBSD)
     if (((*s_etat_processus).pile_signal.ss_sp =      if (((*s_etat_processus).pile_signal.ss_sp =
             malloc((*s_etat_processus).pile_signal.ss_size =              malloc((*s_etat_processus).pile_signal.ss_size =
             SIGSTKSZ)) == NULL)              SIGSTKSZ)) == NULL)
Line 356  rplinit(int argc, char *argv[], unsigned Line 392  rplinit(int argc, char *argv[], unsigned
     }      }
 #   endif  #   endif
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption1;      action.sa_sigaction = interruption1;
   #   else
       action.sa_handler = interruption1;
   #   endif
     action.sa_flags = SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGINT, &action, NULL) != 0)      if (sigaction(SIGINT, &action, NULL) != 0)
Line 376  rplinit(int argc, char *argv[], unsigned Line 416  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption2;      action.sa_sigaction = interruption2;
   #   else
       action.sa_handler = interruption2;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGTSTP, &action, NULL) != 0)      if (sigaction(SIGTSTP, &action, NULL) != 0)
Line 394  rplinit(int argc, char *argv[], unsigned Line 438  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption4;      action.sa_sigaction = interruption4;
   #   else
       action.sa_handler = interruption4;
   #   endif
     action.sa_flags = SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGSTART, &action, NULL) != 0)      if (sigaction(SIGSTART, &action, NULL) != 0)
Line 427  rplinit(int argc, char *argv[], unsigned Line 475  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption5;      action.sa_sigaction = interruption5;
   #   else
       action.sa_handler = interruption5;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGFSTOP, &action, NULL) != 0)      if (sigaction(SIGFSTOP, &action, NULL) != 0)
Line 447  rplinit(int argc, char *argv[], unsigned Line 499  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          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;      action.sa_sigaction = interruption8;
   #   else
       action.sa_handler = interruption8;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGURG, &action, NULL) != 0)      if (sigaction(SIGURG, &action, NULL) != 0)
Line 467  rplinit(int argc, char *argv[], unsigned Line 547  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption7;      action.sa_sigaction = interruption7;
   #   else
       action.sa_handler = interruption7;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGPIPE, &action, NULL) != 0)      if (sigaction(SIGPIPE, &action, NULL) != 0)
Line 487  rplinit(int argc, char *argv[], unsigned Line 571  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption6;      action.sa_sigaction = interruption6;
   #   else
       action.sa_handler = interruption6;
   #   endif
     action.sa_flags = SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGINJECT, &action, NULL) != 0)      if (sigaction(SIGINJECT, &action, NULL) != 0)
Line 507  rplinit(int argc, char *argv[], unsigned Line 595  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption9;      action.sa_sigaction = interruption9;
   #   else
       action.sa_handler = interruption9;
   #   endif
     action.sa_flags = SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGABORT, &action, NULL) != 0)      if (sigaction(SIGABORT, &action, NULL) != 0)
Line 527  rplinit(int argc, char *argv[], unsigned Line 619  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption1;      action.sa_sigaction = interruption1;
   #   else
       action.sa_handler = interruption1;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;
   
     if (sigaction(SIGALRM, &action, NULL) != 0)      if (sigaction(SIGALRM, &action, NULL) != 0)
Line 547  rplinit(int argc, char *argv[], unsigned Line 643  rplinit(int argc, char *argv[], unsigned
         return(EXIT_FAILURE);          return(EXIT_FAILURE);
     }      }
   
   #   ifndef _BROKEN_SIGINFO
     action.sa_sigaction = interruption3;      action.sa_sigaction = interruption3;
   #   else
       action.sa_handler = interruption3;
   #   endif
     action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO;      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;      erreur = d_absence_erreur;
     core = d_faux;      core = d_faux;
     mode_interactif = d_faux;      mode_interactif = d_faux;
Line 1475  rplinit(int argc, char *argv[], unsigned Line 1572  rplinit(int argc, char *argv[], unsigned
   
         if (option_n == d_vrai)          if (option_n == d_vrai)
         {          {
   #           ifndef _BROKEN_SIGINFO
             action.sa_sigaction = interruption10;              action.sa_sigaction = interruption10;
   #           else
               action.sa_handler = interruption10;
   #           endif
             action.sa_flags = SA_ONSTACK | SA_SIGINFO;              action.sa_flags = SA_ONSTACK | SA_SIGINFO;
   
             if (sigaction(SIGHUP, &action, NULL) != 0)              if (sigaction(SIGHUP, &action, NULL) != 0)
Line 1841  rplinit(int argc, char *argv[], unsigned Line 1942  rplinit(int argc, char *argv[], unsigned
             }              }
   
             (*s_etat_processus).at_exit = 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).pointeurs_caracteres = NULL;
             (*s_etat_processus).arbre_instructions = NULL;              (*s_etat_processus).arbre_instructions = NULL;
Line 1857  rplinit(int argc, char *argv[], unsigned Line 1960  rplinit(int argc, char *argv[], unsigned
             (*s_etat_processus).var_volatile_traitement_sigint = 0;              (*s_etat_processus).var_volatile_traitement_sigint = 0;
             (*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;
   
             initialisation_allocateur(s_etat_processus);              initialisation_allocateur(s_etat_processus);
             initialisation_drapeaux(s_etat_processus);              initialisation_drapeaux(s_etat_processus);
Line 1876  rplinit(int argc, char *argv[], unsigned Line 1980  rplinit(int argc, char *argv[], unsigned
             }              }
   
             if (((*s_etat_processus).instruction_derniere_erreur =              if (((*s_etat_processus).instruction_derniere_erreur =
                     malloc(2 * sizeof(unsigned char))) == NULL)                      malloc(sizeof(unsigned char))) == NULL)
             {              {
                 erreur = d_es_allocation_memoire;                  erreur = d_es_allocation_memoire;
   
Line 1927  rplinit(int argc, char *argv[], unsigned Line 2031  rplinit(int argc, char *argv[], unsigned
   
             free((*s_etat_processus).instruction_courante);              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;                  erreur = d_es_allocation_memoire;
             }              }
Line 2623  rplinit(int argc, char *argv[], unsigned Line 2727  rplinit(int argc, char *argv[], unsigned
   
                         if (erreur == d_absence_erreur)                          if (erreur == d_absence_erreur)
                         {                          {
                             erreur = evaluation(s_etat_processus,                              if (((*s_etat_processus).var_volatile_alarme == 0)
                                     (*s_etat_processus).at_exit, 'E');                                      && ((*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)                      if ((*s_etat_processus).generateur_aleatoire != NULL)
                     {                      {
                         liberation_generateur_aleatoire(s_etat_processus);                          liberation_generateur_aleatoire(s_etat_processus);
Line 2747  rplinit(int argc, char *argv[], unsigned Line 2857  rplinit(int argc, char *argv[], unsigned
                             }                              }
                             else                              else
                             {                              {
                                 kill((*(*((struct_processus_fils *)                                  if ((*s_etat_processus).arret_depuis_abort
                                         (*(*((struct_liste_chainee *)                                          == -1)
                                         l_element_courant)).donnee).objet))                                  {
                                         .thread).pid, SIGFSTOP);                                      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                          else
Line 2775  rplinit(int argc, char *argv[], unsigned Line 2896  rplinit(int argc, char *argv[], unsigned
                                 }                                  }
                                 else                                  else
                                 {                                  {
                                     pthread_kill((*(*((struct_processus_fils *)                                      if ((*s_etat_processus).arret_depuis_abort
                                             (*(*((struct_liste_chainee *)                                              == -1)
                                             l_element_courant)).donnee).objet))                                      {
                                             .thread).tid, SIGFSTOP);                                          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);
                                       }
                                 }                                  }
                             }                              }
   
Line 2811  rplinit(int argc, char *argv[], unsigned Line 2947  rplinit(int argc, char *argv[], unsigned
                         l_element_courant = (void *)                          l_element_courant = (void *)
                                 (*s_etat_processus).l_base_pile_processus;                                  (*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)                          for(i = 0; i < (unsigned long)
                                 (*(*((struct_processus_fils *)                                  (*(*((struct_processus_fils *)
                                 (*(*((struct_liste_chainee *)                                  (*(*((struct_liste_chainee *)
Line 2876  rplinit(int argc, char *argv[], unsigned Line 3005  rplinit(int argc, char *argv[], unsigned
                         }                          }
   
                         pthread_mutex_unlock(&((*s_etat_processus).mutex));                          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);                          nanosleep(&attente, NULL);
                         pthread_mutex_lock(&((*s_etat_processus).mutex));                          pthread_mutex_lock(&((*s_etat_processus).mutex));
                     }                      }
Line 3345  rplinit(int argc, char *argv[], unsigned Line 3482  rplinit(int argc, char *argv[], unsigned
                         l_element_courant = l_element_suivant;                          l_element_courant = l_element_suivant;
                     }                      }
   
                     free((*s_etat_processus).chemin_fichiers_temporaires);  
   
                     l_element_courant = (*s_etat_processus).s_marques;                      l_element_courant = (*s_etat_processus).s_marques;
                     while(l_element_courant != NULL)                      while(l_element_courant != NULL)
                     {                      {
Line 3398  rplinit(int argc, char *argv[], unsigned Line 3533  rplinit(int argc, char *argv[], unsigned
         }          }
     }      }
   
 #   ifndef Cygwin  #   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);      free((*s_etat_processus).pile_signal.ss_sp);
 #   endif  #   endif
   
Line 3411  rplinit(int argc, char *argv[], unsigned Line 3548  rplinit(int argc, char *argv[], unsigned
     retrait_thread(s_etat_processus);      retrait_thread(s_etat_processus);
   
     pthread_mutex_destroy(&((*s_etat_processus).mutex));      pthread_mutex_destroy(&((*s_etat_processus).mutex));
       pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
     sem_post(&((*s_etat_processus).semaphore_fork));      sem_post(&((*s_etat_processus).semaphore_fork));
     sem_destroy(&((*s_etat_processus).semaphore_fork));      sem_destroy(&((*s_etat_processus).semaphore_fork));
Line 3420  rplinit(int argc, char *argv[], unsigned Line 3559  rplinit(int argc, char *argv[], unsigned
 #   endif  #   endif
   
     free((*s_etat_processus).localisation);      free((*s_etat_processus).localisation);
     free(s_etat_processus);  
   
 #   ifndef SEMAPHORES_NOMMES  #   ifndef SEMAPHORES_NOMMES
     sem_destroy(&semaphore_liste_threads);      sem_destroy(&semaphore_liste_threads);
Line 3438  rplinit(int argc, char *argv[], unsigned Line 3576  rplinit(int argc, char *argv[], unsigned
             sem_gestionnaires_signaux_atomique);              sem_gestionnaires_signaux_atomique);
 #   endif  #   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  #   ifdef DEBUG_MEMOIRE
     debug_memoire_verification(s_etat_processus);      debug_memoire_verification();
       analyse_post_mortem();
 #   endif  #   endif
   
     return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE);      return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE);

Removed from v.1.20  
changed lines
  Added in v.1.41


CVSweb interface <joel.bertrand@systella.fr>