diff options
author | Noam Preil <noam@pixelhero.dev> | 2021-07-21 05:06:05 +0000 |
---|---|---|
committer | Noam Preil <noam@pixelhero.dev> | 2021-07-21 05:06:05 +0000 |
commit | 2eadf1fa1703e5da4a98ba9c1a2bdc23bd140d8c (patch) | |
tree | ed135a7c6402ac77ddc7dc482050d0bc3183b1f1 /sys/src/libventi | |
parent | 82c7251dc3ff57ae97c0ce24b72e2e2ae5f6945b (diff) |
venti: fix memory layers
Diffstat (limited to 'sys/src/libventi')
-rw-r--r-- | sys/src/libventi/mem.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/sys/src/libventi/mem.c b/sys/src/libventi/mem.c index dea99a9d1..57e108a5a 100644 --- a/sys/src/libventi/mem.c +++ b/sys/src/libventi/mem.c @@ -7,55 +7,55 @@ enum { ChunkSize = 128*1024 }; - void vtfree(void *p) { - if(p == 0) - return; free(p); } void * -vtmalloc(int size) +vtmalloc(ulong size) { - void *p; - - p = malloc(size); - if(p == 0) - sysfatal("vtmalloc: out of memory"); + void *p = mallocz(size, 0); + if(p == nil){ + fprint(2, "vtmalloc: out of memory allocating %lud", size); + abort(); + } setmalloctag(p, getcallerpc(&size)); return p; } void * -vtmallocz(int size) +vtmallocz(ulong size) { - void *p = vtmalloc(size); - memset(p, 0, size); + void *p = mallocz(size, 1); + if(p == nil){ + fprint(2, "vtmallocz: out of memory allocating %lud", size); + abort(); + } setmalloctag(p, getcallerpc(&size)); return p; } void * -vtrealloc(void *p, int size) +vtrealloc(void *p, ulong size) { - if(p == nil) - return vtmalloc(size); p = realloc(p, size); - if(p == 0) - sysfatal("vtMemRealloc: out of memory"); + if(p == 0 && size != 0){ + fprint(2, "vtrealloc: out of memory allocating %lud", size); + abort(); + } setrealloctag(p, getcallerpc(&size)); return p; } void * -vtbrk(int n) +vtbrk(ulong n) { static Lock lk; static uchar *buf; - static int nbuf, nchunk; - int align, pad; + static ulong nbuf, nchunk; + ulong align, pad; void *p; if(n >= IdealAlignment) @@ -65,10 +65,20 @@ vtbrk(int n) else align = 4; + if(n > ChunkSize){ + p = sbrk(n); + if(p == (void*)-1) + sysfatal("Failed to allocate permanent chunk size %lud", n); + memset(p, 0, n); + return (uchar*)p; + } lock(&lk); pad = (align - (uintptr)buf) & (align-1); if(n + pad > nbuf) { - buf = vtmallocz(ChunkSize); + buf = sbrk(ChunkSize); + if(buf == (void*)-1) + sysfatal("Failed to allocate permanent chunk size %ud", ChunkSize); + memset(buf, 0, ChunkSize); nbuf = ChunkSize; pad = (align - (uintptr)buf) & (align-1); nchunk++; |