86 lines · 1.1 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <venti.h> enum {	IdealAlignment = 32,	ChunkSize 	= 128*1024};  voidvtfree(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, nchunk;	int align, pad;	void *p; 	if(n >= IdealAlignment)		align = IdealAlignment;	else if(n > 8)		align = 8;	else			align = 4; 	lock(&lk);	pad = (align - (uintptr)buf) & (align-1);	if(n + pad > nbuf) {		buf = vtmallocz(ChunkSize);		nbuf = ChunkSize;		pad = (align - (uintptr)buf) & (align-1);		nchunk++;	} 	assert(n + pad <= nbuf);			p = buf + pad;	buf += pad + n;	nbuf -= pad + n;	unlock(&lk); 	return p;}