Diff for /rpl/src/instructions_s1.c between versions 1.23.2.3 and 1.37

version 1.23.2.3, 2011/04/13 17:43:14 version 1.37, 2011/09/14 17:55:59
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.22    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2011 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 2773  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 2782  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 2792  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 2834  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 3210  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 3220  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 3231  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 3308  instruction_sto(struct_processus *s_etat Line 3302  instruction_sto(struct_processus *s_etat
         {          {
             if ((*s_etat_processus).autorisation_nom_implicite == 'N')              if ((*s_etat_processus).autorisation_nom_implicite == 'N')
             {              {
                 if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)                  if ((*(*s_etat_processus).pointeur_variable_courante)
                         .position_variable_courante].niveau == 1)                          .niveau == 1)
                 {                  {
                     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 3321  instruction_sto(struct_processus *s_etat Line 3315  instruction_sto(struct_processus *s_etat
             }              }
   
             liberation(s_etat_processus,              liberation(s_etat_processus,
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)                      (*(*s_etat_processus).pointeur_variable_courante).objet);
                     .position_variable_courante].objet);              (*(*s_etat_processus).pointeur_variable_courante).objet =
                       s_objet_2;
             (*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].objet = s_objet_2;  
         }          }
     }      }
     else      else
Line 3875  instruction_syseval(struct_processus *s_ Line 3867  instruction_syseval(struct_processus *s_
                     longueur_ecriture = strlen((unsigned char *)                      longueur_ecriture = strlen((unsigned char *)
                             (*(*l_element_courant).donnee).objet);                              (*(*l_element_courant).donnee).objet);
   
 #                   ifndef SEMAPHORES_NOMMES                      if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork))
                     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                              != 0)
 #                   else  
                     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;
Line 3890  instruction_syseval(struct_processus *s_ Line 3879  instruction_syseval(struct_processus *s_
                             (*(*l_element_courant).donnee).objet,                              (*(*l_element_courant).donnee).objet,
                             longueur_ecriture) != longueur_ecriture)                              longueur_ecriture) != longueur_ecriture)
                     {                      {
 #                       ifndef SEMAPHORES_NOMMES                          while(pthread_mutex_lock(&((*s_etat_processus)
                         while(sem_wait(&((*s_etat_processus)                                  .mutex_fork)) != 0)
                                 .semaphore_fork)) == -1)  
 #                       else  
                         while(sem_wait((*s_etat_processus)  
                                 .semaphore_fork) == -1)  
 #                       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 3912  instruction_syseval(struct_processus *s_ Line 3893  instruction_syseval(struct_processus *s_
                             return;                              return;
                         }                          }
   
 #                       ifndef SEMAPHORES_NOMMES                          if (pthread_mutex_unlock(&((*s_etat_processus)
                         if (sem_post(&((*s_etat_processus)                                  .mutex_fork)) != 0)
                                 .semaphore_fork)) != 0)  
 #                       else  
                         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;
Line 3928  instruction_syseval(struct_processus *s_ Line 3904  instruction_syseval(struct_processus *s_
                     while(write_atomic(s_etat_processus,                      while(write_atomic(s_etat_processus,
                             pipes_entree[1], "\n", 1) != 1)                              pipes_entree[1], "\n", 1) != 1)
                     {                      {
 #                       ifndef SEMAPHORES_NOMMES                          if (pthread_mutex_lock(&((*s_etat_processus)
                         while(sem_wait(&((*s_etat_processus)                                  .mutex_fork)) != 0)
                                 .semaphore_fork)) == -1)  
 #                       else  
                         while(sem_wait((*s_etat_processus)  
                                 .semaphore_fork) == -1)  
 #                       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 3950  instruction_syseval(struct_processus *s_ Line 3918  instruction_syseval(struct_processus *s_
                             return;                              return;
                         }                          }
   
 #                       ifndef SEMAPHORES_NOMMES                          if (pthread_mutex_unlock(&((*s_etat_processus)
                         if (sem_post(&((*s_etat_processus)                                  .mutex_fork)) != 0)
                                 .semaphore_fork)) != 0)  
 #                       else  
                         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;
                         }                          }
                     }                      }
   
 #                   ifndef SEMAPHORES_NOMMES                      if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork))
                     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                              != 0)
 #                   else  
                     while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #                   endif  
                     {                      {
                         if (errno != EINTR)                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         {                          return;
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
                     }                      }
   
                     l_element_courant = (*l_element_courant).suivant;                      l_element_courant = (*l_element_courant).suivant;
Line 3997  instruction_syseval(struct_processus *s_ Line 3954  instruction_syseval(struct_processus *s_
                  * Récupération de la valeur de retour du processus détaché                   * Récupération de la valeur de retour du processus détaché
                  */                   */
   
 #               ifndef SEMAPHORES_NOMMES                  if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork))
                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                          != 0)
 #               else  
                 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;
Line 4009  instruction_syseval(struct_processus *s_ Line 3963  instruction_syseval(struct_processus *s_
   
                 if (waitpid(pid, &status, 0) == -1)                  if (waitpid(pid, &status, 0) == -1)
                 {                  {
 #                   ifndef SEMAPHORES_NOMMES                      if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork))
                     if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                              != 0)
 #                   else  
                     if (sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #                   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;
                     return;                      return;
                 }                  }
   
 #               ifndef SEMAPHORES_NOMMES                  if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0)
                 if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #               else  
                 if (sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #               endif  
                 {                  {
                     if (errno != EINTR)                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     {                      return;
                         (*s_etat_processus).erreur_systeme = d_es_processus;  
                         return;  
                     }  
                 }                  }
             } while((!WIFEXITED(status)) && (!WIFSIGNALED(status)));              } while((!WIFEXITED(status)) && (!WIFSIGNALED(status)));
   
Line 4051  instruction_syseval(struct_processus *s_ Line 3992  instruction_syseval(struct_processus *s_
                 return;                  return;
             }              }
   
 #           ifndef SEMAPHORES_NOMMES              if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0)
             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
 #           else  
             if (sem_post((*s_etat_processus).semaphore_fork) != 0)  
             {              {
                 (*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                  while(pthread_mutex_lock(&((*s_etat_processus).mutex_fork))
                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                          != 0)
 #               else  
                 while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #               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 4095  instruction_syseval(struct_processus *s_ Line 4022  instruction_syseval(struct_processus *s_
                     return;                      return;
                 }                  }
   
 #               ifndef SEMAPHORES_NOMMES                  if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork))
                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                          != 0)
 #               else  
                 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;
                 }                  }
             }              }
   
 #           ifndef SEMAPHORES_NOMMES              if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0)
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #           else  
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #           endif  
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if ((tampon = realloc(tampon, (strlen(tampon) + 1) *              if ((tampon = realloc(tampon, (strlen(tampon) + 1) *
Line 4258  instruction_syseval(struct_processus *s_ Line 4175  instruction_syseval(struct_processus *s_
             return;              return;
         }          }
     
 #       ifndef SEMAPHORES_NOMMES          if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0)
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)  
 #       else  
         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;
Line 4279  instruction_syseval(struct_processus *s_ Line 4192  instruction_syseval(struct_processus *s_
                 &((*s_etat_processus).l_base_pile), s_objet_resultat)                  &((*s_etat_processus).l_base_pile), s_objet_resultat)
                 == d_erreur)                  == d_erreur)
         {          {
 #           ifndef SEMAPHORES_NOMMES              if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0)
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #           else  
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #           endif  
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (close(pipes_erreur[0]) != 0)              if (close(pipes_erreur[0]) != 0)
Line 4302  instruction_syseval(struct_processus *s_ Line 4208  instruction_syseval(struct_processus *s_
             return;              return;
         }          }
   
 #       ifndef SEMAPHORES_NOMMES          if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0)
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #       else  
         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #       endif  
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
   
         if (close(pipes_erreur[0]) != 0)          if (close(pipes_erreur[0]) != 0)

Removed from v.1.23.2.3  
changed lines
  Added in v.1.37


CVSweb interface <joel.bertrand@systella.fr>