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)12privalloc(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)32privfree(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