File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / trafshow / recycle.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:55:18 2012 UTC (12 years, 4 months ago) by misho
Branches: trafshow, MAIN
CVS tags: v5_2_3p0, v5_2_3, HEAD
trafshow

    1: /*
    2: --------------------------------------------------------------------
    3: By Bob Jenkins, September 1996.  recycle.h
    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 all structures
   12:   only requires freeing the root.
   13: --------------------------------------------------------------------
   14: */
   15: 
   16: #ifndef STANDARD
   17: #include "standard.h"
   18: #endif
   19: 
   20: #ifndef RECYCLE
   21: #define RECYCLE
   22: 
   23: #define RESTART    0
   24: #define REMAX      32000
   25: 
   26: struct recycle
   27: {
   28:    struct recycle *next;
   29: };
   30: typedef  struct recycle  recycle;
   31: 
   32: struct reroot
   33: {
   34:    struct recycle *list;     /* list of malloced blocks */
   35:    struct recycle *trash;    /* list of deleted items */
   36:    size_t          size;     /* size of an item */
   37:    size_t          logsize;  /* log_2 of number of items in a block */
   38:    word            numleft;  /* number of items left in this block */
   39: };
   40: typedef  struct reroot  reroot;
   41: 
   42: /* make a new recycling root */
   43: reroot  *remkroot(size_t mysize);
   44: 
   45: /* free a recycling root and all the items it has made */
   46: void     refree(struct reroot *r);
   47: 
   48: /* get a new (cleared) item from the root */
   49: #define renew(r) ((r)->numleft ? \
   50:    (((char *)((r)->list+1))+((r)->numleft-=(r)->size)) : renewx(r))
   51: 
   52: char    *renewx(struct reroot *r);
   53: 
   54: /* delete an item; let the root recycle it */
   55: /* void     redel(/o_ struct reroot *r, struct recycle *item _o/); */
   56: #define redel(root,item) { \
   57:    ((recycle *)item)->next=(root)->trash; \
   58:    (root)->trash=(recycle *)(item); \
   59: }
   60: 
   61: #endif  /* RECYCLE */

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