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>