Diff for /rpl/src/instructions_s1.c between versions 1.102 and 1.103

version 1.102, 2019/02/12 14:38:43 version 1.103, 2019/02/17 08:59:39
Line 3372  instruction_sto(struct_processus *s_etat Line 3372  instruction_sto(struct_processus *s_etat
 ================================================================================  ================================================================================
 */  */
   
   struct
   {
       struct_processus        *s_etat_processus;
       struct_liste_chainee    *stdin;
       int                     pipe_entree;
       volatile int            erreur;
   } arguments_stdin;
   
   static void *
   thread_stdin(void *argument)
   {
       integer8                longueur_ecriture;
   
       typeof(arguments_stdin) *ptr;
   
       struct_liste_chainee    *l_element_courant;
   
       struct_processus        *s_etat_processus;
   
       unsigned char           *ligne;
   
       ptr = argument;
   
       l_element_courant = (*ptr).stdin;
       s_etat_processus = (*ptr).s_etat_processus;
       (*ptr).erreur = d_es;
   
       while(l_element_courant != NULL)
       {
           if ((ligne = formateur_flux(s_etat_processus,
                   (unsigned char *) (*(*l_element_courant).donnee).objet,
                   &longueur_ecriture)) == NULL)
           {
               (*ptr).erreur = d_es_allocation_memoire;
               close((*ptr).pipe_entree);
               pthread_exit(NULL);
           }
   
           while(write_atomic(s_etat_processus, (*ptr).pipe_entree, ligne,
                   (size_t) longueur_ecriture) != longueur_ecriture)
           {
               if (longueur_ecriture == -1)
               {
                   (*ptr).erreur = d_es_processus;
                   close((*ptr).pipe_entree);
                   pthread_exit(NULL);
               }
           }
   
           free(ligne);
   
           while(write_atomic(s_etat_processus, (*ptr).pipe_entree, "\n", 1)
                   != 1)
           {
               if (longueur_ecriture == -1)
               {
                   (*ptr).erreur = d_es_processus;
                   close((*ptr).pipe_entree);
                   pthread_exit(NULL);
               }
           }
   
           l_element_courant = (*l_element_courant).suivant;
       }
   
       if (close((*ptr).pipe_entree) != 0)
       {
           (*ptr).erreur = d_es_processus;
       }
       else
       {
           (*ptr).erreur = d_es;
       }
   
       pthread_exit(NULL);
   }
   
 void  void
 instruction_syseval(struct_processus *s_etat_processus)  instruction_syseval(struct_processus *s_etat_processus)
 {  {
Line 3383  instruction_syseval(struct_processus *s_ Line 3460  instruction_syseval(struct_processus *s_
     int                         pipes_sortie[2];      int                         pipes_sortie[2];
     int                         status;      int                         status;
   
     integer8                    longueur_ecriture;  
     integer8                    longueur_traitee;  
   
     logical1                    drapeau_fin;      logical1                    drapeau_fin;
     logical1                    presence_stdin;      logical1                    presence_stdin;
   
Line 3394  instruction_syseval(struct_processus *s_ Line 3468  instruction_syseval(struct_processus *s_
   
     pid_t                       pid;      pid_t                       pid;
   
       pthread_attr_t              attributs;
   
       pthread_t                   thread_stdin_tid;
   
     struct_liste_chainee        *l_element_courant;      struct_liste_chainee        *l_element_courant;
     struct_liste_chainee        *l_element_precedent;      struct_liste_chainee        *l_element_precedent;
     struct_liste_chainee        *l_element_stdin;      struct_liste_chainee        *l_element_stdin;
Line 3408  instruction_syseval(struct_processus *s_ Line 3486  instruction_syseval(struct_processus *s_
   
     struct timespec             attente;      struct timespec             attente;
   
     unsigned char               *ligne;  
     unsigned char               *ptr;      unsigned char               *ptr;
     unsigned char               *ptr2;      unsigned char               *ptr2;
     unsigned char               registre_autorisation_empilement_programme;      unsigned char               registre_autorisation_empilement_programme;
Line 3419  instruction_syseval(struct_processus *s_ Line 3496  instruction_syseval(struct_processus *s_
     integer8                    longueur_lecture;      integer8                    longueur_lecture;
     integer8                    longueur_lue;      integer8                    longueur_lue;
     integer8                    longueur_tampon;      integer8                    longueur_tampon;
       integer8                    longueur_traitee;
     integer8                    nombre_lignes;      integer8                    nombre_lignes;
     integer8                    pointeur;      integer8                    pointeur;
     integer8                    registre_position_courante;      integer8                    registre_position_courante;
Line 3896  instruction_syseval(struct_processus *s_ Line 3974  instruction_syseval(struct_processus *s_
   
             if (presence_stdin == d_vrai)              if (presence_stdin == d_vrai)
             {              {
                 l_element_courant = l_element_stdin;                  // L'écriture sur stdin est dans un thread séparé pour
                   // ne pas bloquer.
   
                 while(l_element_courant != NULL)                  if (pthread_attr_init(&attributs) != 0)
                 {                  {
                     if ((ligne = formateur_flux(s_etat_processus,                      (*s_etat_processus).erreur_systeme = d_es_processus;
                             (unsigned char *) (*(*l_element_courant).donnee)                      return;
                             .objet, &longueur_ecriture)) == NULL)                  }
                     {  
                         (*s_etat_processus).erreur_systeme =  
                                 d_es_allocation_memoire;  
                         return;  
                     }  
   
 #                   ifndef SEMAPHORES_NOMMES  
                         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;  
                         return;  
                     }  
   
                     while(write_atomic(s_etat_processus,  
                             pipes_entree[1], ligne,  
                             (size_t) longueur_ecriture) != longueur_ecriture)  
                     {  
 #                       ifndef SEMAPHORES_NOMMES  
                             while(sem_wait(&((*s_etat_processus)  
                                     .semaphore_fork)) != 0)  
 #                       else  
                             while(sem_wait((*s_etat_processus)  
                                     .semaphore_fork) != 0)  
 #                       endif  
                         {  
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_processus;  
                             return;  
                         }  
   
                         if (longueur_ecriture == -1)  
                         {  
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
   
 #                       ifndef SEMAPHORES_NOMMES  
                             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;  
                             return;  
                         }  
                     }  
   
                     free(ligne);  
   
                     while(write_atomic(s_etat_processus,  
                             pipes_entree[1], "\n", 1) != 1)  
                     {  
 #                       ifndef SEMAPHORES_NOMMES  
                             while(sem_wait(&((*s_etat_processus)  
                                     .semaphore_fork)) != 0)  
 #                       else  
                             while(sem_wait((*s_etat_processus)  
                                     .semaphore_fork) != 0)  
 #                       endif  
                         {  
                             if (errno != EINTR)  
                             {  
                                 (*s_etat_processus).erreur_systeme =  
                                         d_es_processus;  
                                 return;  
                             }  
                         }  
   
                         if (longueur_ecriture == -1)  
                         {  
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
   
 #                       ifndef SEMAPHORES_NOMMES                  if (pthread_attr_setdetachstate(&attributs, 
                             if (sem_post(&((*s_etat_processus)                          PTHREAD_CREATE_JOINABLE) != 0)
                                     .semaphore_fork)) != 0)                  {
 #                       else                      (*s_etat_processus).erreur_systeme = d_es_processus;
                             if (sem_post((*s_etat_processus)                      return;
                                     .semaphore_fork) != 0)                  }
 #                       endif  
                         {  
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
                     }  
   
 #                   ifndef SEMAPHORES_NOMMES                  arguments_stdin.s_etat_processus = s_etat_processus;
                         while(sem_wait(&((*s_etat_processus).semaphore_fork))                  arguments_stdin.stdin = l_element_stdin;
                                 != 0)                  arguments_stdin.pipe_entree = pipes_entree[1];
 #                   else  
                         while(sem_wait((*s_etat_processus).semaphore_fork) != 0)  
 #                   endif  
                     {  
                         if (errno != EINTR)  
                         {  
                             (*s_etat_processus).erreur_systeme = d_es_processus;  
                             return;  
                         }  
                     }  
   
                     l_element_courant = (*l_element_courant).suivant;                  if (pthread_create(&thread_stdin_tid, &attributs, thread_stdin,
                           &arguments_stdin) != 0)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_processus;
                       return;
                 }                  }
             }  
   
             if (close(pipes_entree[1]) != 0)                  if (pthread_attr_destroy(&attributs) != 0)
             {                  {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                      return;
                   }
             }              }
   
             longueur_lecture = 65536;              longueur_lecture = 65536;
Line 4091  instruction_syseval(struct_processus *s_ Line 4079  instruction_syseval(struct_processus *s_
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                      return;
                   }
               }
   
               if (presence_stdin == d_vrai)
               {
                   if (pthread_join(thread_stdin_tid, NULL) != 0)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_processus;
                       return;
                   }
   
                   if (arguments_stdin.erreur != d_es)
                   {
                       (*s_etat_processus).erreur_systeme = arguments_stdin.erreur;
                       return;
                   }
               }
               else
               {
                   if (close(pipes_entree[1]) != 0)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_processus;
                       return;
                 }                  }
             }              }
   

Removed from v.1.102  
changed lines
  Added in v.1.103


CVSweb interface <joel.bertrand@systella.fr>