]>
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); |
18c8241a | 56 | void mb_free(void *); |
58ef912c MM |
57 | |
58 | /* Memory pools with linear allocation */ | |
59 | ||
b35d72ac | 60 | typedef struct linpool linpool; |
58ef912c | 61 | |
1e11918c OZ |
62 | typedef struct lp_state { |
63 | void *current, *large; | |
64 | byte *ptr; | |
65 | } lp_state; | |
66 | ||
b35d72ac MM |
67 | linpool *lp_new(pool *, unsigned blk); |
68 | void *lp_alloc(linpool *, unsigned size); /* Aligned */ | |
69 | void *lp_allocu(linpool *, unsigned size); /* Unaligned */ | |
70 | void *lp_allocz(linpool *, unsigned size); /* With clear */ | |
f5c687f7 | 71 | void lp_flush(linpool *); /* Free everything, but leave linpool */ |
1e11918c OZ |
72 | void lp_save(linpool *m, lp_state *p); /* Save state */ |
73 | void lp_restore(linpool *m, lp_state *p); /* Restore state */ | |
58ef912c | 74 | |
05d47bd5 MM |
75 | extern const int lp_chunk_size; |
76 | #define LP_GAS 1024 | |
77 | #define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size) | |
78 | #define lp_new_default(p) lp_new(p, LP_GOOD_SIZE(LP_GAS*4)) | |
79 | ||
58ef912c MM |
80 | /* Slabs */ |
81 | ||
82 | typedef struct slab slab; | |
83 | ||
84 | slab *sl_new(pool *, unsigned size); | |
85 | void *sl_alloc(slab *); | |
86 | void sl_free(slab *, void *); | |
87 | ||
7a2105be MM |
88 | /* |
89 | * Low-level memory allocation functions, please don't use | |
90 | * outside resource manager and possibly sysdep code. | |
91 | */ | |
58ef912c | 92 | |
6a8d3f1c OZ |
93 | void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size); |
94 | ||
95 | ||
7a2105be MM |
96 | #ifdef HAVE_LIBDMALLOC |
97 | /* | |
98 | * The standard dmalloc macros tend to produce lots of namespace | |
3d15dcdb OZ |
99 | * conflicts and we use only xmalloc, xrealloc and xfree, so we |
100 | * can define the stubs ourselves. | |
7a2105be MM |
101 | */ |
102 | #define DMALLOC_DISABLE | |
103 | #include <dmalloc.h> | |
104 | #define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size) | |
3d15dcdb | 105 | #define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size) |
7a2105be MM |
106 | #define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr) |
107 | #else | |
3ee2310c MM |
108 | /* |
109 | * Unfortunately, several libraries we might want to link to define | |
110 | * their own xmalloc and we don't want to interfere with them, hence | |
111 | * the renaming. | |
112 | */ | |
113 | #define xmalloc bird_xmalloc | |
3d15dcdb | 114 | #define xrealloc bird_xrealloc |
58ef912c | 115 | void *xmalloc(unsigned); |
3d15dcdb | 116 | void *xrealloc(void *, unsigned); |
58ef912c | 117 | #define xfree(x) free(x) |
7a2105be | 118 | #endif |
58ef912c MM |
119 | |
120 | #endif | |
6a8d3f1c | 121 |