Annotation of embedaddon/bird2/lib/resource.h, revision 1.1
1.1 ! misho 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: typedef struct lp_state {
! 63: void *current, *large;
! 64: byte *ptr;
! 65: } lp_state;
! 66:
! 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 */
! 74:
! 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:
! 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:
! 88: /*
! 89: * Low-level memory allocation functions, please don't use
! 90: * outside resource manager and possibly sysdep code.
! 91: */
! 92:
! 93: void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size);
! 94:
! 95:
! 96: #ifdef HAVE_LIBDMALLOC
! 97: /*
! 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.
! 101: */
! 102: #define DMALLOC_DISABLE
! 103: #include <dmalloc.h>
! 104: #define xmalloc(size) \
! 105: dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 1)
! 106: #define xrealloc(ptr, size) \
! 107: dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 1)
! 108: #define xfree(ptr) \
! 109: dmalloc_free(__FILE__, __LINE__, (ptr), DMALLOC_FUNC_FREE)
! 110:
! 111: #else
! 112: /*
! 113: * Unfortunately, several libraries we might want to link to define
! 114: * their own xmalloc and we don't want to interfere with them, hence
! 115: * the renaming.
! 116: */
! 117: #define xmalloc bird_xmalloc
! 118: #define xrealloc bird_xrealloc
! 119: void *xmalloc(unsigned);
! 120: void *xrealloc(void *, unsigned);
! 121: #define xfree(x) free(x)
! 122: #endif
! 123:
! 124: #endif
! 125:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>