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