1368c31abSDavid du Colombier #include <u.h>
2368c31abSDavid du Colombier #include <libc.h>
3368c31abSDavid du Colombier #include <oventi.h>
4368c31abSDavid du Colombier
5368c31abSDavid du Colombier enum {
6368c31abSDavid du Colombier IdealAlignment = 32,
7368c31abSDavid du Colombier ChunkSize = 128*1024,
8368c31abSDavid du Colombier };
9368c31abSDavid du Colombier
10368c31abSDavid du Colombier
11368c31abSDavid du Colombier void
vtMemFree(void * p)12368c31abSDavid du Colombier vtMemFree(void *p)
13368c31abSDavid du Colombier {
14368c31abSDavid du Colombier if(p == 0)
15368c31abSDavid du Colombier return;
16368c31abSDavid du Colombier free(p);
17368c31abSDavid du Colombier }
18368c31abSDavid du Colombier
19368c31abSDavid du Colombier
20368c31abSDavid du Colombier void *
vtMemAlloc(int size)21368c31abSDavid du Colombier vtMemAlloc(int size)
22368c31abSDavid du Colombier {
23368c31abSDavid du Colombier void *p;
24368c31abSDavid du Colombier
25368c31abSDavid du Colombier p = malloc(size);
26368c31abSDavid du Colombier if(p == 0)
27368c31abSDavid du Colombier vtFatal("vtMemAlloc: out of memory");
28*225077b0SDavid du Colombier setmalloctag(p, getcallerpc(&size));
29368c31abSDavid du Colombier return p;
30368c31abSDavid du Colombier }
31368c31abSDavid du Colombier
32368c31abSDavid du Colombier void *
vtMemAllocZ(int size)33368c31abSDavid du Colombier vtMemAllocZ(int size)
34368c31abSDavid du Colombier {
35368c31abSDavid du Colombier void *p = vtMemAlloc(size);
36368c31abSDavid du Colombier memset(p, 0, size);
37*225077b0SDavid du Colombier setmalloctag(p, getcallerpc(&size));
38368c31abSDavid du Colombier return p;
39368c31abSDavid du Colombier }
40368c31abSDavid du Colombier
41368c31abSDavid du Colombier void *
vtMemRealloc(void * p,int size)42368c31abSDavid du Colombier vtMemRealloc(void *p, int size)
43368c31abSDavid du Colombier {
44368c31abSDavid du Colombier if(p == nil)
45368c31abSDavid du Colombier return vtMemAlloc(size);
46368c31abSDavid du Colombier p = realloc(p, size);
47368c31abSDavid du Colombier if(p == 0)
48368c31abSDavid du Colombier vtFatal("vtRealloc: out of memory");
49*225077b0SDavid du Colombier setrealloctag(p, getcallerpc(&size));
50368c31abSDavid du Colombier return p;
51368c31abSDavid du Colombier }
52368c31abSDavid du Colombier
53368c31abSDavid du Colombier
54368c31abSDavid du Colombier void *
vtMemBrk(int n)55368c31abSDavid du Colombier vtMemBrk(int n)
56368c31abSDavid du Colombier {
57368c31abSDavid du Colombier static Lock lk;
58368c31abSDavid du Colombier static uchar *buf;
59368c31abSDavid du Colombier static int nbuf;
60368c31abSDavid du Colombier static int nchunk;
61368c31abSDavid du Colombier int align, pad;
62368c31abSDavid du Colombier void *p;
63368c31abSDavid du Colombier
64368c31abSDavid du Colombier if(n >= IdealAlignment)
65368c31abSDavid du Colombier align = IdealAlignment;
66368c31abSDavid du Colombier else if(n > 8)
67368c31abSDavid du Colombier align = 8;
68368c31abSDavid du Colombier else
69368c31abSDavid du Colombier align = 4;
70368c31abSDavid du Colombier
71368c31abSDavid du Colombier lock(&lk);
72368c31abSDavid du Colombier pad = (align - (uintptr)buf) & (align-1);
73368c31abSDavid du Colombier if(n + pad > nbuf) {
74368c31abSDavid du Colombier buf = vtMemAllocZ(ChunkSize);
75*225077b0SDavid du Colombier setmalloctag(buf, getcallerpc(&n));
76368c31abSDavid du Colombier nbuf = ChunkSize;
77368c31abSDavid du Colombier pad = (align - (uintptr)buf) & (align-1);
78368c31abSDavid du Colombier nchunk++;
79368c31abSDavid du Colombier }
80368c31abSDavid du Colombier
81368c31abSDavid du Colombier assert(n + pad <= nbuf);
82368c31abSDavid du Colombier
83368c31abSDavid du Colombier p = buf + pad;
84368c31abSDavid du Colombier buf += pad + n;
85368c31abSDavid du Colombier nbuf -= pad + n;
86368c31abSDavid du Colombier unlock(&lk);
87368c31abSDavid du Colombier
88368c31abSDavid du Colombier return p;
89368c31abSDavid du Colombier }
90368c31abSDavid du Colombier
91368c31abSDavid du Colombier void
vtThreadSetName(char * name)92368c31abSDavid du Colombier vtThreadSetName(char *name)
93368c31abSDavid du Colombier {
94368c31abSDavid du Colombier int fd;
95368c31abSDavid du Colombier char buf[32];
96368c31abSDavid du Colombier
97368c31abSDavid du Colombier sprint(buf, "/proc/%d/args", getpid());
98368c31abSDavid du Colombier if((fd = open(buf, OWRITE)) >= 0){
99368c31abSDavid du Colombier write(fd, name, strlen(name));
100368c31abSDavid du Colombier close(fd);
101368c31abSDavid du Colombier }
102368c31abSDavid du Colombier }
103368c31abSDavid du Colombier
104368c31abSDavid du Colombier int
vtFdRead(int fd,uchar * buf,int n)105368c31abSDavid du Colombier vtFdRead(int fd, uchar *buf, int n)
106368c31abSDavid du Colombier {
107368c31abSDavid du Colombier n = read(fd, buf, n);
108368c31abSDavid du Colombier if(n < 0) {
109368c31abSDavid du Colombier vtOSError();
110368c31abSDavid du Colombier return -1;
111368c31abSDavid du Colombier }
112368c31abSDavid du Colombier if(n == 0) {
113368c31abSDavid du Colombier vtSetError("unexpected EOF");
114368c31abSDavid du Colombier return 0;
115368c31abSDavid du Colombier }
116368c31abSDavid du Colombier return n;
117368c31abSDavid du Colombier }
118368c31abSDavid du Colombier
119368c31abSDavid du Colombier int
vtFdWrite(int fd,uchar * buf,int n)120368c31abSDavid du Colombier vtFdWrite(int fd, uchar *buf, int n)
121368c31abSDavid du Colombier {
122368c31abSDavid du Colombier int nn;
123368c31abSDavid du Colombier
124368c31abSDavid du Colombier nn = write(fd, buf, n);
125368c31abSDavid du Colombier if(nn < 0) {
126368c31abSDavid du Colombier vtOSError();
127368c31abSDavid du Colombier return 0;
128368c31abSDavid du Colombier }
129368c31abSDavid du Colombier if(n != nn) {
130368c31abSDavid du Colombier vtSetError("truncated write");
131368c31abSDavid du Colombier return 0;
132368c31abSDavid du Colombier }
133368c31abSDavid du Colombier return 1;
134368c31abSDavid du Colombier }
135368c31abSDavid du Colombier
136368c31abSDavid du Colombier void
vtFdClose(int fd)137368c31abSDavid du Colombier vtFdClose(int fd)
138368c31abSDavid du Colombier {
139368c31abSDavid du Colombier close(fd);
140368c31abSDavid du Colombier }
141368c31abSDavid du Colombier
142368c31abSDavid du Colombier char *
vtOSError(void)143368c31abSDavid du Colombier vtOSError(void)
144368c31abSDavid du Colombier {
145368c31abSDavid du Colombier return vtSetError("%r");
146368c31abSDavid du Colombier }
147