1368c31abSDavid du Colombier #include <u.h>
2368c31abSDavid du Colombier #include <libc.h>
3368c31abSDavid du Colombier #include <venti.h>
4368c31abSDavid du Colombier
5368c31abSDavid du Colombier enum {
6368c31abSDavid du Colombier IdealAlignment = 32,
7368c31abSDavid du Colombier ChunkSize = 128*1024
8368c31abSDavid du Colombier };
9368c31abSDavid du Colombier
10368c31abSDavid du Colombier
11368c31abSDavid du Colombier void
vtfree(void * p)12368c31abSDavid du Colombier vtfree(void *p)
13368c31abSDavid du Colombier {
14368c31abSDavid du Colombier if(p == 0)
15368c31abSDavid du Colombier return;
16368c31abSDavid du Colombier free(p);
17368c31abSDavid du Colombier }
18368c31abSDavid du Colombier
19368c31abSDavid du Colombier void *
vtmalloc(int size)20368c31abSDavid du Colombier vtmalloc(int size)
21368c31abSDavid du Colombier {
22368c31abSDavid du Colombier void *p;
23368c31abSDavid du Colombier
24368c31abSDavid du Colombier p = malloc(size);
25368c31abSDavid du Colombier if(p == 0)
26368c31abSDavid du Colombier sysfatal("vtmalloc: out of memory");
27368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&size));
28368c31abSDavid du Colombier return p;
29368c31abSDavid du Colombier }
30368c31abSDavid du Colombier
31368c31abSDavid du Colombier void *
vtmallocz(int size)32368c31abSDavid du Colombier vtmallocz(int size)
33368c31abSDavid du Colombier {
34368c31abSDavid du Colombier void *p = vtmalloc(size);
35368c31abSDavid du Colombier memset(p, 0, size);
36368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&size));
37368c31abSDavid du Colombier return p;
38368c31abSDavid du Colombier }
39368c31abSDavid du Colombier
40368c31abSDavid du Colombier void *
vtrealloc(void * p,int size)41368c31abSDavid du Colombier vtrealloc(void *p, int size)
42368c31abSDavid du Colombier {
43368c31abSDavid du Colombier if(p == nil)
44368c31abSDavid du Colombier return vtmalloc(size);
45368c31abSDavid du Colombier p = realloc(p, size);
46368c31abSDavid du Colombier if(p == 0)
47368c31abSDavid du Colombier sysfatal("vtMemRealloc: out of memory");
48368c31abSDavid du Colombier setrealloctag(p, getcallerpc(&size));
49368c31abSDavid du Colombier return p;
50368c31abSDavid du Colombier }
51368c31abSDavid du Colombier
52368c31abSDavid du Colombier void *
vtbrk(int n)53368c31abSDavid du Colombier vtbrk(int n)
54368c31abSDavid du Colombier {
55368c31abSDavid du Colombier static Lock lk;
56368c31abSDavid du Colombier static uchar *buf;
57*e538c934SDavid du Colombier static int nbuf, nchunk;
58368c31abSDavid du Colombier int align, pad;
59368c31abSDavid du Colombier void *p;
60368c31abSDavid du Colombier
61368c31abSDavid du Colombier if(n >= IdealAlignment)
62368c31abSDavid du Colombier align = IdealAlignment;
63368c31abSDavid du Colombier else if(n > 8)
64368c31abSDavid du Colombier align = 8;
65368c31abSDavid du Colombier else
66368c31abSDavid du Colombier align = 4;
67368c31abSDavid du Colombier
68368c31abSDavid du Colombier lock(&lk);
69*e538c934SDavid du Colombier pad = (align - (uintptr)buf) & (align-1);
70368c31abSDavid du Colombier if(n + pad > nbuf) {
71368c31abSDavid du Colombier buf = vtmallocz(ChunkSize);
72368c31abSDavid du Colombier nbuf = ChunkSize;
73*e538c934SDavid du Colombier pad = (align - (uintptr)buf) & (align-1);
74368c31abSDavid du Colombier nchunk++;
75368c31abSDavid du Colombier }
76368c31abSDavid du Colombier
77368c31abSDavid du Colombier assert(n + pad <= nbuf);
78368c31abSDavid du Colombier
79368c31abSDavid du Colombier p = buf + pad;
80368c31abSDavid du Colombier buf += pad + n;
81368c31abSDavid du Colombier nbuf -= pad + n;
82368c31abSDavid du Colombier unlock(&lk);
83368c31abSDavid du Colombier
84368c31abSDavid du Colombier return p;
85368c31abSDavid du Colombier }
86368c31abSDavid du Colombier
87