Blame


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