]> git.ipfire.org Git - thirdparty/bird.git/blob - lib/resource.h
Merge commit '1e8721e2aeccfbc3f533e8b8abc07582cee77e9a' into int-new
[thirdparty/bird.git] / lib / resource.h
1 /*
2 * BIRD Resource Manager
3 *
4 * (c) 1998--1999 Martin Mares <mj@ucw.cz>
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
12 #include "lib/lists.h"
13
14 /* Resource */
15
16 typedef struct resource {
17 node n; /* Inside resource pool */
18 struct resclass *class; /* Resource class */
19 } resource;
20
21 /* Resource class */
22
23 struct resclass {
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 */
28 resource *(*lookup)(resource *, unsigned long); /* Look up address (only for debugging) */
29 size_t (*memsize)(resource *); /* Return size of memory used by the resource, may be NULL */
30 };
31
32 /* Estimate of system allocator overhead per item, for memory consumtion stats */
33 #define ALLOC_OVERHEAD 8
34
35 /* Generic resource manipulation */
36
37 typedef struct pool pool;
38
39 void resource_init(void);
40 pool *rp_new(pool *, const char *); /* Create new pool */
41 void rfree(void *); /* Free single resource */
42 void rdump(void *); /* Dump to debug output */
43 size_t rmemsize(void *res); /* Return size of memory used by the resource */
44 void rlookup(unsigned long); /* Look up address (only for debugging) */
45 void rmove(void *, pool *); /* Move to a different pool */
46
47 void *ralloc(pool *, struct resclass *);
48
49 extern pool root_pool;
50
51 /* Normal memory blocks */
52
53 void *mb_alloc(pool *, unsigned size);
54 void *mb_allocz(pool *, unsigned size);
55 void *mb_realloc(void *m, unsigned size);
56 void mb_free(void *);
57
58 /* Memory pools with linear allocation */
59
60 typedef struct linpool linpool;
61
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 */
66 void lp_flush(linpool *); /* Free everything, but leave linpool */
67
68 extern const int lp_chunk_size;
69 #define LP_GAS 1024
70 #define LP_GOOD_SIZE(x) (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
71 #define lp_new_default(p) lp_new(p, LP_GOOD_SIZE(LP_GAS*4))
72
73 /* Slabs */
74
75 typedef struct slab slab;
76
77 slab *sl_new(pool *, unsigned size);
78 void *sl_alloc(slab *);
79 void sl_free(slab *, void *);
80
81 /*
82 * Low-level memory allocation functions, please don't use
83 * outside resource manager and possibly sysdep code.
84 */
85
86 void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size);
87
88
89 #ifdef HAVE_LIBDMALLOC
90 /*
91 * The standard dmalloc macros tend to produce lots of namespace
92 * conflicts and we use only xmalloc, xrealloc and xfree, so we
93 * can define the stubs ourselves.
94 */
95 #define DMALLOC_DISABLE
96 #include <dmalloc.h>
97 #define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size)
98 #define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size)
99 #define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr)
100 #else
101 /*
102 * Unfortunately, several libraries we might want to link to define
103 * their own xmalloc and we don't want to interfere with them, hence
104 * the renaming.
105 */
106 #define xmalloc bird_xmalloc
107 #define xrealloc bird_xrealloc
108 void *xmalloc(unsigned);
109 void *xrealloc(void *, unsigned);
110 #define xfree(x) free(x)
111 #endif
112
113 #endif
114