xref: /plan9-contrib/sys/src/libc/9sys/privalloc.c (revision c204c7e651dc5def3bf1749813b88a1a8bc39b1d)
1 #include <u.h>
2 #include <libc.h>
3 
4 static Lock	privlock;
5 static int	privinit;
6 static u32int	privmap;
7 
8 extern void	**_privates;
9 extern int	_nprivates;
10 
11 void **
privalloc(void)12 privalloc(void)
13 {
14 	void **p;
15 	int i;
16 
17 	lock(&privlock);
18 	for(i = 0; i < 32 && i < _nprivates; i++){
19 		if((privmap & (1<<i)) == 0){
20 			privmap |= 1<<i;
21 			unlock(&privlock);
22 			p = &_privates[i];
23 			*p = nil;
24 			return p;
25 		}
26 	}
27 	unlock(&privlock);
28 	return nil;
29 }
30 
31 void
privfree(void ** p)32 privfree(void **p)
33 {
34 	int i;
35 
36 	if(p != nil){
37 		i = p - _privates;
38 		if(i < 0 || i > _nprivates || (privmap & (1<<i)) == 0)
39 			abort();
40 		lock(&privlock);
41 		privmap &= ~(1<<i);
42 		unlock(&privlock);
43 	}
44 }
45