Diff for /rpl/src/instructions_s8.c between versions 1.2 and 1.36

version 1.2, 2010/01/27 22:22:16 version 1.36, 2011/09/20 08:56:24
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.10    RPL/2 (R) version 4.1.3
   Copyright (C) 1989-2010 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 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 257  instruction_send(struct_processus *s_eta Line 257  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_objets_attente,                  (*s_etat_processus).pipe_nombre_objets_attente,
                 &pid, sizeof(pid))) != sizeof(pid))                  &pid, sizeof(pid))) != sizeof(pid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 280  instruction_send(struct_processus *s_eta Line 277  instruction_send(struct_processus *s_eta
             nanosleep(&attente, NULL);              nanosleep(&attente, NULL);
             INCR_GRANULARITE(attente.tv_nsec);              INCR_GRANULARITE(attente.tv_nsec);
   
             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;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         pid = getpid();          pid = getpid();
Line 296  instruction_send(struct_processus *s_eta Line 296  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_objets_attente,                  (*s_etat_processus).pipe_nombre_objets_attente,
                 &pid, sizeof(pid))) != sizeof(pid))                  &pid, sizeof(pid))) != sizeof(pid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 324  instruction_send(struct_processus *s_eta Line 321  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
     }      }
     else      else
Line 362  instruction_send(struct_processus *s_eta Line 358  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_objets_attente,                  (*s_etat_processus).pipe_nombre_objets_attente,
                 &tid, sizeof(tid))) != sizeof(tid))                  &tid, sizeof(tid))) != sizeof(tid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 390  instruction_send(struct_processus *s_eta Line 383  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         tid = pthread_self();          tid = pthread_self();
Line 401  instruction_send(struct_processus *s_eta Line 396  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_objets_attente,                  (*s_etat_processus).pipe_nombre_objets_attente,
                 &tid, sizeof(tid))) != sizeof(tid))                  &tid, sizeof(tid))) != sizeof(tid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 429  instruction_send(struct_processus *s_eta Line 421  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
     }      }
   
Line 455  instruction_send(struct_processus *s_eta Line 446  instruction_send(struct_processus *s_eta
     while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,      while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
             &tampon, sizeof(unsigned char)) != sizeof(unsigned char))              &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
     {      {
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
   
         nanosleep(&attente, NULL);          nanosleep(&attente, NULL);
Line 472  instruction_send(struct_processus *s_eta Line 460  instruction_send(struct_processus *s_eta
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
   
           scrutation_interruptions(s_etat_processus);
     }      }
   
     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)      if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
     {      {
         if (errno != EINTR)          (*s_etat_processus).erreur_systeme = d_es_processus;
         {          return;
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return;  
         }  
     }      }
   
     // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread      // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
Line 503  instruction_send(struct_processus *s_eta Line 490  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_interruptions_attente,                  (*s_etat_processus).pipe_nombre_interruptions_attente,
                 &pid, sizeof(pid))) != sizeof(pid))                  &pid, sizeof(pid))) != sizeof(pid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 533  instruction_send(struct_processus *s_eta Line 517  instruction_send(struct_processus *s_eta
             }              }
         }          }
   
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
   
           scrutation_interruptions(s_etat_processus);
     }      }
     else      else
     {      {
Line 559  instruction_send(struct_processus *s_eta Line 542  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).pipe_nombre_interruptions_attente,                  (*s_etat_processus).pipe_nombre_interruptions_attente,
                 &tid, sizeof(tid))) != sizeof(tid))                  &tid, sizeof(tid))) != sizeof(tid))
         {          {
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             if (longueur_ecriture == -1)              if (longueur_ecriture == -1)
Line 587  instruction_send(struct_processus *s_eta Line 567  instruction_send(struct_processus *s_eta
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               scrutation_interruptions(s_etat_processus);
         }          }
   
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
     }      }
   
Line 610  instruction_send(struct_processus *s_eta Line 589  instruction_send(struct_processus *s_eta
     if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,      if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
             s_objet) == d_erreur)              s_objet) == d_erreur)
     {      {
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)          if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
         {          {
             if (errno != EINTR)              (*s_etat_processus).erreur_systeme = d_es_processus;
             {              return;
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }          }
   
         if ((*s_etat_processus).profilage == d_vrai)          if ((*s_etat_processus).profilage == d_vrai)
Line 628  instruction_send(struct_processus *s_eta Line 604  instruction_send(struct_processus *s_eta
         return;          return;
     }      }
   
     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)      if (sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
     {      {
         if (errno != EINTR)          (*s_etat_processus).erreur_systeme = d_es_processus;
         {          return;
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return;  
         }  
     }      }
   
     if ((*s_etat_processus).profilage == d_vrai)      if ((*s_etat_processus).profilage == d_vrai)
Line 1330  instruction_stop(struct_processus *s_eta Line 1303  instruction_stop(struct_processus *s_eta
   
     struct_objet                *s_objet;      struct_objet                *s_objet;
   
     struct timespec             attente;  
   
     attente.tv_sec = 0;  
     attente.tv_nsec = GRANULARITE_us * 1000;  
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
     if ((*s_etat_processus).affichage_arguments == 'Y')      if ((*s_etat_processus).affichage_arguments == 'Y')
Line 1380  instruction_stop(struct_processus *s_eta Line 1348  instruction_stop(struct_processus *s_eta
         if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)          if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                 .processus_detache == d_vrai)                  .processus_detache == d_vrai)
         {          {
             kill((*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid,              envoi_signal_processus((*(*((struct_processus_fils *)
                     SIGFSTOP);                      (*s_objet).objet)).thread).pid, rpl_sigstop);
         }          }
         else          else
         {          {
Line 1400  instruction_stop(struct_processus *s_eta Line 1368  instruction_stop(struct_processus *s_eta
                         .donnee).objet)).thread).processus_detache == d_faux)                          .donnee).objet)).thread).processus_detache == d_faux)
                 {                  {
                     if ((pthread_equal((*(*((struct_processus_fils *)                      if ((pthread_equal((*(*((struct_processus_fils *)
                             (*(*l_element_courant).donnee).objet)).thread).pid,                              (*(*l_element_courant).donnee).objet)).thread).tid,
                             (*(*((struct_processus_fils *)                              (*(*((struct_processus_fils *)
                             (*s_objet).objet)).thread).tid) != 0) &&                              (*s_objet).objet)).thread).tid) != 0) &&
                             ((*(*((struct_processus_fils *)                              ((*(*((struct_processus_fils *)
Line 1441  instruction_stop(struct_processus *s_eta Line 1409  instruction_stop(struct_processus *s_eta
                     if ((*(*((struct_processus_fils *)                      if ((*(*((struct_processus_fils *)
                             (*s_objet).objet)).thread).thread_actif == d_vrai)                              (*s_objet).objet)).thread).thread_actif == d_vrai)
                     {                      {
                         pthread_kill((*(*((struct_processus_fils *)                          envoi_signal_thread((*(*((struct_processus_fils *)
                                 (*s_objet).objet)).thread).tid, SIGFSTOP);                                  (*s_objet).objet)).thread).tid, rpl_sigstop);
                     }                      }
   
                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)                      if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)

Removed from v.1.2  
changed lines
  Added in v.1.36


CVSweb interface <joel.bertrand@systella.fr>