xref: /plan9/sys/src/libc/9sys/privalloc.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1 #include <u.h>
2 #include <libc.h>
3 
4 static Lock	privlock;
5 static int	privinit;
6 static void	**privs;
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 	if(!privinit){
19 		privinit = 1;
20 		if(_nprivates){
21 			_privates[0] = 0;
22 			for(i = 1; i < _nprivates; i++)
23 				_privates[i] = &_privates[i - 1];
24 			privs = &_privates[i - 1];
25 		}
26 	}
27 	p = privs;
28 	if(p != nil){
29 		privs = *p;
30 		*p = nil;
31 	}
32 	unlock(&privlock);
33 	return p;
34 }
35 
36 void
privfree(void ** p)37 privfree(void **p)
38 {
39 	lock(&privlock);
40 	if(p != nil && privinit){
41 		*p = privs;
42 		privs = p;
43 	}
44 	unlock(&privlock);
45 }
46