]>
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); |
ed68a5c6 | 40 | pool *rp_new(pool *, 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); |
3d15dcdb | 55 | void *mb_realloc(pool *p, 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 | |
b35d72ac MM |
62 | linpool *lp_new(pool *, unsigned blk); |
63 | void *lp_alloc(linpool *, unsigned size); /* Aligned */ | |
64 | void *lp_allocu(linpool *, unsigned size); /* Unaligned */ | |
65 | void *lp_allocz(linpool *, unsigned size); /* With clear */ | |
f5c687f7 | 66 | void lp_flush(linpool *); /* Free everything, but leave linpool */ |
58ef912c MM |
67 | |
68 | /* Slabs */ | |
69 | ||
70 | typedef struct slab slab; | |
71 | ||
72 | slab *sl_new(pool *, unsigned size); | |
73 | void *sl_alloc(slab *); | |
74 | void sl_free(slab *, void *); | |
75 | ||
7a2105be MM |
76 | /* |
77 | * Low-level memory allocation functions, please don't use | |
78 | * outside resource manager and possibly sysdep code. | |
79 | */ | |
58ef912c | 80 | |
7a2105be MM |
81 | #ifdef HAVE_LIBDMALLOC |
82 | /* | |
83 | * The standard dmalloc macros tend to produce lots of namespace | |
3d15dcdb OZ |
84 | * conflicts and we use only xmalloc, xrealloc and xfree, so we |
85 | * can define the stubs ourselves. | |
7a2105be MM |
86 | */ |
87 | #define DMALLOC_DISABLE | |
88 | #include <dmalloc.h> | |
89 | #define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size) | |
3d15dcdb | 90 | #define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size) |
7a2105be MM |
91 | #define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr) |
92 | #else | |
3ee2310c MM |
93 | /* |
94 | * Unfortunately, several libraries we might want to link to define | |
95 | * their own xmalloc and we don't want to interfere with them, hence | |
96 | * the renaming. | |
97 | */ | |
98 | #define xmalloc bird_xmalloc | |
3d15dcdb | 99 | #define xrealloc bird_xrealloc |
58ef912c | 100 | void *xmalloc(unsigned); |
3d15dcdb | 101 | void *xrealloc(void *, unsigned); |
58ef912c | 102 | #define xfree(x) free(x) |
7a2105be | 103 | #endif |
58ef912c MM |
104 | |
105 | #endif |