]>
git.ipfire.org Git - thirdparty/bird.git/blob - lib/resource.h
d9d4bb8f10e265e07e107b174561fdc55f09a8bd
2 * BIRD Resource Manager
4 * (c) 1998--1999 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
9 #ifndef _BIRD_RESOURCE_H_
10 #define _BIRD_RESOURCE_H_
12 #include "lib/lists.h"
16 typedef struct resource
{
17 node n
; /* Inside resource pool */
18 struct resclass
*class; /* Resource class */
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 */
32 /* Estimate of system allocator overhead per item, for memory consumtion stats */
33 #define ALLOC_OVERHEAD 8
35 /* Generic resource manipulation */
37 typedef struct pool pool
;
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 */
47 void *ralloc(pool
*, struct resclass
*);
49 extern pool root_pool
;
51 /* Normal memory blocks */
53 void *mb_alloc(pool
*, unsigned size
);
54 void *mb_allocz(pool
*, unsigned size
);
55 void *mb_realloc(void *m
, unsigned size
);
58 /* Memory pools with linear allocation */
60 typedef struct linpool linpool
;
62 typedef struct lp_state
{
63 void *current
, *large
;
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 */
71 void lp_flush(linpool
*); /* Free everything, but leave linpool */
72 void lp_save(linpool
*m
, lp_state
*p
); /* Save state */
73 void lp_restore(linpool
*m
, lp_state
*p
); /* Restore state */
75 extern const int lp_chunk_size
;
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))
82 typedef struct slab slab
;
84 slab
*sl_new(pool
*, unsigned size
);
85 void *sl_alloc(slab
*);
86 void sl_free(slab
*, void *);
89 * Low-level memory allocation functions, please don't use
90 * outside resource manager and possibly sysdep code.
93 void buffer_realloc(void **buf
, unsigned *size
, unsigned need
, unsigned item_size
);
96 #ifdef HAVE_LIBDMALLOC
98 * The standard dmalloc macros tend to produce lots of namespace
99 * conflicts and we use only xmalloc, xrealloc and xfree, so we
100 * can define the stubs ourselves.
102 #define DMALLOC_DISABLE
104 #define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size)
105 #define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size)
106 #define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr)
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
113 #define xmalloc bird_xmalloc
114 #define xrealloc bird_xrealloc
115 void *xmalloc(unsigned);
116 void *xrealloc(void *, unsigned);
117 #define xfree(x) free(x)