]>
Commit | Line | Data |
---|---|---|
58ef912c MM |
1 | /* |
2 | * BIRD Resource Manager | |
3 | * | |
f5c687f7 | 4 | * (c) 1998--1999 Martin Mares <mj@ucw.cz> |
58ef912c MM |
5 | * |
6 | * Can be freely distributed and used under the terms of the GNU GPL. | |
7 | */ | |
8 | ||
9 | #ifndef _BIRD_RESOURCE_H_ | |
10 | #define _BIRD_RESOURCE_H_ | |
11 | ||
1feea03e | 12 | #include "lib/lists.h" |
58ef912c MM |
13 | |
14 | /* Resource */ | |
15 | ||
16 | typedef struct resource { | |
18c8241a MM |
17 | node n; /* Inside resource pool */ |
18 | struct resclass *class; /* Resource class */ | |
58ef912c MM |
19 | } resource; |
20 | ||
21 | /* Resource class */ | |
22 | ||
23 | struct resclass { | |
18c8241a MM |
24 | char *name; /* Resource class name */ |
25 | unsigned size; /* Standard size of single resource */ | |
26 | void (*free)(resource *); /* Freeing function */ | |
27 | void (*dump)(resource *); /* Dump to debug output */ | |
c9763428 | 28 | resource *(*lookup)(resource *, unsigned long); /* Look up address (only for debugging) */ |
acb60628 | 29 | size_t (*memsize)(resource *); /* Return size of memory used by the resource, may be NULL */ |
58ef912c MM |
30 | }; |
31 | ||
acb60628 OZ |
32 | /* Estimate of system allocator overhead per item, for memory consumtion stats */ |
33 | #define ALLOC_OVERHEAD 8 | |
34 | ||
58ef912c MM |
35 | /* Generic resource manipulation */ |
36 | ||
37 | typedef struct pool pool; | |
38 | ||
18c8241a | 39 | void resource_init(void); |
65d2a88d | 40 | pool *rp_new(pool *, const char *); /* Create new pool */ |
58ef912c MM |
41 | void rfree(void *); /* Free single resource */ |
42 | void rdump(void *); /* Dump to debug output */ | |
acb60628 | 43 | size_t rmemsize(void *res); /* Return size of memory used by the resource */ |
c9763428 | 44 | void rlookup(unsigned long); /* Look up address (only for debugging) */ |
2cc37815 | 45 | void rmove(void *, pool *); /* Move to a different pool */ |
58ef912c | 46 | |
18c8241a MM |
47 | void *ralloc(pool *, struct resclass *); |
48 | ||
49 | extern pool root_pool; | |
58ef912c MM |
50 | |
51 | /* Normal memory blocks */ | |
52 | ||
53 | void *mb_alloc(pool *, unsigned size); | |
7a2105be | 54 | void *mb_allocz(pool *, unsigned size); |
6a8d3f1c | 55 | void *mb_realloc(void *m, unsigned size); |
a9938b17 | 56 | void mb_move(void *, pool *); |
18c8241a | 57 | void mb_free(void *); |
58ef912c MM |
58 | |
59 | /* Memory pools with linear allocation */ | |
60 | ||
b35d72ac | 61 | typedef struct linpool linpool; |
58ef912c | 62 | |
1e11918c OZ |
63 | typedef struct lp_state { |
64 | void *current, *large; | |
65 | byte *ptr; | |
66 | } lp_state; | |
67 | ||
b35d72ac MM |
68 | linpool *lp_new(pool *, unsigned blk); |
69 | void *lp_alloc(linpool *, unsigned size); /* Aligned */ | |
70 | void *lp_allocu(linpool *, unsigned size); /* Unaligned */ | |
71 | void *lp_allocz(linpool *, unsigned size); /* With clear */ | |
f5c687f7 | 72 | void lp_flush(linpool *); /* Free everything, but leave linpool */ |
1e11918c OZ |
73 | void lp_save(linpool *m, lp_state *p); /* Save state */ |
74 | void lp_restore(linpool *m, lp_state *p); /* Restore state */ | |
58ef912c | 75 | |
05d47bd5 JMM |
76 | extern const int lp_chunk_size; |
77 | #define LP_GAS 1024 | |
78 | #define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size) | |
79 | #define lp_new_default(p) lp_new(p, LP_GOOD_SIZE(LP_GAS*4)) | |
80 | ||
58ef912c MM |
81 | /* Slabs */ |
82 | ||
83 | typedef struct slab slab; | |
84 | ||
85 | slab *sl_new(pool *, unsigned size); | |
86 | void *sl_alloc(slab *); | |
db2d2907 | 87 | void *sl_allocz(slab *); |
58ef912c MM |
88 | void sl_free(slab *, void *); |
89 | ||
7a2105be MM |
90 | /* |
91 | * Low-level memory allocation functions, please don't use | |
92 | * outside resource manager and possibly sysdep code. | |
93 | */ | |
58ef912c | 94 | |
6a8d3f1c OZ |
95 | void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size); |
96 | ||
886dd92e MM |
97 | /* Allocator of whole pages; for use in slabs and other high-level allocators. */ |
98 | u64 get_page_size(void); | |
99 | void *alloc_page(void); | |
100 | void free_page(void *); | |
644e9ca9 | 101 | extern uint pages_kept; |
6a8d3f1c | 102 | |
7a2105be MM |
103 | #ifdef HAVE_LIBDMALLOC |
104 | /* | |
105 | * The standard dmalloc macros tend to produce lots of namespace | |
3d15dcdb OZ |
106 | * conflicts and we use only xmalloc, xrealloc and xfree, so we |
107 | * can define the stubs ourselves. | |
7a2105be MM |
108 | */ |
109 | #define DMALLOC_DISABLE | |
110 | #include <dmalloc.h> | |
b40c0f02 MM |
111 | #define xmalloc(size) \ |
112 | dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 1) | |
113 | #define xrealloc(ptr, size) \ | |
114 | dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 1) | |
115 | #define xfree(ptr) \ | |
116 | dmalloc_free(__FILE__, __LINE__, (ptr), DMALLOC_FUNC_FREE) | |
117 | ||
7a2105be | 118 | #else |
3ee2310c MM |
119 | /* |
120 | * Unfortunately, several libraries we might want to link to define | |
121 | * their own xmalloc and we don't want to interfere with them, hence | |
122 | * the renaming. | |
123 | */ | |
124 | #define xmalloc bird_xmalloc | |
3d15dcdb | 125 | #define xrealloc bird_xrealloc |
58ef912c | 126 | void *xmalloc(unsigned); |
3d15dcdb | 127 | void *xrealloc(void *, unsigned); |
58ef912c | 128 | #define xfree(x) free(x) |
7a2105be | 129 | #endif |
58ef912c MM |
130 | |
131 | #endif | |
6a8d3f1c | 132 |