Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / lib / resource.h @ 6b3f1a54

History | View | Annotate | Download (3.38 KB)

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) _xmalloc_leap(__FILE__, __LINE__, size)
105
#define xrealloc(size) _xrealloc_leap(__FILE__, __LINE__, size)
106
#define xfree(ptr) _xfree_leap(__FILE__, __LINE__, ptr)
107
#else
108
/*
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
111
 * the renaming.
112
 */
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)
118
#endif
119

    
120
#endif
121