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