Diff for /rpl/src/instructions_s1.c between versions 1.8 and 1.44

version 1.8, 2010/04/17 18:57:35 version 1.44, 2012/01/05 10:19:03
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.14    RPL/2 (R) version 4.1.5
   Copyright (C) 1989-2010 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 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 1275  instruction_same(struct_processus *s_eta Line 1275  instruction_same(struct_processus *s_eta
         printf("    1: %s\n", d_RPN);          printf("    1: %s\n", d_RPN);
         printf("->  1: %s\n", d_RPN);          printf("->  1: %s\n", d_RPN);
   
           printf("    2: %s\n", d_PRC);
           printf("    1: %s\n", d_PRC);
           printf("->  1: %s\n", d_INT);
   
         return;          return;
     }      }
     else if ((*s_etat_processus).test_instruction == 'Y')      else if ((*s_etat_processus).test_instruction == 'Y')
Line 2569  instruction_start(struct_processus *s_et Line 2573  instruction_start(struct_processus *s_et
     }      }
   
     empilement_pile_systeme(s_etat_processus);      empilement_pile_systeme(s_etat_processus);
   
       if ((*s_etat_processus).erreur_systeme != d_es)
       {
           return;
       }
   
     (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'S';      (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'S';
   
     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),      if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
Line 2578  instruction_start(struct_processus *s_et Line 2588  instruction_start(struct_processus *s_et
         return;          return;
     }      }
   
     if (((*s_objet_1).type != INT) &&      if (((*s_objet_1).type != INT) && ((*s_objet_1).type != REL))
             ((*s_objet_1).type != REL))  
     {      {
         liberation(s_etat_processus, s_objet_1);          liberation(s_etat_processus, s_objet_1);
   
Line 2596  instruction_start(struct_processus *s_et Line 2605  instruction_start(struct_processus *s_et
         return;          return;
     }      }
   
     if (((*s_objet_2).type != INT) &&      if (((*s_objet_2).type != INT) && ((*s_objet_2).type != REL))
             ((*s_objet_2).type != REL))  
     {      {
         liberation(s_etat_processus, s_objet_1);          liberation(s_etat_processus, s_objet_1);
         liberation(s_etat_processus, s_objet_2);          liberation(s_etat_processus, s_objet_2);
Line 2765  instruction_step(struct_processus *s_eta Line 2773  instruction_step(struct_processus *s_eta
             return;              return;
         }          }
   
         if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante)
                 .position_variable_courante]).variable_verrouillee == d_vrai)                  .variable_verrouillee == d_vrai)
         {          {
             liberation(s_etat_processus, s_objet);              liberation(s_etat_processus, s_objet);
   
Line 2774  instruction_step(struct_processus *s_eta Line 2782  instruction_step(struct_processus *s_eta
             return;              return;
         }          }
           
         if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
                 .position_variable_courante]).objet == NULL)  
         {          {
             liberation(s_etat_processus, s_objet);              liberation(s_etat_processus, s_objet);
   
Line 2784  instruction_step(struct_processus *s_eta Line 2791  instruction_step(struct_processus *s_eta
         }          }
   
         (*(*s_etat_processus).l_base_pile_systeme).indice_boucle =          (*(*s_etat_processus).l_base_pile_systeme).indice_boucle =
                 ((*s_etat_processus).s_liste_variables[(*s_etat_processus)                  (*(*s_etat_processus).pointeur_variable_courante).objet;
                 .position_variable_courante]).objet;  
     }      }
   
     /*      /*
Line 2826  instruction_step(struct_processus *s_eta Line 2832  instruction_step(struct_processus *s_eta
          */           */
   
         (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL;          (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL;
         ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet;
                 .position_variable_courante]).objet = s_objet;  
     }      }
     else      else
     {      {
Line 3202  instruction_sto(struct_processus *s_etat Line 3207  instruction_sto(struct_processus *s_etat
          * La variable est accessible.           * La variable est accessible.
          */           */
   
         if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante)
                 .position_variable_courante].variable_verrouillee == d_vrai)                  .variable_verrouillee == d_vrai)
         {          {
             liberation(s_etat_processus, s_objet_1);              liberation(s_etat_processus, s_objet_1);
             liberation(s_etat_processus, s_objet_2);              liberation(s_etat_processus, s_objet_2);
Line 3212  instruction_sto(struct_processus *s_etat Line 3217  instruction_sto(struct_processus *s_etat
             return;              return;
         }          }
   
         if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
                 .position_variable_courante].objet == NULL)  
         {          {
             if (pthread_mutex_lock(&((*(*s_etat_processus)              if (pthread_mutex_lock(&((*(*s_etat_processus)
                     .s_liste_variables_partagees).mutex)) != 0)                      .s_liste_variables_partagees).mutex)) != 0)
Line 3223  instruction_sto(struct_processus *s_etat Line 3227  instruction_sto(struct_processus *s_etat
             }              }
   
             if (recherche_variable_partagee(s_etat_processus,              if (recherche_variable_partagee(s_etat_processus,
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)                      (*(*s_etat_processus).pointeur_variable_courante).nom,
                     .position_variable_courante].nom,                      (*(*s_etat_processus).pointeur_variable_courante)
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)                      .variable_partagee, (*(*s_etat_processus)
                     .position_variable_courante].variable_partagee,                      .pointeur_variable_courante).origine) == d_faux)
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].origine) == d_faux)  
             {              {
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)                  if (pthread_mutex_unlock(&((*(*s_etat_processus)
                         .s_liste_variables_partagees).mutex)) != 0)                          .s_liste_variables_partagees).mutex)) != 0)
Line 3237  instruction_sto(struct_processus *s_etat Line 3239  instruction_sto(struct_processus *s_etat
                     return;                      return;
                 }                  }
   
                   if ((*s_etat_processus).autorisation_nom_implicite == 'N')
                   {
                       liberation(s_etat_processus, s_objet_1);
                       liberation(s_etat_processus, s_objet_2);
   
                       (*s_etat_processus).erreur_systeme = d_es;
                       (*s_etat_processus).erreur_execution =
                               d_ex_creation_variable_globale;
                       return;
                   }
   
                 if ((s_variable.nom = malloc((strlen((*((struct_nom *)                  if ((s_variable.nom = malloc((strlen((*((struct_nom *)
                         (*s_objet_1).objet)).nom) + 1) *                          (*s_objet_1).objet)).nom) + 1) *
                         sizeof(unsigned char))) == NULL)                          sizeof(unsigned char))) == NULL)
Line 3287  instruction_sto(struct_processus *s_etat Line 3300  instruction_sto(struct_processus *s_etat
         }          }
         else          else
         {          {
             liberation(s_etat_processus,              if ((*s_etat_processus).autorisation_nom_implicite == 'N')
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)              {
                     .position_variable_courante].objet);                  if ((*(*s_etat_processus).pointeur_variable_courante)
                           .niveau == 1)
                   {
                       liberation(s_etat_processus, s_objet_1);
                       liberation(s_etat_processus, s_objet_2);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_creation_variable_globale;
                       return;
                   }
               }
   
             (*s_etat_processus).s_liste_variables[(*s_etat_processus)              liberation(s_etat_processus,
                     .position_variable_courante].objet = s_objet_2;                      (*(*s_etat_processus).pointeur_variable_courante).objet);
               (*(*s_etat_processus).pointeur_variable_courante).objet =
                       s_objet_2;
         }          }
     }      }
     else      else
Line 3302  instruction_sto(struct_processus *s_etat Line 3327  instruction_sto(struct_processus *s_etat
          * une variable globale.           * une variable globale.
          */           */
   
           if ((*s_etat_processus).autorisation_nom_implicite == 'N')
           {
               liberation(s_etat_processus, s_objet_1);
               liberation(s_etat_processus, s_objet_2);
   
               (*s_etat_processus).erreur_systeme = d_es;
               (*s_etat_processus).erreur_execution =
                       d_ex_creation_variable_globale;
               return;
           }
   
         if ((s_variable.nom = malloc((strlen((*((struct_nom *)          if ((s_variable.nom = malloc((strlen((*((struct_nom *)
                 (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char)))                  (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char)))
                 == NULL)                  == NULL)
Line 3367  instruction_syseval(struct_processus *s_ Line 3403  instruction_syseval(struct_processus *s_
   
     pid_t                       pid;      pid_t                       pid;
   
     sigset_t                    oldset;  
     sigset_t                    set;  
   
     ssize_t                     longueur_ecriture;      ssize_t                     longueur_ecriture;
   
     struct_liste_chainee        *l_element_courant;      struct_liste_chainee        *l_element_courant;
Line 3666  instruction_syseval(struct_processus *s_ Line 3699  instruction_syseval(struct_processus *s_
   
         fflush(NULL);          fflush(NULL);
   
         sigfillset(&set);  
         pthread_sigmask(SIG_BLOCK, &set, &oldset);  
   
         verrouillage_threads_concurrents(s_etat_processus);          verrouillage_threads_concurrents(s_etat_processus);
         pid = fork();          pid = fork();
         deverrouillage_threads_concurrents(s_etat_processus);          deverrouillage_threads_concurrents(s_etat_processus);
   
         pthread_sigmask(SIG_SETMASK, &oldset, NULL);  
         sigpending(&set);  
   
         if (pid < 0)          if (pid < 0)
         {          {
             if (close(pipes_entree[0]) != 0)              if (close(pipes_entree[0]) != 0)
Line 3832  instruction_syseval(struct_processus *s_ Line 3859  instruction_syseval(struct_processus *s_
                             (*(*l_element_courant).donnee).objet);                              (*(*l_element_courant).donnee).objet);
   
 #                   ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                          if (sem_post(&((*s_etat_processus).semaphore_fork))
                                   != 0)
 #                   else  #                   else
                     if (sem_post((*s_etat_processus).semaphore_fork) != 0)                          if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #                   endif  #                   endif
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
Line 3847  instruction_syseval(struct_processus *s_ Line 3875  instruction_syseval(struct_processus *s_
                             longueur_ecriture) != longueur_ecriture)                              longueur_ecriture) != longueur_ecriture)
                     {                      {
 #                       ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                         while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                 .semaphore_fork)) == -1)                                      .semaphore_fork)) != 0)
 #                       else  #                       else
                         while(sem_wait((*s_etat_processus)                              while(sem_wait((*s_etat_processus)
                                 .semaphore_fork) == -1)                                      .semaphore_fork) != 0)
 #                       endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              (*s_etat_processus).erreur_systeme =
                             {                                      d_es_processus;
                                 (*s_etat_processus).erreur_systeme =                              return;
                                         d_es_processus;  
                                 return;  
                             }  
                         }                          }
   
                         if (longueur_ecriture == -1)                          if (longueur_ecriture == -1)
Line 3869  instruction_syseval(struct_processus *s_ Line 3894  instruction_syseval(struct_processus *s_
                         }                          }
   
 #                       ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                         if (sem_post(&((*s_etat_processus)                              if (sem_post(&((*s_etat_processus)
                                 .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                       else  #                       else
                         if (sem_post((*s_etat_processus)                              if (sem_post((*s_etat_processus)
                                 .semaphore_fork) != 0)                                      .semaphore_fork) != 0)
 #                       endif  #                       endif
                         {                          {
                             (*s_etat_processus).erreur_systeme = d_es_processus;                              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 3885  instruction_syseval(struct_processus *s_ Line 3910  instruction_syseval(struct_processus *s_
                             pipes_entree[1], "\n", 1) != 1)                              pipes_entree[1], "\n", 1) != 1)
                     {                      {
 #                       ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                         while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                 .semaphore_fork)) == -1)                                      .semaphore_fork)) != 0)
 #                       else  #                       else
                         while(sem_wait((*s_etat_processus)                              while(sem_wait((*s_etat_processus)
                                 .semaphore_fork) == -1)                                      .semaphore_fork) != 0)
 #                       endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
Line 3907  instruction_syseval(struct_processus *s_ Line 3932  instruction_syseval(struct_processus *s_
                         }                          }
   
 #                       ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                         if (sem_post(&((*s_etat_processus)                              if (sem_post(&((*s_etat_processus)
                                 .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                       else  #                       else
                         if (sem_post((*s_etat_processus)                              if (sem_post((*s_etat_processus)
                                 .semaphore_fork) != 0)                                      .semaphore_fork) != 0)
 #                       endif  #                       endif
                         {                          {
                             (*s_etat_processus).erreur_systeme = d_es_processus;                              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 3920  instruction_syseval(struct_processus *s_ Line 3945  instruction_syseval(struct_processus *s_
                     }                      }
   
 #                   ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                          while(sem_wait(&((*s_etat_processus).semaphore_fork))
                                   != 0)
 #                   else  #                   else
                     while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                          while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #                   endif  #                   endif
                     {                      {
                         if (errno != EINTR)                          if (errno != EINTR)
Line 3954  instruction_syseval(struct_processus *s_ Line 3980  instruction_syseval(struct_processus *s_
                  */                   */
   
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                      if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)                      if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #               endif
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
Line 3966  instruction_syseval(struct_processus *s_ Line 3992  instruction_syseval(struct_processus *s_
                 if (waitpid(pid, &status, 0) == -1)                  if (waitpid(pid, &status, 0) == -1)
                 {                  {
 #                   ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                     if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                          if (sem_post(&((*s_etat_processus).semaphore_fork))
                                   != 0)
 #                   else  #                   else
                     if (sem_wait((*s_etat_processus).semaphore_fork) == -1)                          if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #                   endif  #                   endif
                     {                      {
                         if (errno != EINTR)                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         {                          return;
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
                     }                      }
   
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
Line 3983  instruction_syseval(struct_processus *s_ Line 4007  instruction_syseval(struct_processus *s_
                 }                  }
   
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                 if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                      while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
                 if (sem_wait((*s_etat_processus).semaphore_fork) == -1)                      while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #               endif
                 {                  {
                     if (errno != EINTR)                      if (errno != EINTR)
Line 4008  instruction_syseval(struct_processus *s_ Line 4032  instruction_syseval(struct_processus *s_
             }              }
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                  if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
             {  
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
 #           else  #           else
             if (sem_post((*s_etat_processus).semaphore_fork) != 0)                  if (sem_post((*s_etat_processus).semaphore_fork) != 0)
   #           endif
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
 #           endif  
   
             while((ios = read_atomic(s_etat_processus,              while((ios = read_atomic(s_etat_processus,
                     pipes_sortie[0], &(tampon[pointeur]),                      pipes_sortie[0], &(tampon[pointeur]),
                     longueur_lecture)) > 0)                      longueur_lecture)) > 0)
             {              {
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                      while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                      while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #               endif
                 {                  {
                     if (errno != EINTR)                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     {                      return;
                         (*s_etat_processus).erreur_systeme = d_es_processus;  
                         return;  
                     }  
                 }                  }
   
                 tampon[pointeur + ios] = d_code_fin_chaine;                  tampon[pointeur + ios] = d_code_fin_chaine;
Line 4052  instruction_syseval(struct_processus *s_ Line 4069  instruction_syseval(struct_processus *s_
                 }                  }
   
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                      if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)                      if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #               endif
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
Line 4063  instruction_syseval(struct_processus *s_ Line 4080  instruction_syseval(struct_processus *s_
             }              }
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                  while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 if (errno != EINTR)                  if (errno != EINTR)
Line 4215  instruction_syseval(struct_processus *s_ Line 4232  instruction_syseval(struct_processus *s_
         }          }
     
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)              if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #       else  #       else
         if (sem_post((*s_etat_processus).semaphore_fork) != 0)              if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #       endif  #       endif
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 4236  instruction_syseval(struct_processus *s_ Line 4253  instruction_syseval(struct_processus *s_
                 == d_erreur)                  == d_erreur)
         {          {
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                  while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 if (errno != EINTR)                  if (errno != EINTR)
Line 4259  instruction_syseval(struct_processus *s_ Line 4276  instruction_syseval(struct_processus *s_
         }          }
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #       else  #       else
         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)              while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #       endif  #       endif
         {          {
             if (errno != EINTR)              if (errno != EINTR)

Removed from v.1.8  
changed lines
  Added in v.1.44


CVSweb interface <joel.bertrand@systella.fr>