resource.h 3.38 KB
Newer Older
1 2 3
/*
 *	BIRD Resource Manager
 *
4
 *	(c) 1998--1999 Martin Mares <mj@ucw.cz>
5 6 7 8 9 10 11
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_RESOURCE_H_
#define _BIRD_RESOURCE_H_

12
#include "lib/lists.h"
13 14 15 16

/* Resource */

typedef struct resource {
17 18
  node n;				/* Inside resource pool */
  struct resclass *class;		/* Resource class */
19 20 21 22 23
} resource;

/* Resource class */

struct resclass {
24 25 26 27
  char *name;				/* Resource class name */
  unsigned size;			/* Standard size of single resource */
  void (*free)(resource *);		/* Freeing function */
  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 33 34
/* Estimate of system allocator overhead per item, for memory consumtion stats */
#define ALLOC_OVERHEAD		8

35 36 37 38
/* Generic resource manipulation */

typedef struct pool pool;

39
void resource_init(void);
40
pool *rp_new(pool *, const char *);	/* Create new pool */
41 42
void rfree(void *);			/* Free single resource */
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 48 49
void *ralloc(pool *, struct resclass *);

extern pool root_pool;
50 51 52 53

/* Normal memory blocks */

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 59

/* Memory pools with linear allocation */

60
typedef struct linpool linpool;
61

62 63 64 65 66
typedef struct lp_state {
  void *current, *large;
  byte *ptr;
} lp_state;

67 68 69 70
linpool *lp_new(pool *, unsigned blk);
void *lp_alloc(linpool *, unsigned size);	/* Aligned */
void *lp_allocu(linpool *, unsigned size);	/* Unaligned */
void *lp_allocz(linpool *, unsigned size);	/* With clear */
71
void lp_flush(linpool *);			/* Free everything, but leave linpool */
72 73
void lp_save(linpool *m, lp_state *p);		/* Save state */
void lp_restore(linpool *m, lp_state *p);	/* Restore state */
74

75 76 77 78 79
extern const int lp_chunk_size;
#define LP_GAS		    1024
#define LP_GOOD_SIZE(x)	    (((x + LP_GAS - 1) & (~(LP_GAS - 1))) - lp_chunk_size)
#define lp_new_default(p)   lp_new(p, LP_GOOD_SIZE(LP_GAS*4))

80 81 82 83 84 85 86 87
/* Slabs */

typedef struct slab slab;

slab *sl_new(pool *, unsigned size);
void *sl_alloc(slab *);
void sl_free(slab *, void *);

88 89 90 91
/*
 * Low-level memory allocation functions, please don't use
 * outside resource manager and possibly sysdep code.
 */
92

93 94 95
void buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size);


96 97 98
#ifdef HAVE_LIBDMALLOC
/*
 * The standard dmalloc macros tend to produce lots of namespace
99 100
 * conflicts and we use only xmalloc, xrealloc and xfree, so we
 * can define the stubs ourselves.
101 102 103 104
 */
#define DMALLOC_DISABLE
#include <dmalloc.h>
#define xmalloc(size) _xmalloc_leap(__FILE__, __LINE__, size)
105
#define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size)
106 107
#define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr)
#else
108 109 110 111 112 113
/*
 * Unfortunately, several libraries we might want to link to define
 * their own xmalloc and we don't want to interfere with them, hence
 * the renaming.
 */
#define xmalloc bird_xmalloc
114
#define xrealloc bird_xrealloc
115
void *xmalloc(unsigned);
116
void *xrealloc(void *, unsigned);
117
#define xfree(x) free(x)
118
#endif
119 120

#endif
121