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 cbeb0b26 2006-04-01 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 f7cca882 2011-06-07 rsc static int nbuf, nchunk;
58 056fe1ba 2003-11-23 devnull int align, pad;
59 056fe1ba 2003-11-23 devnull void *p;
60 056fe1ba 2003-11-23 devnull
61 056fe1ba 2003-11-23 devnull if(n >= IdealAlignment)
62 056fe1ba 2003-11-23 devnull align = IdealAlignment;
63 056fe1ba 2003-11-23 devnull else if(n > 8)
64 056fe1ba 2003-11-23 devnull align = 8;
65 fa325e9b 2020-01-10 cross else
66 056fe1ba 2003-11-23 devnull align = 4;
67 056fe1ba 2003-11-23 devnull
68 056fe1ba 2003-11-23 devnull lock(&lk);
69 f7cca882 2011-06-07 rsc pad = (align - (uintptr)buf) & (align-1);
70 056fe1ba 2003-11-23 devnull if(n + pad > nbuf) {
71 056fe1ba 2003-11-23 devnull buf = vtmallocz(ChunkSize);
72 056fe1ba 2003-11-23 devnull nbuf = ChunkSize;
73 f7cca882 2011-06-07 rsc pad = (align - (uintptr)buf) & (align-1);
74 056fe1ba 2003-11-23 devnull nchunk++;
75 056fe1ba 2003-11-23 devnull }
76 056fe1ba 2003-11-23 devnull
77 fa325e9b 2020-01-10 cross assert(n + pad <= nbuf);
78 fa325e9b 2020-01-10 cross
79 056fe1ba 2003-11-23 devnull p = buf + pad;
80 056fe1ba 2003-11-23 devnull buf += pad + n;
81 056fe1ba 2003-11-23 devnull nbuf -= pad + n;
82 056fe1ba 2003-11-23 devnull unlock(&lk);
83 056fe1ba 2003-11-23 devnull
84 056fe1ba 2003-11-23 devnull return p;
85 056fe1ba 2003-11-23 devnull }