atexit.c 776 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <u.h>
  2. #include <libc.h>
  3. #define NEXIT 33
  4. typedef struct Onex Onex;
  5. struct Onex{
  6. void (*f)(void);
  7. int pid;
  8. };
  9. static Lock onexlock;
  10. Onex onex[NEXIT];
  11. int
  12. atexit(void (*f)(void))
  13. {
  14. int i;
  15. lock(&onexlock);
  16. for(i=0; i<NEXIT; i++)
  17. if(onex[i].f == 0) {
  18. onex[i].pid = getpid();
  19. onex[i].f = f;
  20. unlock(&onexlock);
  21. return 1;
  22. }
  23. unlock(&onexlock);
  24. return 0;
  25. }
  26. void
  27. atexitdont(void (*f)(void))
  28. {
  29. int i, pid;
  30. pid = getpid();
  31. for(i=0; i<NEXIT; i++)
  32. if(onex[i].f == f && onex[i].pid == pid)
  33. onex[i].f = 0;
  34. }
  35. #pragma profile off
  36. void
  37. exits(char *s)
  38. {
  39. int i, pid;
  40. void (*f)(void);
  41. pid = getpid();
  42. for(i = NEXIT-1; i >= 0; i--)
  43. if((f = onex[i].f) && pid == onex[i].pid) {
  44. onex[i].f = 0;
  45. (*f)();
  46. }
  47. _exits(s);
  48. }
  49. #pragma profile on