Diff for /rpl/src/operations_atomiques.c between versions 1.19 and 1.72

version 1.19, 2011/04/11 12:10:12 version 1.72, 2019/10/31 09:54:32
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.0.prerelease.0    RPL/2 (R) version 4.1.31
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2019 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 70  read_atomic(struct_processus *s_etat_pro Line 70  read_atomic(struct_processus *s_etat_pro
                 if ((longueur_lue == 0) &&                  if ((longueur_lue == 0) &&
                         (longueur_tampon == longueur_residuelle))                          (longueur_tampon == longueur_residuelle))
                 {                  {
                     return(longueur_tampon - longueur_residuelle);                      return(((ssize_t) longueur_tampon) -
                               ((ssize_t) longueur_residuelle));
                 }                  }
   
                 if ((longueur_lue == -1) && (errno == EINTR))                  if ((longueur_lue == -1) && (errno == EINTR))
                 {                  {
                       scrutation_interruptions(s_etat_processus);
                     nanosleep(&attente, NULL);                      nanosleep(&attente, NULL);
                     drapeau = d_vrai;                      drapeau = d_vrai;
                 }                  }
Line 86  read_atomic(struct_processus *s_etat_pro Line 88  read_atomic(struct_processus *s_etat_pro
   
             if (longueur_lue != 0)              if (longueur_lue != 0)
             {              {
                 if (longueur_lue < (longueur_residuelle > PIPE_BUF)                  if (longueur_lue < (ssize_t) ((longueur_residuelle > PIPE_BUF)
                         ? PIPE_BUF : longueur_residuelle)                          ? PIPE_BUF : longueur_residuelle))
                 {                  {
                     pointeur += longueur_lue;                      pointeur += longueur_lue;
                     longueur_residuelle -= longueur_lue;                      longueur_residuelle -= (size_t) longueur_lue;
   
                     return(longueur_tampon - longueur_residuelle);                      return(((ssize_t) longueur_tampon) -
                               ((ssize_t) longueur_residuelle));
                 }                  }
             }              }
         }          }
   
         pointeur += longueur_lue;          pointeur += longueur_lue;
         longueur_residuelle -= longueur_lue;          longueur_residuelle -= (size_t) longueur_lue;
     }      }
   
     return(longueur_tampon - longueur_residuelle);      return(((ssize_t) longueur_tampon) - ((ssize_t) longueur_residuelle));
   }
   
   
   /*
   ================================================================================
     Procédure de lecture atomique interruptible par var_volatile_requete_arret
   ================================================================================
     Entrée :
   --------------------------------------------------------------------------------
     Sortie :
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   ssize_t
   read_atomic_signal(struct_processus *s_etat_processus,
           int descripteur, void *tampon, size_t longueur_tampon)
   {
       logical1            drapeau;
   
       size_t              longueur_residuelle;
       ssize_t             longueur_lue;
   
       struct timespec     attente;
   
       void                *pointeur;
   
       longueur_residuelle = longueur_tampon;
       pointeur = tampon;
   
       attente.tv_sec = 0;
       attente.tv_nsec = GRANULARITE_us * 1000;
   
       while(longueur_residuelle != 0)
       {
           errno = 0;
           longueur_lue = 0;
   
           while(longueur_lue == 0)
           {
               do
               {
                   longueur_lue = read(descripteur, pointeur,
                           (longueur_residuelle > PIPE_BUF)
                           ? PIPE_BUF : longueur_residuelle);
   
                   // Traitement des signaux en attente nécessaire
                   // au positionnement de la variable
                   // (*s_etat_processus).var_volatile_requete_arret
                   // qui se fait dans un thread séparé.
   
                   while((*s_queue_signaux).pointeur_ecriture !=
                           (*s_queue_signaux).pointeur_lecture)
                   {
                       scrutation_interruptions(s_etat_processus);
                       nanosleep(&attente, NULL);
                   }
   
                   if (((longueur_lue == 0) &&
                           (longueur_tampon == longueur_residuelle)) ||
                           ((*s_etat_processus).var_volatile_requete_arret == -1))
                   {
                       return(((ssize_t) longueur_tampon) -
                               ((ssize_t) longueur_residuelle));
                   }
   
                   if ((longueur_lue == -1) && (errno == EINTR))
                   {
                       scrutation_interruptions(s_etat_processus);
                       nanosleep(&attente, NULL);
                       drapeau = d_vrai;
                   }
                   else
                   {
                       drapeau = d_faux;
                   }
               } while(drapeau == d_vrai);
   
               if (longueur_lue != 0)
               {
                   if (longueur_lue < (ssize_t) ((longueur_residuelle > PIPE_BUF)
                           ? PIPE_BUF : longueur_residuelle))
                   {
                       pointeur += longueur_lue;
                       longueur_residuelle -= (size_t) longueur_lue;
   
                       return(((ssize_t) longueur_tampon) -
                               ((ssize_t) longueur_residuelle));
                   }
               }
           }
   
           pointeur += longueur_lue;
           longueur_residuelle -= (size_t) longueur_lue;
       }
   
       return(((ssize_t) longueur_tampon) - ((ssize_t) longueur_residuelle));
 }  }
   
   
Line 153  write_atomic(struct_processus *s_etat_pr Line 254  write_atomic(struct_processus *s_etat_pr
                 {                  {
                     if (errno == EINTR)                      if (errno == EINTR)
                     {                      {
                           scrutation_interruptions(s_etat_processus);
                         nanosleep(&attente, NULL);                          nanosleep(&attente, NULL);
                         drapeau = d_vrai;                          drapeau = d_vrai;
                     }                      }
Line 169  write_atomic(struct_processus *s_etat_pr Line 271  write_atomic(struct_processus *s_etat_pr
   
             if (longueur_ecrite == 0)              if (longueur_ecrite == 0)
             {              {
                   scrutation_interruptions(s_etat_processus);
                 nanosleep(&attente, NULL);                  nanosleep(&attente, NULL);
             }              }
         }          }
   
         pointeur += longueur_ecrite;          pointeur += longueur_ecrite;
         longueur_residuelle -= longueur_ecrite;          longueur_residuelle -= (size_t) longueur_ecrite;
     }      }
   
     return(longueur_tampon);      return((ssize_t) longueur_tampon);
 }  }
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.19  
changed lines
  Added in v.1.72


CVSweb interface <joel.bertrand@systella.fr>