Annotation of embedaddon/trafshow/recycle.c, revision 1.1.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>