xref: /plan9/sys/src/liboventi/plan9-io.c (revision 225077b0bf393489f69f6689df234a9b945497b7)
1 #include <u.h>
2 #include <libc.h>
3 #include <oventi.h>
4 
5 enum {
6 	IdealAlignment = 32,
7 	ChunkSize 	= 128*1024,
8 };
9 
10 
11 void
vtMemFree(void * p)12 vtMemFree(void *p)
13 {
14 	if(p == 0)
15 		return;
16 	free(p);
17 }
18 
19 
20 void *
vtMemAlloc(int size)21 vtMemAlloc(int size)
22 {
23 	void *p;
24 
25 	p = malloc(size);
26 	if(p == 0)
27 		vtFatal("vtMemAlloc: out of memory");
28 	setmalloctag(p, getcallerpc(&size));
29 	return p;
30 }
31 
32 void *
vtMemAllocZ(int size)33 vtMemAllocZ(int size)
34 {
35 	void *p = vtMemAlloc(size);
36 	memset(p, 0, size);
37 	setmalloctag(p, getcallerpc(&size));
38 	return p;
39 }
40 
41 void *
vtMemRealloc(void * p,int size)42 vtMemRealloc(void *p, int size)
43 {
44 	if(p == nil)
45 		return vtMemAlloc(size);
46 	p = realloc(p, size);
47 	if(p == 0)
48 		vtFatal("vtRealloc: out of memory");
49 	setrealloctag(p, getcallerpc(&size));
50 	return p;
51 }
52 
53 
54 void *
vtMemBrk(int n)55 vtMemBrk(int n)
56 {
57 	static Lock lk;
58 	static uchar *buf;
59 	static int nbuf;
60 	static int nchunk;
61 	int align, pad;
62 	void *p;
63 
64 	if(n >= IdealAlignment)
65 		align = IdealAlignment;
66 	else if(n > 8)
67 		align = 8;
68 	else
69 		align = 4;
70 
71 	lock(&lk);
72 	pad = (align - (uintptr)buf) & (align-1);
73 	if(n + pad > nbuf) {
74 		buf = vtMemAllocZ(ChunkSize);
75 		setmalloctag(buf, getcallerpc(&n));
76 		nbuf = ChunkSize;
77 		pad = (align - (uintptr)buf) & (align-1);
78 		nchunk++;
79 	}
80 
81 	assert(n + pad <= nbuf);
82 
83 	p = buf + pad;
84 	buf += pad + n;
85 	nbuf -= pad + n;
86 	unlock(&lk);
87 
88 	return p;
89 }
90 
91 void
vtThreadSetName(char * name)92 vtThreadSetName(char *name)
93 {
94 	int fd;
95 	char buf[32];
96 
97 	sprint(buf, "/proc/%d/args", getpid());
98 	if((fd = open(buf, OWRITE)) >= 0){
99 		write(fd, name, strlen(name));
100 		close(fd);
101 	}
102 }
103 
104 int
vtFdRead(int fd,uchar * buf,int n)105 vtFdRead(int fd, uchar *buf, int n)
106 {
107 	n = read(fd, buf, n);
108 	if(n < 0) {
109 		vtOSError();
110 		return -1;
111 	}
112 	if(n == 0) {
113 		vtSetError("unexpected EOF");
114 		return 0;
115 	}
116 	return n;
117 }
118 
119 int
vtFdWrite(int fd,uchar * buf,int n)120 vtFdWrite(int fd, uchar *buf, int n)
121 {
122 	int nn;
123 
124 	nn = write(fd, buf, n);
125 	if(nn < 0) {
126 		vtOSError();
127 		return 0;
128 	}
129 	if(n != nn) {
130 		vtSetError("truncated write");
131 		return 0;
132 	}
133 	return 1;
134 }
135 
136 void
vtFdClose(int fd)137 vtFdClose(int fd)
138 {
139 	close(fd);
140 }
141 
142 char *
vtOSError(void)143 vtOSError(void)
144 {
145 	return vtSetError("%r");
146 }
147