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