Diff for /rpl/src/instructions_s1.c between versions 1.100 and 1.105

version 1.100, 2019/02/09 13:36:40 version 1.105, 2019/02/28 12:40:38
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    *fd_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).fd_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 3406  instruction_syseval(struct_processus *s_ Line 3484  instruction_syseval(struct_processus *s_
     struct sigaction            action_courante;      struct sigaction            action_courante;
     struct sigaction            action_passee;      struct sigaction            action_passee;
   
     unsigned char               *ligne;      struct timespec             attente;
   
     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 3417  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 3671  instruction_syseval(struct_processus *s_ Line 3751  instruction_syseval(struct_processus *s_
   
         fflush(NULL);          fflush(NULL);
   
         verrouillage_threads_concurrents(s_etat_processus);          attente.tv_sec = 0;
           attente.tv_nsec = GRANULARITE_us * 1000;
   
           while(pthread_mutex_trylock(&mutex_sigaction) != 0)
           {
   #           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;
               }
   
               nanosleep(&attente, NULL);
               INCR_GRANULARITE(attente.tv_nsec);
   
   #           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;
               }
           }
   
         action_courante.sa_handler = SIG_IGN;          action_courante.sa_handler = SIG_IGN;
         action_courante.sa_flags = 0;          action_courante.sa_flags = 0;
Line 3690  instruction_syseval(struct_processus *s_ Line 3797  instruction_syseval(struct_processus *s_
             return;              return;
         }          }
   
           verrouillage_threads_concurrents(s_etat_processus);
   
         pid = fork();          pid = fork();
   
         if (pid < 0)          if (pid < 0)
Line 3740  instruction_syseval(struct_processus *s_ Line 3849  instruction_syseval(struct_processus *s_
             if (close(pipes_entree[1]) != 0)              if (close(pipes_entree[1]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (close(pipes_sortie[0]) != 0)              if (close(pipes_sortie[0]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (close(pipes_erreur[0]) != 0)              if (close(pipes_erreur[0]) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  printf("%d\n",__LINE__);
             }              }
   
             if (pipes_entree[0] != STDIN_FILENO)              if (pipes_entree[0] != STDIN_FILENO)
Line 3760  instruction_syseval(struct_processus *s_ Line 3869  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_entree[0], STDIN_FILENO) == -1)                  if (dup2(pipes_entree[0], STDIN_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                  printf("%d\n",__LINE__);
                 }                  }
             }              }
   
Line 3769  instruction_syseval(struct_processus *s_ Line 3878  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1)                  if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                  printf("%d\n",__LINE__);
                 }                  }
             }              }
   
Line 3778  instruction_syseval(struct_processus *s_ Line 3887  instruction_syseval(struct_processus *s_
                 if (dup2(pipes_sortie[1], STDERR_FILENO) == -1)                  if (dup2(pipes_sortie[1], STDERR_FILENO) == -1)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_processus;                      (*s_etat_processus).erreur_systeme = d_es_processus;
                     return;                  printf("%d\n",__LINE__);
                 }                  }
             }              }
   
             if (nombre_arguments != 0)              if ((nombre_arguments != 0) && ((*s_etat_processus).erreur_systeme
                       == d_es))
             {              {
                 execvp(arguments[0], arguments);                  execvp(arguments[0], arguments);
             }              }
             else  
             {  
                 exit(EXIT_SUCCESS);  
             }  
   
             /*              /*
              * L'appel système execvp() a généré une erreur et n'a pu exécuter               * L'appel système execvp() a généré une erreur et n'a pu exécuter
Line 3818  instruction_syseval(struct_processus *s_ Line 3924  instruction_syseval(struct_processus *s_
             write_atomic(s_etat_processus, pipes_erreur[1], " ", 1);              write_atomic(s_etat_processus, pipes_erreur[1], " ", 1);
             close(pipes_erreur[1]);              close(pipes_erreur[1]);
   
               if ((*s_etat_processus).langue == 'F')
               {
                   printf("+++Système : erreurinterne dans SYSEVAL [%d]\n",
                           (int) getpid());
               }
               else
               {
                   printf("+++System : SYSEVAL internal error [%d]\n",
                           (int) getpid());
               }
   
             exit(EXIT_SUCCESS);              exit(EXIT_SUCCESS);
         }          }
         else          else
Line 3837  instruction_syseval(struct_processus *s_ Line 3954  instruction_syseval(struct_processus *s_
                 return;                  return;
             }              }
   
               if (pthread_mutex_unlock(&mutex_sigaction) != 0)
               {
                   (*s_etat_processus).erreur_systeme = d_es_processus;
                   return;
               }
   
             deverrouillage_threads_concurrents(s_etat_processus);              deverrouillage_threads_concurrents(s_etat_processus);
   
             if (close(pipes_entree[0]) != 0)              if (close(pipes_entree[0]) != 0)
Line 3859  instruction_syseval(struct_processus *s_ Line 3982  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.fd_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 4054  instruction_syseval(struct_processus *s_ Line 4087  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.100  
changed lines
  Added in v.1.105


CVSweb interface <joel.bertrand@systella.fr>