Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <venti.h>
5 enum {
6 IdealAlignment = 32,
7 ChunkSize = 128*1024
8 };
11 void
12 vtfree(void *p)
13 {
14 if(p == 0)
15 return;
16 free(p);
17 }
19 void *
20 vtmalloc(int size)
21 {
22 void *p;
24 p = malloc(size);
25 if(p == 0)
26 sysfatal("vtmalloc: out of memory");
27 setmalloctag(p, getcallerpc(&size));
28 return p;
29 }
31 void *
32 vtmallocz(int size)
33 {
34 void *p = vtmalloc(size);
35 memset(p, 0, size);
36 setmalloctag(p, getcallerpc(&size));
37 return p;
38 }
40 void *
41 vtrealloc(void *p, int size)
42 {
43 if(p == nil)
44 return vtmalloc(size);
45 p = realloc(p, size);
46 if(p == 0)
47 sysfatal("vtMemRealloc: out of memory");
48 setrealloctag(p, getcallerpc(&size));
49 return p;
50 }
52 void *
53 vtbrk(int n)
54 {
55 static Lock lk;
56 static uchar *buf;
57 static int nbuf, nchunk;
58 int align, pad;
59 void *p;
61 if(n >= IdealAlignment)
62 align = IdealAlignment;
63 else if(n > 8)
64 align = 8;
65 else
66 align = 4;
68 lock(&lk);
69 pad = (align - (uintptr)buf) & (align-1);
70 if(n + pad > nbuf) {
71 buf = vtmallocz(ChunkSize);
72 nbuf = ChunkSize;
73 pad = (align - (uintptr)buf) & (align-1);
74 nchunk++;
75 }
77 assert(n + pad <= nbuf);
79 p = buf + pad;
80 buf += pad + n;
81 nbuf -= pad + n;
82 unlock(&lk);
84 return p;
85 }