mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
87 lines
1.2 KiB
C
87 lines
1.2 KiB
C
#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;
|
|
static int nchunk;
|
|
int align, pad;
|
|
void *p;
|
|
|
|
if(n >= IdealAlignment)
|
|
align = IdealAlignment;
|
|
else if(n > 8)
|
|
align = 8;
|
|
else
|
|
align = 4;
|
|
|
|
lock(&lk);
|
|
pad = (align - (ulong)buf) & (align-1);
|
|
if(n + pad > nbuf) {
|
|
buf = vtmallocz(ChunkSize);
|
|
nbuf = ChunkSize;
|
|
pad = (align - (ulong)buf) & (align-1);
|
|
nchunk++;
|
|
}
|
|
|
|
assert(n + pad <= nbuf);
|
|
|
|
p = buf + pad;
|
|
buf += pad + n;
|
|
nbuf -= pad + n;
|
|
unlock(&lk);
|
|
|
|
return p;
|
|
}
|
|
|