--- rpl/src/operations_atomiques.c 2010/03/04 10:17:54 1.4 +++ rpl/src/operations_atomiques.c 2024/01/09 07:33:55 1.78 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -35,7 +35,7 @@ ================================================================================ */ -inline ssize_t +ssize_t read_atomic(struct_processus *s_etat_processus, int descripteur, void *tampon, size_t longueur_tampon) { @@ -70,11 +70,13 @@ read_atomic(struct_processus *s_etat_pro if ((longueur_lue == 0) && (longueur_tampon == longueur_residuelle)) { - return(longueur_tampon - longueur_residuelle); + 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; } @@ -86,22 +88,121 @@ read_atomic(struct_processus *s_etat_pro if (longueur_lue != 0) { - if (longueur_lue < (longueur_residuelle > PIPE_BUF) - ? PIPE_BUF : longueur_residuelle) + if (longueur_lue < (ssize_t) ((longueur_residuelle > PIPE_BUF) + ? PIPE_BUF : longueur_residuelle)) { 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; - 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)); } @@ -117,7 +218,7 @@ read_atomic(struct_processus *s_etat_pro ================================================================================ */ -inline ssize_t +ssize_t write_atomic(struct_processus *s_etat_processus, int descripteur, void *tampon, size_t longueur_tampon) { @@ -153,6 +254,7 @@ write_atomic(struct_processus *s_etat_pr { if (errno == EINTR) { + scrutation_interruptions(s_etat_processus); nanosleep(&attente, NULL); drapeau = d_vrai; } @@ -169,15 +271,16 @@ write_atomic(struct_processus *s_etat_pr if (longueur_ecrite == 0) { + scrutation_interruptions(s_etat_processus); nanosleep(&attente, NULL); } } pointeur += longueur_ecrite; - longueur_residuelle -= longueur_ecrite; + longueur_residuelle -= (size_t) longueur_ecrite; } - return(longueur_tampon); + return((ssize_t) longueur_tampon); } // vim: ts=4