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

1.1       bertrand    1: /*
                      2: ================================================================================
1.15      bertrand    3:   RPL/2 (R) version 4.0.20
1.1       bertrand    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
                      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:                {
                     73:                    return(longueur_tampon - longueur_residuelle);
                     74:                }
                     75: 
                     76:                if ((longueur_lue == -1) && (errno == EINTR))
                     77:                {
                     78:                    nanosleep(&attente, NULL);
                     79:                    drapeau = d_vrai;
                     80:                }
                     81:                else
                     82:                {
                     83:                    drapeau = d_faux;
                     84:                }
                     85:            } while(drapeau == d_vrai);
                     86: 
                     87:            if (longueur_lue != 0)
                     88:            {
                     89:                if (longueur_lue < (longueur_residuelle > PIPE_BUF)
                     90:                        ? PIPE_BUF : longueur_residuelle)
                     91:                {
                     92:                    pointeur += longueur_lue;
                     93:                    longueur_residuelle -= longueur_lue;
                     94: 
                     95:                    return(longueur_tampon - longueur_residuelle);
                     96:                }
                     97:            }
                     98:        }
                     99: 
                    100:        pointeur += longueur_lue;
                    101:        longueur_residuelle -= longueur_lue;
                    102:    }
                    103: 
                    104:    return(longueur_tampon - longueur_residuelle);
                    105: }
                    106: 
                    107: 
                    108: /*
                    109: ================================================================================
                    110:   Procédure d'écriture atomique
                    111: ================================================================================
                    112:   Entrée :
                    113: --------------------------------------------------------------------------------
                    114:   Sortie :
                    115: --------------------------------------------------------------------------------
                    116:   Effets de bord : néant
                    117: ================================================================================
                    118: */
                    119: 
1.12      bertrand  120: ssize_t
1.1       bertrand  121: write_atomic(struct_processus *s_etat_processus,
                    122:        int descripteur, void *tampon, size_t longueur_tampon)
                    123: {
                    124:    logical1            drapeau;
                    125: 
                    126:    size_t              longueur_residuelle;
                    127:    ssize_t             longueur_ecrite;
                    128: 
                    129:    struct timespec     attente;
                    130: 
                    131:    void                *pointeur;
                    132: 
                    133:    longueur_residuelle = longueur_tampon;
                    134:    pointeur = tampon;
                    135: 
                    136:    attente.tv_sec = 0;
                    137:    attente.tv_nsec = GRANULARITE_us * 1000;
                    138: 
                    139:    while(longueur_residuelle != 0)
                    140:    {
                    141:        errno = 0;
                    142:        longueur_ecrite = 0;
                    143: 
                    144:        while(longueur_ecrite == 0)
                    145:        {
                    146:            do
                    147:            {
                    148:                longueur_ecrite = write(descripteur, pointeur,
                    149:                        (longueur_residuelle > PIPE_BUF)
                    150:                        ? PIPE_BUF : longueur_residuelle);
                    151: 
                    152:                if (longueur_ecrite == -1)
                    153:                {
                    154:                    if (errno == EINTR)
                    155:                    {
                    156:                        nanosleep(&attente, NULL);
                    157:                        drapeau = d_vrai;
                    158:                    }
                    159:                    else // EPIPE
                    160:                    {
                    161:                        return(-1);
                    162:                    }
                    163:                }
                    164:                else
                    165:                {
                    166:                    drapeau = d_faux;
                    167:                }
                    168:            } while(drapeau == d_vrai);
                    169: 
                    170:            if (longueur_ecrite == 0)
                    171:            {
                    172:                nanosleep(&attente, NULL);
                    173:            }
                    174:        }
                    175: 
                    176:        pointeur += longueur_ecrite;
                    177:        longueur_residuelle -= longueur_ecrite;
                    178:    }
                    179: 
                    180:    return(longueur_tampon);
                    181: }
                    182: 
                    183: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>