Annotation of rpl/src/allocateur.c, revision 1.1

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.1.20
        !             4:   Copyright (C) 1989-2015 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: 
        !            23: #include "rpl-conv.h"
        !            24: 
        !            25: 
        !            26: static size_t                  tailles[] =
        !            27:        { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        !            28:        11, 12, 13, 14, 15, 16, 24, 32, 48, 64,
        !            29:        96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048,
        !            30:        3072, 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536,
        !            31:        0 };
        !            32: static int                     longueur_tailles = 0;
        !            33: 
        !            34: 
        !            35: /*
        !            36: ================================================================================
        !            37:   Recherche de la longueur optimale du buffer
        !            38: ================================================================================
        !            39:   Entrée : longueur du buffer à allouer
        !            40: --------------------------------------------------------------------------------
        !            41:   Sortie : indice de la liste candidate, -1 si aucune liste
        !            42: --------------------------------------------------------------------------------
        !            43:   Effets de bord : néant
        !            44: ================================================================================
        !            45: */
        !            46: 
        !            47: static int
        !            48: recherche_longueur_buffer_optimale(integer8 longueur)
        !            49: {
        !            50:    int         a;
        !            51:    int         b;
        !            52:    int         m;
        !            53: 
        !            54:    a = 0;
        !            55:    b = longueur_tailles - 1;
        !            56: 
        !            57:    if (longueur > ((integer8) tailles[b]))
        !            58:    {
        !            59:        return(-1);
        !            60:    }
        !            61: 
        !            62:    while((b - a) > 1)
        !            63:    {
        !            64:        m = (a + b) / 2;
        !            65: 
        !            66:        if (longueur <= ((integer8) tailles[m]))
        !            67:        {
        !            68:            b = m;
        !            69:        }
        !            70:        else
        !            71:        {
        !            72:            a = m;
        !            73:        }
        !            74:    }
        !            75: 
        !            76:    return(b);
        !            77: }
        !            78: 
        !            79: 
        !            80: /*
        !            81: ================================================================================
        !            82:   Allocateur de mémoire fonctionnant avec un cache
        !            83: ================================================================================
        !            84:   Entrée : longueur du buffer à allouer
        !            85: --------------------------------------------------------------------------------
        !            86:   Sortie : pointeur sur une structure struct_buffer (ou NULL)
        !            87: --------------------------------------------------------------------------------
        !            88:   Effets de bord : néant
        !            89: ================================================================================
        !            90: */
        !            91: 
        !            92: void
        !            93: initialisation_allocateur_buffer(struct_processus *s_etat_processus)
        !            94: {
        !            95:    int         i;
        !            96: 
        !            97:    if (longueur_tailles == 0)
        !            98:    {
        !            99:        while(tailles[longueur_tailles] != 0)
        !           100:        {
        !           101:            longueur_tailles++;
        !           102:        }
        !           103: 
        !           104:        if (((*s_etat_processus).cache_buffer = malloc(((size_t)
        !           105:                longueur_tailles) * sizeof(unsigned char **))) == NULL)
        !           106:        {
        !           107:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           108:            return;
        !           109:        }
        !           110: 
        !           111:        if (((*s_etat_processus).pointeur_cache_buffer = malloc(((size_t)
        !           112:                longueur_tailles) * sizeof(int))) == NULL)
        !           113:        {
        !           114:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           115:            return;
        !           116:        }
        !           117: 
        !           118:        for(i = 0; i < longueur_tailles; i++)
        !           119:        {
        !           120:            if (((*s_etat_processus).cache_buffer[i] =
        !           121:                    malloc(TAILLE_CACHE * sizeof(unsigned char *))) == NULL)
        !           122:            {
        !           123:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           124:                return;
        !           125:            }
        !           126: 
        !           127:            (*s_etat_processus).pointeur_cache_buffer[i] = 0;
        !           128:        }
        !           129:    }
        !           130: 
        !           131:    return;
        !           132: }
        !           133: 
        !           134: 
        !           135: void
        !           136: liberation_allocateur_buffer(struct_processus *s_etat_processus)
        !           137: {
        !           138:    int                         i;
        !           139:    int                         j;
        !           140: 
        !           141:    for(i = 0; i < longueur_tailles; i++)
        !           142:    {
        !           143:        for(j = 0; j < (*s_etat_processus).pointeur_cache_buffer[i]; j++)
        !           144:        {
        !           145:            free((*s_etat_processus).cache_buffer[i][j]);
        !           146:        }
        !           147: 
        !           148:        free((*s_etat_processus).cache_buffer[i]);
        !           149:    }
        !           150: 
        !           151:    free((*s_etat_processus).cache_buffer);
        !           152:    return;
        !           153: }
        !           154: 
        !           155: 
        !           156: static inline struct_buffer *
        !           157: allocation_enveloppe_buffer(struct_processus *s_etat_processus)
        !           158: {
        !           159:    struct_buffer           *s_buffer;
        !           160: 
        !           161:    if ((*s_etat_processus).pointeur_enveloppes_buffers > 0)
        !           162:    {
        !           163:        s_buffer = (*s_etat_processus).enveloppes_buffers
        !           164:                [--(*s_etat_processus).pointeur_enveloppes_buffers];
        !           165:    }
        !           166:    else
        !           167:    {
        !           168:        if ((s_buffer = malloc(sizeof(struct_buffer))) == NULL)
        !           169:        {
        !           170:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           171:            return(NULL);
        !           172:        }
        !           173:    }
        !           174: 
        !           175:    return(NULL);
        !           176: }
        !           177: 
        !           178: 
        !           179: static inline void
        !           180: liberation_enveloppe_buffer(struct_processus *s_etat_processus,
        !           181:        struct_buffer *s_buffer)
        !           182: {
        !           183:    if ((*s_etat_processus).pointeur_enveloppes_buffers < TAILLE_CACHE)
        !           184:    {
        !           185:        (*s_etat_processus).enveloppes_buffers
        !           186:                [(*s_etat_processus).pointeur_enveloppes_buffers++] = s_buffer;
        !           187:    }
        !           188:    else
        !           189:    {
        !           190:        free(s_buffer);
        !           191:    }
        !           192: 
        !           193:    return;
        !           194: }
        !           195: 
        !           196: 
        !           197: struct_buffer *
        !           198: allocation_buffer(struct_processus *s_etat_processus, integer8 longueur)
        !           199: {
        !           200:    int                     classe;
        !           201: 
        !           202:    struct_buffer           *s_buffer;
        !           203: 
        !           204:    if (allocation_enveloppe_buffer(s_etat_processus) == NULL)
        !           205:    {
        !           206:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           207:        return(NULL);
        !           208:    }
        !           209: 
        !           210:    classe = recherche_longueur_buffer_optimale(longueur);
        !           211: 
        !           212:    if (classe >= 0)
        !           213:    {
        !           214:        if ((*s_etat_processus).pointeur_cache_buffer[classe] > 0)
        !           215:        {
        !           216:            (*s_buffer).buffer = (*s_etat_processus).cache_buffer[classe]
        !           217:                    [--(*s_etat_processus).pointeur_cache_buffer[classe]];
        !           218:        }
        !           219:        else
        !           220:        {
        !           221:            if (((*s_buffer).buffer = malloc(tailles[classe] *
        !           222:                    sizeof(unsigned char))) == NULL)
        !           223:            {
        !           224:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           225:                return(NULL);
        !           226:            }
        !           227:        }
        !           228:    }
        !           229:    else
        !           230:    {
        !           231:        if (((*s_buffer).buffer = malloc(((size_t) longueur) *
        !           232:                sizeof(unsigned char))) == NULL)
        !           233:        {
        !           234:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           235:            return(NULL);
        !           236:        }
        !           237:    }
        !           238: 
        !           239:    (*s_buffer).classe = classe;
        !           240:    (*s_buffer).longueur_requise = longueur;
        !           241: 
        !           242:    return(NULL);
        !           243: }
        !           244: 
        !           245: 
        !           246: void
        !           247: liberation_buffer(struct_processus *s_etat_processus, struct_buffer *s_buffer)
        !           248: {
        !           249:    if ((*s_buffer).classe < 0)
        !           250:    {
        !           251:        free((*s_buffer).buffer);
        !           252:    }
        !           253:    else
        !           254:    {
        !           255:        if ((*s_etat_processus).pointeur_cache_buffer[(*s_buffer).classe]
        !           256:                < TAILLE_CACHE)
        !           257:        {
        !           258:            (*s_etat_processus).cache_buffer[(*s_buffer).classe]
        !           259:                    [(*s_etat_processus).pointeur_cache_buffer
        !           260:                    [(*s_buffer).classe]++] = (*s_buffer).buffer;
        !           261:        }
        !           262:        else
        !           263:        {
        !           264:            free((*s_buffer).buffer);
        !           265:        }
        !           266:    }
        !           267: 
        !           268:    liberation_enveloppe_buffer(s_etat_processus, s_buffer);
        !           269:    return;
        !           270: }
        !           271: 
        !           272: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>