Diff for /rpl/src/instructions_s9.c between versions 1.26 and 1.56

version 1.26, 2011/04/21 16:00:59 version 1.56, 2012/12/18 13:19:38
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.0.prerelease.0    RPL/2 (R) version 4.1.12
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 141  instruction_sort(struct_processus *s_eta Line 141  instruction_sort(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)
         {          {
             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;              (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
   
Line 152  instruction_sort(struct_processus *s_eta Line 152  instruction_sort(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)  
         {          {
             if (pthread_mutex_lock(&((*(*s_etat_processus)  
                     .s_liste_variables_partagees).mutex)) != 0)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
   
             if (recherche_variable_partagee(s_etat_processus,              if (recherche_variable_partagee(s_etat_processus,
                     (*s_etat_processus).s_liste_variables                      (*(*s_etat_processus).pointeur_variable_courante).nom,
                     [(*s_etat_processus).position_variable_courante].nom,                      (*(*s_etat_processus).pointeur_variable_courante)
                     (*s_etat_processus).s_liste_variables                      .variable_partagee, (*(*s_etat_processus)
                     [(*s_etat_processus).position_variable_courante]                      .pointeur_variable_courante).origine) == NULL)
                     .variable_partagee, (*s_etat_processus).s_liste_variables  
                     [(*s_etat_processus).position_variable_courante].origine)  
                     == d_faux)  
             {              {
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)  
                         .s_liste_variables_partagees).mutex)) != 0)  
                 {  
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
   
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_type_argument;                          d_ex_erreur_type_argument;
   
Line 187  instruction_sort(struct_processus *s_eta Line 169  instruction_sort(struct_processus *s_eta
                 return;                  return;
             }              }
   
             if (((*(*(*s_etat_processus).s_liste_variables_partagees)              if (((*(*(*s_etat_processus).pointeur_variable_partagee_courante)
                     .table[(*(*s_etat_processus).s_liste_variables_partagees)                      .objet).type != LST) && ((*(*(*s_etat_processus)
                     .position_variable].objet).type != LST) &&                      .pointeur_variable_partagee_courante).objet).type != TBL))
                     ((*(*(*s_etat_processus).s_liste_variables_partagees)  
                     .table[(*(*s_etat_processus).s_liste_variables_partagees)  
                     .position_variable].objet).type != TBL))  
             {              {
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)                  if (pthread_mutex_unlock(&((*(*s_etat_processus)
                         .s_liste_variables_partagees).mutex)) != 0)                          .pointeur_variable_partagee_courante).mutex)) != 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      return;
Line 212  instruction_sort(struct_processus *s_eta Line 191  instruction_sort(struct_processus *s_eta
   
             liberation(s_etat_processus, s_objet_liste);              liberation(s_etat_processus, s_objet_liste);
   
             s_objet_liste = (*(*s_etat_processus).s_liste_variables_partagees)              s_objet_liste = (*(*s_etat_processus)
                     .table[(*(*s_etat_processus).s_liste_variables_partagees)                      .pointeur_variable_partagee_courante).objet;
                     .position_variable].objet;  
   
             if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,              if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,
                     'N')) == NULL)                      'N')) == NULL)
             {              {
                 if (pthread_mutex_unlock(&((*(*s_etat_processus)                  if (pthread_mutex_unlock(&((*(*s_etat_processus)
                         .s_liste_variables_partagees).mutex)) != 0)                          .pointeur_variable_partagee_courante).mutex)) != 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      return;
Line 234  instruction_sort(struct_processus *s_eta Line 212  instruction_sort(struct_processus *s_eta
         }          }
         else          else
         {          {
             if (((*(*s_etat_processus).s_liste_variables              if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
                     [(*s_etat_processus).position_variable_courante].objet)                      .type != LST) && ((*(*(*s_etat_processus)
                     .type != LST) &&                      .pointeur_variable_courante).objet).type != TBL))
                     ((*(*s_etat_processus).s_liste_variables  
                     [(*s_etat_processus).position_variable_courante].objet)  
                     .type != TBL))  
             {              {
                 (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_execution =
                         d_ex_erreur_type_argument;                          d_ex_erreur_type_argument;
Line 252  instruction_sort(struct_processus *s_eta Line 227  instruction_sort(struct_processus *s_eta
   
             liberation(s_etat_processus, s_objet_liste);              liberation(s_etat_processus, s_objet_liste);
   
             s_objet_liste = (*s_etat_processus).s_liste_variables              s_objet_liste = (*(*s_etat_processus).pointeur_variable_courante)
                     [(*s_etat_processus).position_variable_courante].objet;                      .objet;
   
             if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,              if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste,
                     'N')) == NULL)                      'N')) == NULL)
Line 265  instruction_sort(struct_processus *s_eta Line 240  instruction_sort(struct_processus *s_eta
   
         liberation(s_etat_processus, s_objet_liste);          liberation(s_etat_processus, s_objet_liste);
         s_objet_liste = s_objet_copie;          s_objet_liste = s_objet_copie;
           (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_liste;
         (*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                 .position_variable_courante].objet = s_objet_liste;  
   
         presence_nom = d_vrai;          presence_nom = d_vrai;
     }      }
     else      else
Line 604  instruction_sort(struct_processus *s_eta Line 576  instruction_sort(struct_processus *s_eta
     else      else
     {      {
         if (pthread_mutex_unlock(&((*(*s_etat_processus)          if (pthread_mutex_unlock(&((*(*s_etat_processus)
                 .s_liste_variables_partagees).mutex)) != 0)                  .pointeur_variable_partagee_courante).mutex)) != 0)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
Line 629  instruction_sort(struct_processus *s_eta Line 601  instruction_sort(struct_processus *s_eta
     {      {
         if (variable_partagee == d_vrai)          if (variable_partagee == d_vrai)
         {          {
             (*(*s_etat_processus).s_liste_variables_partagees)              (*(*s_etat_processus).pointeur_variable_partagee_courante).objet =
                     .table[(*(*s_etat_processus).s_liste_variables_partagees)                      s_objet_liste;
                     .position_variable].objet = s_objet_liste;  
   
             if (pthread_mutex_unlock(&((*(*s_etat_processus)              if (pthread_mutex_unlock(&((*(*s_etat_processus)
                     .s_liste_variables_partagees).mutex)) != 0)                      .pointeur_variable_partagee_courante).mutex)) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
Line 663  instruction_sort(struct_processus *s_eta Line 634  instruction_sort(struct_processus *s_eta
 void  void
 instruction_save(struct_processus *s_etat_processus)  instruction_save(struct_processus *s_etat_processus)
 {  {
     logical1                            presence_variable;  
   
     long                                i;  
   
     struct_objet                        *s_objet_1;      struct_objet                        *s_objet_1;
     struct_objet                        *s_objet_2;      struct_objet                        *s_objet_2;
   
Line 738  instruction_save(struct_processus *s_eta Line 705  instruction_save(struct_processus *s_eta
         return;          return;
     }      }
   
     if (recherche_variable(s_etat_processus, (*((struct_nom *)      if (recherche_variable_globale(s_etat_processus, (*((struct_nom *)
             (*s_objet_1).objet)).nom) == d_vrai)              (*s_objet_1).objet)).nom) == d_vrai)
     {      {
         /*          /*
          * Une variable est accessible directement.           * Une variable est accessible.
          */           */
   
         if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          if ((*(*s_etat_processus).pointeur_variable_courante)
                 .position_variable_courante].niveau == 1)                  .variable_verrouillee == d_vrai)
         {          {
             // La variable accessible directement est une variable globale.              liberation(s_etat_processus, s_objet_1);
               liberation(s_etat_processus, s_objet_2);
             if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].variable_verrouillee == d_vrai)  
             {  
                 liberation(s_etat_processus, s_objet_1);  
                 liberation(s_etat_processus, s_objet_2);  
   
                 (*s_etat_processus).erreur_execution =  
                         d_ex_variable_verrouillee;  
                 return;  
             }  
   
             if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].objet == NULL)  
             {  
                 liberation(s_etat_processus, s_objet_1);  
                 liberation(s_etat_processus, s_objet_2);  
   
                 (*s_etat_processus).erreur_execution = d_ex_variable_partagee;  
                 return;  
             }  
   
             liberation(s_etat_processus,              (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)              return;
                     .position_variable_courante].objet);  
   
             (*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].objet = s_objet_2;  
         }          }
         else  
         {  
             // On cherche une variable globale de même nom.  
   
             i = (*s_etat_processus).position_variable_courante;  
             presence_variable = d_faux;  
   
             while(i >= 0)  
             {  
                 if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,  
                         (*((struct_nom *) (*s_objet_1).objet)).nom) == 0) &&  
                         ((*s_etat_processus).s_liste_variables[i].niveau == 1))  
                 {  
                     presence_variable = d_vrai;  
                     break;  
                 }  
   
                 i--;  
             }  
   
             if (presence_variable == d_vrai)  
             {  
                 (*s_etat_processus).position_variable_courante = i;  
             }  
             else  
             {  
                 (*s_etat_processus).position_variable_courante = 0;  
             }  
   
             if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                     .position_variable_courante].niveau == 1) &&  
                     (presence_variable == d_vrai))  
             {  
                 // On a trouvé une variable globale correspondant au nom et  
                 // que l'on modifie.  
   
                 if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                         .position_variable_courante].variable_verrouillee ==  
                         d_vrai)  
                 {  
                     liberation(s_etat_processus, s_objet_1);  
                     liberation(s_etat_processus, s_objet_2);  
   
                     (*s_etat_processus).erreur_execution =  
                             d_ex_variable_verrouillee;  
                     return;  
                 }  
   
                 if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                         .position_variable_courante].objet == NULL)  
                 {  
                     liberation(s_etat_processus, s_objet_1);  
                     liberation(s_etat_processus, s_objet_2);  
   
                     (*s_etat_processus).erreur_execution =  
                             d_ex_variable_partagee;  
                     return;  
                 }  
   
                 liberation(s_etat_processus,  
                         (*s_etat_processus).s_liste_variables  
                         [(*s_etat_processus).position_variable_courante].objet);  
   
                 (*s_etat_processus).s_liste_variables[(*s_etat_processus)  
                         .position_variable_courante].objet = s_objet_2;  
             }  
             else  
             {  
                 if ((s_variable.nom = malloc((strlen((*((struct_nom *)  
                         (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char)))  
                         == NULL)  
                 {  
                     (*s_etat_processus).erreur_systeme =  
                             d_es_allocation_memoire;  
                     return;  
                 }  
   
                 strcpy(s_variable.nom, (*((struct_nom *)          if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
                         (*s_objet_1).objet)).nom);          {
                 s_variable.niveau = 1;              liberation(s_etat_processus, s_objet_1);
               liberation(s_etat_processus, s_objet_2);
                 /*  
                  * Le niveau 0 correspond aux définitions. Les variables  
                  * commencent à 1 car elles sont toujours incluses dans  
                  * une définition.  
                  */  
   
                 s_variable.objet = s_objet_2;  
   
                 if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')              (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
                         == d_erreur)              return;
                 {  
                     return;  
                 }  
             }  
         }          }
   
           liberation(s_etat_processus,
                   (*(*s_etat_processus).pointeur_variable_courante).objet);
           (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_2;
     }      }
     else      else
     {      {
Line 881  instruction_save(struct_processus *s_eta Line 741  instruction_save(struct_processus *s_eta
          * Aucune variable n'est accessible (ni locale, ni globale).           * Aucune variable n'est accessible (ni locale, ni globale).
          */           */
   
           if (((*s_etat_processus).autorisation_nom_implicite == 'N') &&
                   ((*((struct_nom *) (*s_objet_1).objet)).symbole == d_faux))
           {
               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 930  instruction_save(struct_processus *s_eta Line 802  instruction_save(struct_processus *s_eta
 void  void
 instruction_suspend(struct_processus *s_etat_processus)  instruction_suspend(struct_processus *s_etat_processus)
 {  {
     sigset_t            masque;      struct timespec             attente;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
Line 940  instruction_suspend(struct_processus *s_ Line 812  instruction_suspend(struct_processus *s_
   
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("(attend un signal SIGCONT)\n\n");              printf("(attend un signal RPL/SIGCONT)\n\n");
             printf("  Aucun argument\n");              printf("  Aucun argument\n");
         }          }
         else          else
         {          {
             printf("(wait for SIGCONT signal)\n\n");              printf("(wait for RPL/SIGCONT signal)\n\n");
             printf("  No argument\n");              printf("  No argument\n");
         }          }
   
Line 965  instruction_suspend(struct_processus *s_ Line 837  instruction_suspend(struct_processus *s_
         }          }
     }      }
   
     if (sigfillset(&masque) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigdelset(&masque, SIGCONT) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigdelset(&masque, SIGFSTOP) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigdelset(&masque, SIGFABORT) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigdelset(&masque, SIGURG) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if (sigdelset(&masque, SIGALRM) != 0)  
     {  
         (*s_etat_processus).erreur_systeme = d_es_processus;  
         return;  
     }  
   
     if ((*s_etat_processus).profilage == d_vrai)      if ((*s_etat_processus).profilage == d_vrai)
     {      {
         profilage(s_etat_processus, "Suspend");          profilage(s_etat_processus, "Suspend");
Line 1012  instruction_suspend(struct_processus *s_ Line 848  instruction_suspend(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  
   
     sigsuspend(&masque);      for((*s_etat_processus).redemarrage_processus = d_faux;;)
       {
           scrutation_interruptions(s_etat_processus);
   
           if ((*s_etat_processus).redemarrage_processus == d_vrai)
           {
               break;
           }
   
           nanosleep(&attente, NULL);
           INCR_GRANULARITE(attente.tv_nsec);
       }
   
 #   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 1397  instruction_swi(struct_processus *s_etat Line 1240  instruction_swi(struct_processus *s_etat
             attente.tv_nsec = GRANULARITE_us * 1000;              attente.tv_nsec = GRANULARITE_us * 1000;
   
 #           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((longueur_ecriture = write_atomic(s_etat_processus,              while((longueur_ecriture = write_atomic(s_etat_processus,
                     (*s_etat_processus).pipe_nombre_objets_attente,                      (*s_etat_processus).pipe_nombre_objets_attente,
                     &pid, sizeof(pid))) != sizeof(pid))                      &pid, sizeof(pid))) != sizeof(pid))
             {              {
 #               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 1450  instruction_swi(struct_processus *s_etat Line 1289  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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 1460  instruction_swi(struct_processus *s_etat Line 1299  instruction_swi(struct_processus *s_etat
                 }                  }
             }              }
   
               scrutation_interruptions(s_etat_processus);
   
 #           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 1475  instruction_swi(struct_processus *s_etat Line 1316  instruction_swi(struct_processus *s_etat
         }          }
         else          else
         {          {
             tid = -1;              tid = (pthread_t) -1;
   
             attente.tv_sec = 0;              attente.tv_sec = 0;
             attente.tv_nsec = GRANULARITE_us * 1000;              attente.tv_nsec = GRANULARITE_us * 1000;
   
 #           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((longueur_ecriture = write_atomic(s_etat_processus,              while((longueur_ecriture = write_atomic(s_etat_processus,
                     (*s_etat_processus).pipe_nombre_objets_attente,                      (*s_etat_processus).pipe_nombre_objets_attente,
                     &tid, sizeof(tid))) != sizeof(tid))                      &tid, sizeof(tid))) != sizeof(tid))
             {              {
 #               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 1534  instruction_swi(struct_processus *s_etat Line 1371  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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  
             }              }
   
               scrutation_interruptions(s_etat_processus);
   
 #           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 1568  instruction_swi(struct_processus *s_etat Line 1403  instruction_swi(struct_processus *s_etat
         attente.tv_nsec = GRANULARITE_us * 1000;          attente.tv_nsec = GRANULARITE_us * 1000;
   
 #       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((longueur_ecriture = write_atomic(s_etat_processus,          while((longueur_ecriture = write_atomic(s_etat_processus,
                 (*s_etat_processus).pipe_interruptions,                  (*s_etat_processus).pipe_interruptions,
Line 1587  instruction_swi(struct_processus *s_etat Line 1418  instruction_swi(struct_processus *s_etat
                 != sizeof(interruption_reduite))                  != sizeof(interruption_reduite))
         {          {
 #           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 1622  instruction_swi(struct_processus *s_etat Line 1453  instruction_swi(struct_processus *s_etat
             INCR_GRANULARITE(attente.tv_nsec);              INCR_GRANULARITE(attente.tv_nsec);
   
 #           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  
               scrutation_interruptions(s_etat_processus);
         }          }
   
 #       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 1657  instruction_swi(struct_processus *s_etat Line 1486  instruction_swi(struct_processus *s_etat
             attente.tv_nsec = GRANULARITE_us * 1000;              attente.tv_nsec = GRANULARITE_us * 1000;
   
 #           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((longueur_ecriture = write_atomic(s_etat_processus,              while((longueur_ecriture = write_atomic(s_etat_processus,
                     (*s_etat_processus).pipe_nombre_interruptions_attente,                      (*s_etat_processus).pipe_nombre_interruptions_attente,
                     &pid, sizeof(pid))) != sizeof(pid))                      &pid, sizeof(pid))) != sizeof(pid))
             {              {
 #               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
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      if (errno != EINTR)
                     return;                      {
                           (*s_etat_processus).erreur_systeme = d_es_processus;
                           return;
                       }
                 }                  }
   
                 if (longueur_ecriture == -1)                  if (longueur_ecriture == -1)
Line 1707  instruction_swi(struct_processus *s_etat Line 1535  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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  
                   scrutation_interruptions(s_etat_processus);
             }              }
   
             pid = getpid();              pid = getpid();
Line 1731  instruction_swi(struct_processus *s_etat Line 1557  instruction_swi(struct_processus *s_etat
                     &pid, sizeof(pid))) != sizeof(pid))                      &pid, sizeof(pid))) != sizeof(pid))
             {              {
 #               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 1766  instruction_swi(struct_processus *s_etat Line 1592  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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  
             }              }
   
 #           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 1795  instruction_swi(struct_processus *s_etat Line 1617  instruction_swi(struct_processus *s_etat
         }          }
         else          else
         {          {
             tid = -3;              tid = (pthread_t) -3;
   
 #           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((longueur_ecriture = write_atomic(s_etat_processus,              while((longueur_ecriture = write_atomic(s_etat_processus,
                     (*s_etat_processus).pipe_nombre_interruptions_attente,                      (*s_etat_processus).pipe_nombre_interruptions_attente,
                     &tid, sizeof(tid))) != sizeof(tid))                      &tid, sizeof(tid))) != sizeof(tid))
             {              {
 #               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 1851  instruction_swi(struct_processus *s_etat Line 1669  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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  
                   scrutation_interruptions(s_etat_processus);
             }              }
   
             tid = pthread_self();              tid = pthread_self();
Line 1875  instruction_swi(struct_processus *s_etat Line 1691  instruction_swi(struct_processus *s_etat
                     &tid, sizeof(tid))) != sizeof(tid))                      &tid, sizeof(tid))) != sizeof(tid))
             {              {
 #               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 1911  instruction_swi(struct_processus *s_etat Line 1727  instruction_swi(struct_processus *s_etat
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
   
 #               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  
                   scrutation_interruptions(s_etat_processus);
             }              }
   
 #           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 1943  instruction_swi(struct_processus *s_etat Line 1757  instruction_swi(struct_processus *s_etat
         attente.tv_nsec = GRANULARITE_us * 1000;          attente.tv_nsec = GRANULARITE_us * 1000;
   
 #       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(read_atomic(s_etat_processus,          while(read_atomic(s_etat_processus,
                 (*s_etat_processus).pipe_acquittement,                  (*s_etat_processus).pipe_acquittement,
                 &tampon, sizeof(unsigned char)) != sizeof(unsigned char))                  &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
         {          {
 #           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 1977  instruction_swi(struct_processus *s_etat Line 1787  instruction_swi(struct_processus *s_etat
             INCR_GRANULARITE(attente.tv_nsec);              INCR_GRANULARITE(attente.tv_nsec);
   
 #           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;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
 #       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.26  
changed lines
  Added in v.1.56


CVSweb interface <joel.bertrand@systella.fr>