Annotation of embedaddon/trafshow/recycle.h, revision 1.1.1.1

1.1       misho       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>