Annotation of embedaddon/trafshow/recycle.c, revision 1.1

1.1     ! misho       1: /*
        !             2: --------------------------------------------------------------------
        !             3: By Bob Jenkins, September 1996.  recycle.c
        !             4: You may use this code in any way you wish, and it is free.  No warranty.
        !             5: 
        !             6: This manages memory for commonly-allocated structures.
        !             7: It allocates RESTART to REMAX items at a time.
        !             8: Timings have shown that, if malloc is used for every new structure,
        !             9:   malloc will consume about 90% of the time in a program.  This
        !            10:   module cuts down the number of mallocs by an order of magnitude.
        !            11: This also decreases memory fragmentation, and freeing structures
        !            12:   only requires freeing the root.
        !            13: --------------------------------------------------------------------
        !            14: */
        !            15: 
        !            16: #include <stdlib.h>
        !            17: #include <string.h>
        !            18: 
        !            19: #ifndef STANDARD
        !            20: # include "standard.h"
        !            21: #endif
        !            22: #ifndef RECYCLE
        !            23: # include "recycle.h"
        !            24: #endif
        !            25: 
        !            26: reroot *remkroot(size)
        !            27: size_t  size;
        !            28: {
        !            29:    reroot *r = (reroot *)malloc(sizeof(reroot));
        !            30:    if (r) {
        !            31:        r->list = (recycle *)0;
        !            32:        r->trash = (recycle *)0;
        !            33:        r->size = align(size);
        !            34:        r->logsize = RESTART;
        !            35:        r->numleft = 0;
        !            36:    }
        !            37:    return r;
        !            38: }
        !            39: 
        !            40: void  refree(r)
        !            41: struct reroot *r;
        !            42: {
        !            43:    recycle *temp = r->list;
        !            44:    if (temp) while (r->list)
        !            45:    {
        !            46:       temp = r->list->next;
        !            47:       free((char *)r->list);
        !            48:       r->list = temp;
        !            49:    }
        !            50:    free((char *)r);
        !            51:    return;
        !            52: }
        !            53: 
        !            54: /* to be called from the macro renew only */
        !            55: char  *renewx(r)
        !            56: struct reroot *r;
        !            57: {
        !            58:    recycle *temp;
        !            59:    if (r->trash)
        !            60:    {  /* pull a node off the trash heap */
        !            61:       temp = r->trash;
        !            62:       r->trash = temp->next;
        !            63:       (void)memset((void *)temp, 0, r->size);
        !            64:    }
        !            65:    else
        !            66:    {  /* allocate a new block of nodes */
        !            67:       r->numleft = r->size*((ub4)1<<r->logsize);
        !            68:       if (r->numleft < REMAX) ++r->logsize;
        !            69:       temp = (recycle *)malloc(sizeof(recycle) + r->numleft);
        !            70:       if (!temp) return 0;
        !            71:       temp->next = r->list;
        !            72:       r->list = temp;
        !            73:       r->numleft-=r->size;
        !            74:       temp = (recycle *)((char *)(r->list+1)+r->numleft);
        !            75:    }
        !            76:    return (char *)temp;
        !            77: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>