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;
58 static int nchunk;
59 int align, pad;
60 void *p;
62 if(n >= IdealAlignment)
63 align = IdealAlignment;
64 else if(n > 8)
65 align = 8;
66 else
67 align = 4;
69 lock(&lk);
70 pad = (align - (ulong)buf) & (align-1);
71 if(n + pad > nbuf) {
72 buf = vtmallocz(ChunkSize);
73 nbuf = ChunkSize;
74 pad = (align - (ulong)buf) & (align-1);
75 nchunk++;
76 }
78 assert(n + pad <= nbuf);
80 p = buf + pad;
81 buf += pad + n;
82 nbuf -= pad + n;
83 unlock(&lk);
85 return p;
86 }