Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <venti.h>
4
 
5
enum {
6
	IdealAlignment = 32,
7
	ChunkSize 	= 128*1024
8
};
9
 
10
 
11
void
12
vtfree(void *p)
13
{
14
	if(p == 0)
15
		return;
16
	free(p);
17
}
18
 
19
void *
20
vtmalloc(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
 
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
}
39
 
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
}
51
 
52
void *
53
vtbrk(int n)
54
{
55
	static Lock lk;
56
	static uchar *buf;
57
	static int nbuf, nchunk;
58
	int align, pad;
59
	void *p;
60
 
61
	if(n >= IdealAlignment)
62
		align = IdealAlignment;
63
	else if(n > 8)
64
		align = 8;
65
	else	
66
		align = 4;
67
 
68
	lock(&lk);
69
	pad = (align - (uintptr)buf) & (align-1);
70
	if(n + pad > nbuf) {
71
		buf = vtmallocz(ChunkSize);
72
		nbuf = ChunkSize;
73
		pad = (align - (uintptr)buf) & (align-1);
74
		nchunk++;
75
	}
76
 
77
	assert(n + pad <= nbuf);	
78
 
79
	p = buf + pad;
80
	buf += pad + n;
81
	nbuf -= pad + n;
82
	unlock(&lk);
83
 
84
	return p;
85
}
86