mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
88 lines
1.2 KiB
C
88 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;
|
||
|
}
|
||
|
|