xref: /plan9/sys/src/liboventi/plan9-io.c (revision 225077b0bf393489f69f6689df234a9b945497b7)
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