privalloc.c 606 B

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