version 1.5, 2010/03/17 14:14:36
|
version 1.80, 2025/04/15 10:17:56
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.13 |
RPL/2 (R) version 4.1.36 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2025 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 35
|
Line 35
|
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
inline ssize_t |
ssize_t |
read_atomic(struct_processus *s_etat_processus, |
read_atomic(struct_processus *s_etat_processus, |
int descripteur, void *tampon, size_t longueur_tampon) |
int descripteur, void *tampon, size_t longueur_tampon) |
{ |
{ |
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 117 read_atomic(struct_processus *s_etat_pro
|
Line 218 read_atomic(struct_processus *s_etat_pro
|
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
inline ssize_t |
ssize_t |
write_atomic(struct_processus *s_etat_processus, |
write_atomic(struct_processus *s_etat_processus, |
int descripteur, void *tampon, size_t longueur_tampon) |
int descripteur, void *tampon, size_t longueur_tampon) |
{ |
{ |
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 |