blob: 1346126fe90a0ffe3ef0991aa76dd62db46cb738 [file] [log] [blame]
rsc056fe1b2003-11-23 18:19:58 +00001#include <u.h>
2#include <libc.h>
3#include <venti.h>
4
5enum {
6 IdealAlignment = 32,
rsccbeb0b22006-04-01 19:24:03 +00007 ChunkSize = 128*1024
rsc056fe1b2003-11-23 18:19:58 +00008};
9
10
11void
12vtfree(void *p)
13{
14 if(p == 0)
15 return;
16 free(p);
17}
18
19void *
20vtmalloc(int size)
21{
22 void *p;
23
24 p = malloc(size);
25 if(p == 0)
26 sysfatal("vtmalloc: out of memory");
27 setmalloctag(p, getcallerpc(&size));
28 return p;
29}
30
31void *
32vtmallocz(int size)
33{
34 void *p = vtmalloc(size);
35 memset(p, 0, size);
36 setmalloctag(p, getcallerpc(&size));
37 return p;
38}
39
40void *
41vtrealloc(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}
51
52void *
53vtbrk(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;
61
62 if(n >= IdealAlignment)
63 align = IdealAlignment;
64 else if(n > 8)
65 align = 8;
66 else
67 align = 4;
68
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 }
77
78 assert(n + pad <= nbuf);
79
80 p = buf + pad;
81 buf += pad + n;
82 nbuf -= pad + n;
83 unlock(&lk);
84
85 return p;
86}
87