Diff for /rpl/src/operations_atomiques.c between versions 1.70 and 1.71

version 1.70, 2019/02/03 14:41:26 version 1.71, 2019/05/16 12:03:01
Line 110  read_atomic(struct_processus *s_etat_pro Line 110  read_atomic(struct_processus *s_etat_pro
   
 /*  /*
 ================================================================================  ================================================================================
     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);
   
                   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));
   }
   
   
   /*
   ================================================================================
   Procédure d'écriture atomique    Procédure d'écriture atomique
 ================================================================================  ================================================================================
   Entrée :    Entrée :

Removed from v.1.70  
changed lines
  Added in v.1.71


CVSweb interface <joel.bertrand@systella.fr>