#include <u.h> | |
#include <libc.h> | |
#include <venti.h> | |
enum { | |
IdealAlignment = 32, | |
ChunkSize = 128*1024 | |
}; | |
void | |
vtfree(void *p) | |
{ | |
if(p == 0) | |
return; | |
free(p); | |
} | |
void * | |
vtmalloc(int size) | |
{ | |
void *p; | |
p = malloc(size); | |
if(p == 0) | |
sysfatal("vtmalloc: out of memory"); | |
setmalloctag(p, getcallerpc(&size)); | |
return p; | |
} | |
void * | |
vtmallocz(int size) | |
{ | |
void *p = vtmalloc(size); | |
memset(p, 0, size); | |
setmalloctag(p, getcallerpc(&size)); | |
return p; | |
} | |
void * | |
vtrealloc(void *p, int size) | |
{ | |
if(p == nil) | |
return vtmalloc(size); | |
p = realloc(p, size); | |
if(p == 0) | |
sysfatal("vtMemRealloc: out of memory"); | |
setrealloctag(p, getcallerpc(&size)); | |
return p; | |
} | |
void * | |
vtbrk(int n) | |
{ | |
static Lock lk; | |
static uchar *buf; | |
static int nbuf; | |
static int nchunk; | |
int align, pad; | |
void *p; | |
if(n >= IdealAlignment) | |
align = IdealAlignment; | |
else if(n > 8) | |
align = 8; | |
else | |
align = 4; | |
lock(&lk); | |
pad = (align - (ulong)buf) & (align-1); | |
if(n + pad > nbuf) { | |
buf = vtmallocz(ChunkSize); | |
nbuf = ChunkSize; | |
pad = (align - (ulong)buf) & (align-1); | |
nchunk++; | |
} | |
assert(n + pad <= nbuf); | |
p = buf + pad; | |
buf += pad + n; | |
nbuf -= pad + n; | |
unlock(&lk); | |
return p; | |
} | |