atexit.c 772 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. atexit(void (*f)(void))
  12. {
  13. int i;
  14. lock(&onexlock);
  15. for(i=0; i<NEXIT; i++)
  16. if(onex[i].f == 0) {
  17. onex[i].pid = getpid();
  18. onex[i].f = f;
  19. unlock(&onexlock);
  20. return 1;
  21. }
  22. unlock(&onexlock);
  23. return 0;
  24. }
  25. void
  26. atexitdont(void (*f)(void))
  27. {
  28. int i, pid;
  29. pid = getpid();
  30. for(i=0; i<NEXIT; i++)
  31. if(onex[i].f == f && onex[i].pid == pid)
  32. onex[i].f = 0;
  33. }
  34. #pragma profile off
  35. void
  36. exits(char *s)
  37. {
  38. int i, pid;
  39. void (*f)(void);
  40. pid = getpid();
  41. for(i = NEXIT-1; i >= 0; i--)
  42. if((f = onex[i].f) && pid == onex[i].pid) {
  43. onex[i].f = 0;
  44. (*f)();
  45. }
  46. _exits(s);
  47. }
  48. #pragma profile on