#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "error.h"
#include "pool.h"
static Pool pmainmem = {
.name= "Main",
.maxsize= 4*1024*1024,
.minarena= 128*1024,
.quantum= 32,
.alloc= xalloc,
.merge= xmerge,
.flags= 0,
};
static Pool pimagmem = {
.name= "Image",
.maxsize= 16*1024*1024,
.minarena= 2*1024*1024,
.quantum= 32,
.alloc= xalloc,
.merge= xmerge,
.flags= 0,
};
Pool* mainmem = &pmainmem;
Pool* imagmem = &pimagmem;
void*
smalloc(ulong size)
{
void *v;
ulong *l;
for(;;) {
v = poolalloc(mainmem, size+8);
if(v != nil)
break;
tsleep(&up->sleep, return0, 0, 100);
}
l = v;
l[0] = getcallerpc(&size);
v = l+2;
memset(v, 0, size);
return v;
}
void*
malloc(ulong size)
{
ulong *l;
void *v;
if(size == 0)
return nil;
v = poolalloc(mainmem, size+8);
if(v != nil) {
l = v;
l[0] = getcallerpc(&size);
v = l+2;
memset(v, 0, size);
}
return v;
}
void*
mallocz(ulong size, int clr)
{
void *v;
ulong *l;
if(size == 0)
return nil;
v = poolalloc(mainmem, size+8);
if(v != nil) {
l = v;
l[0] = getcallerpc(&size);
v = l+2;
}
if(clr && v != nil)
memset(v, 0, size);
return v;
}
void
free(void *v)
{
if(v != nil) {
poolfree(mainmem, (uchar*)v-8);
}
}
void*
realloc(void *v, ulong size)
{
ulong *l;
void *nv;
long nsize;
if(size == 0) {
free(v);
return nil;
}
if(v == nil)
return malloc(size);
nv = (uchar*)v-8;
nsize = size+8;
if(l = poolrealloc(mainmem, nv, nsize))
return l+2;
return nil;
}
ulong
msize(void *v)
{
return poolmsize(mainmem, (uchar*)v-8)-8;
}
void*
calloc(ulong n, ulong szelem)
{
return mallocz(n*szelem, 1);
}
void
poolsummary(Pool *p)
{
print("%s max %lud cur %lud free %lud alloc %lud\n", p->name,
p->maxsize, p->cursize, p->curfree, p->curalloc);
}
void
mallocsummary(void)
{
poolsummary(mainmem);
poolsummary(imagmem);
}
void
tagwithpc(void *v, ulong pc)
{
ulong *u;
if(v == nil)
return;
u = v;
u[-2] = pc;
}