Blob
1 #include <u.h>2 #include <libc.h>3 #include <venti.h>5 enum {6 IdealAlignment = 32,7 ChunkSize = 128*10248 };11 void12 vtfree(void *p)13 {14 if(p == 0)15 return;16 free(p);17 }19 void *20 vtmalloc(int size)21 {22 void *p;24 p = malloc(size);25 if(p == 0)26 sysfatal("vtmalloc: out of memory");27 setmalloctag(p, getcallerpc(&size));28 return p;29 }31 void *32 vtmallocz(int size)33 {34 void *p = vtmalloc(size);35 memset(p, 0, size);36 setmalloctag(p, getcallerpc(&size));37 return p;38 }40 void *41 vtrealloc(void *p, int size)42 {43 if(p == nil)44 return vtmalloc(size);45 p = realloc(p, size);46 if(p == 0)47 sysfatal("vtMemRealloc: out of memory");48 setrealloctag(p, getcallerpc(&size));49 return p;50 }52 void *53 vtbrk(int n)54 {55 static Lock lk;56 static uchar *buf;57 static int nbuf;58 static int nchunk;59 int align, pad;60 void *p;62 if(n >= IdealAlignment)63 align = IdealAlignment;64 else if(n > 8)65 align = 8;66 else67 align = 4;69 lock(&lk);70 pad = (align - (ulong)buf) & (align-1);71 if(n + pad > nbuf) {72 buf = vtmallocz(ChunkSize);73 nbuf = ChunkSize;74 pad = (align - (ulong)buf) & (align-1);75 nchunk++;76 }78 assert(n + pad <= nbuf);80 p = buf + pad;81 buf += pad + n;82 nbuf -= pad + n;83 unlock(&lk);85 return p;86 }