ref: d0ab3a0dd8f6355b3603d0fb04043a9ae867639b
dir: /include/pool.h/
/* Inferno tree allocator */
typedef struct Pool Pool;
typedef struct Bhdr Bhdr;
typedef struct Btail Btail;
#pragma incomplete Pool
enum
{
MAGIC_A = 0xa110c, /* Allocated block */
MAGIC_F = 0xbadc0c0a, /* Free block */
MAGIC_E = 0xdeadbabe, /* End of arena */
MAGIC_I = 0xabba /* Block is immutable (hidden from gc) */
};
struct Bhdr
{
ulong magic;
ulong size;
union {
uchar data[1];
struct {
Bhdr* bhl;
Bhdr* bhr;
Bhdr* bhp;
Bhdr* bhv;
Bhdr* bhf;
} s;
#define clink u.l.link
#define csize u.l.size
struct {
Bhdr* link;
int size;
} l;
} u;
};
struct Btail
{
/* ulong pad; */
Bhdr* hdr;
};
#define B2D(bp) ((void*)bp->u.data)
#define D2B(b, dp) b = ((Bhdr*)(((uchar*)dp)-(((Bhdr*)0)->u.data))); \
if(b->magic != MAGIC_A && b->magic != MAGIC_I)\
poolfault(dp, "alloc:D2B", getcallerpc(&dp));
#define B2NB(b) ((Bhdr*)((uchar*)b + b->size))
#define B2PT(b) ((Btail*)((uchar*)b - sizeof(Btail)))
#define B2T(b) ((Btail*)(((uchar*)b)+b->size-sizeof(Btail)))
#define B2LIMIT(b) ((Bhdr*)((uchar*)b + b->csize))
#define BHDRSIZE ((int)(((Bhdr*)0)->u.data)+sizeof(Btail))
extern void (*poolfault)(void *, char *, ulong);
extern void poolinit(void);
extern void* poolalloc(Pool*, ulong);
extern void poolfree(Pool*, void*);
extern Bhdr* poolchain(Pool*);
extern int poolcompact(Pool*);
extern void poolimmutable(void*);
extern ulong poolmsize(Pool*, void*);
extern void poolmutable(void*);
extern char* poolname(Pool*);
extern int poolread(char*, int, ulong);
extern void* poolrealloc(Pool*, void*, ulong);
extern int poolsetsize(char*, int);
extern void poolsetcompact(Pool*, void (*)(void*, void*));
extern char* poolaudit(char*(*)(int, Bhdr *));
extern void (*poolmonitor)(int, ulong, Bhdr*, ulong);