#include #include #include 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, 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; }