Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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