Annotation of rpl/src/operations_atomiques.c, revision 1.71

1.1       bertrand    1: /*
                      2: ================================================================================
1.70      bertrand    3:   RPL/2 (R) version 4.1.31
1.69      bertrand    4:   Copyright (C) 1989-2019 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
1.12      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Procédure de lecture atomique
                     29: ================================================================================
                     30:   Entrée :
                     31: --------------------------------------------------------------------------------
                     32:   Sortie :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
1.12      bertrand   38: ssize_t
1.1       bertrand   39: read_atomic(struct_processus *s_etat_processus,
                     40:        int descripteur, void *tampon, size_t longueur_tampon)
                     41: {
                     42:    logical1            drapeau;
                     43: 
                     44:    size_t              longueur_residuelle;
                     45:    ssize_t             longueur_lue;
                     46: 
                     47:    struct timespec     attente;
                     48: 
                     49:    void                *pointeur;
                     50: 
                     51:    longueur_residuelle = longueur_tampon;
                     52:    pointeur = tampon;
                     53: 
                     54:    attente.tv_sec = 0;
                     55:    attente.tv_nsec = GRANULARITE_us * 1000;
                     56: 
                     57:    while(longueur_residuelle != 0)
                     58:    {
                     59:        errno = 0;
                     60:        longueur_lue = 0;
                     61: 
                     62:        while(longueur_lue == 0)
                     63:        {
                     64:            do
                     65:            {
                     66:                longueur_lue = read(descripteur, pointeur,
                     67:                        (longueur_residuelle > PIPE_BUF)
                     68:                        ? PIPE_BUF : longueur_residuelle);
                     69: 
                     70:                if ((longueur_lue == 0) &&
                     71:                        (longueur_tampon == longueur_residuelle))
                     72:                {
1.44      bertrand   73:                    return(((ssize_t) longueur_tampon) -
                     74:                            ((ssize_t) longueur_residuelle));
1.1       bertrand   75:                }
                     76: 
                     77:                if ((longueur_lue == -1) && (errno == EINTR))
                     78:                {
1.30      bertrand   79:                    scrutation_interruptions(s_etat_processus);
1.1       bertrand   80:                    nanosleep(&attente, NULL);
                     81:                    drapeau = d_vrai;
                     82:                }
                     83:                else
                     84:                {
                     85:                    drapeau = d_faux;
                     86:                }
                     87:            } while(drapeau == d_vrai);
                     88: 
                     89:            if (longueur_lue != 0)
                     90:            {
1.66      bertrand   91:                if (longueur_lue < (ssize_t) ((longueur_residuelle > PIPE_BUF)
                     92:                        ? PIPE_BUF : longueur_residuelle))
1.1       bertrand   93:                {
                     94:                    pointeur += longueur_lue;
1.44      bertrand   95:                    longueur_residuelle -= (size_t) longueur_lue;
1.1       bertrand   96: 
1.44      bertrand   97:                    return(((ssize_t) longueur_tampon) -
                     98:                            ((ssize_t) longueur_residuelle));
1.1       bertrand   99:                }
                    100:            }
                    101:        }
                    102: 
                    103:        pointeur += longueur_lue;
1.44      bertrand  104:        longueur_residuelle -= (size_t) longueur_lue;
1.1       bertrand  105:    }
                    106: 
1.44      bertrand  107:    return(((ssize_t) longueur_tampon) - ((ssize_t) longueur_residuelle));
1.1       bertrand  108: }
                    109: 
                    110: 
                    111: /*
                    112: ================================================================================
1.71    ! bertrand  113:   Procédure de lecture atomique interruptible par var_volatile_requete_arret
        !           114: ================================================================================
        !           115:   Entrée :
        !           116: --------------------------------------------------------------------------------
        !           117:   Sortie :
        !           118: --------------------------------------------------------------------------------
        !           119:   Effets de bord : néant
        !           120: ================================================================================
        !           121: */
        !           122: 
        !           123: ssize_t
        !           124: read_atomic_signal(struct_processus *s_etat_processus,
        !           125:        int descripteur, void *tampon, size_t longueur_tampon)
        !           126: {
        !           127:    logical1            drapeau;
        !           128: 
        !           129:    size_t              longueur_residuelle;
        !           130:    ssize_t             longueur_lue;
        !           131: 
        !           132:    struct timespec     attente;
        !           133: 
        !           134:    void                *pointeur;
        !           135: 
        !           136:    longueur_residuelle = longueur_tampon;
        !           137:    pointeur = tampon;
        !           138: 
        !           139:    attente.tv_sec = 0;
        !           140:    attente.tv_nsec = GRANULARITE_us * 1000;
        !           141: 
        !           142:    while(longueur_residuelle != 0)
        !           143:    {
        !           144:        errno = 0;
        !           145:        longueur_lue = 0;
        !           146: 
        !           147:        while(longueur_lue == 0)
        !           148:        {
        !           149:            do
        !           150:            {
        !           151:                longueur_lue = read(descripteur, pointeur,
        !           152:                        (longueur_residuelle > PIPE_BUF)
        !           153:                        ? PIPE_BUF : longueur_residuelle);
        !           154: 
        !           155:                if (((longueur_lue == 0) &&
        !           156:                        (longueur_tampon == longueur_residuelle)) ||
        !           157:                        ((*s_etat_processus).var_volatile_requete_arret == -1))
        !           158:                {
        !           159:                    return(((ssize_t) longueur_tampon) -
        !           160:                            ((ssize_t) longueur_residuelle));
        !           161:                }
        !           162: 
        !           163:                if ((longueur_lue == -1) && (errno == EINTR))
        !           164:                {
        !           165:                    scrutation_interruptions(s_etat_processus);
        !           166:                    nanosleep(&attente, NULL);
        !           167:                    drapeau = d_vrai;
        !           168:                }
        !           169:                else
        !           170:                {
        !           171:                    drapeau = d_faux;
        !           172:                }
        !           173:            } while(drapeau == d_vrai);
        !           174: 
        !           175:            if (longueur_lue != 0)
        !           176:            {
        !           177:                if (longueur_lue < (ssize_t) ((longueur_residuelle > PIPE_BUF)
        !           178:                        ? PIPE_BUF : longueur_residuelle))
        !           179:                {
        !           180:                    pointeur += longueur_lue;
        !           181:                    longueur_residuelle -= (size_t) longueur_lue;
        !           182: 
        !           183:                    return(((ssize_t) longueur_tampon) -
        !           184:                            ((ssize_t) longueur_residuelle));
        !           185:                }
        !           186:            }
        !           187:        }
        !           188: 
        !           189:        pointeur += longueur_lue;
        !           190:        longueur_residuelle -= (size_t) longueur_lue;
        !           191:    }
        !           192: 
        !           193:    return(((ssize_t) longueur_tampon) - ((ssize_t) longueur_residuelle));
        !           194: }
        !           195: 
        !           196: 
        !           197: /*
        !           198: ================================================================================
1.1       bertrand  199:   Procédure d'écriture atomique
                    200: ================================================================================
                    201:   Entrée :
                    202: --------------------------------------------------------------------------------
                    203:   Sortie :
                    204: --------------------------------------------------------------------------------
                    205:   Effets de bord : néant
                    206: ================================================================================
                    207: */
                    208: 
1.12      bertrand  209: ssize_t
1.1       bertrand  210: write_atomic(struct_processus *s_etat_processus,
                    211:        int descripteur, void *tampon, size_t longueur_tampon)
                    212: {
                    213:    logical1            drapeau;
                    214: 
                    215:    size_t              longueur_residuelle;
                    216:    ssize_t             longueur_ecrite;
                    217: 
                    218:    struct timespec     attente;
                    219: 
                    220:    void                *pointeur;
                    221: 
                    222:    longueur_residuelle = longueur_tampon;
                    223:    pointeur = tampon;
                    224: 
                    225:    attente.tv_sec = 0;
                    226:    attente.tv_nsec = GRANULARITE_us * 1000;
                    227: 
                    228:    while(longueur_residuelle != 0)
                    229:    {
                    230:        errno = 0;
                    231:        longueur_ecrite = 0;
                    232: 
                    233:        while(longueur_ecrite == 0)
                    234:        {
                    235:            do
                    236:            {
                    237:                longueur_ecrite = write(descripteur, pointeur,
                    238:                        (longueur_residuelle > PIPE_BUF)
                    239:                        ? PIPE_BUF : longueur_residuelle);
                    240: 
                    241:                if (longueur_ecrite == -1)
                    242:                {
                    243:                    if (errno == EINTR)
                    244:                    {
1.30      bertrand  245:                        scrutation_interruptions(s_etat_processus);
1.1       bertrand  246:                        nanosleep(&attente, NULL);
                    247:                        drapeau = d_vrai;
                    248:                    }
                    249:                    else // EPIPE
                    250:                    {
                    251:                        return(-1);
                    252:                    }
                    253:                }
                    254:                else
                    255:                {
                    256:                    drapeau = d_faux;
                    257:                }
                    258:            } while(drapeau == d_vrai);
                    259: 
                    260:            if (longueur_ecrite == 0)
                    261:            {
1.30      bertrand  262:                scrutation_interruptions(s_etat_processus);
1.1       bertrand  263:                nanosleep(&attente, NULL);
                    264:            }
                    265:        }
                    266: 
                    267:        pointeur += longueur_ecrite;
1.44      bertrand  268:        longueur_residuelle -= (size_t) longueur_ecrite;
1.1       bertrand  269:    }
                    270: 
1.44      bertrand  271:    return((ssize_t) longueur_tampon);
1.1       bertrand  272: }
                    273: 
                    274: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>