exit.c 637 B

1234567891011121314151617181920212223242526272829303132
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include "libc.h"
  5. #include "atomic.h"
  6. #include "syscall.h"
  7. static void dummy()
  8. {
  9. }
  10. /* __toread.c, __towrite.c, and atexit.c override these */
  11. weak_alias(dummy, __funcs_on_exit);
  12. weak_alias(dummy, __flush_on_exit);
  13. weak_alias(dummy, __seek_on_exit);
  14. _Noreturn void exit(int code)
  15. {
  16. static int lock;
  17. /* If more than one thread calls exit, hang until _Exit ends it all */
  18. while (a_swap(&lock, 1)) __syscall(SYS_pause);
  19. __funcs_on_exit();
  20. if (libc.fini) libc.fini();
  21. if (libc.ldso_fini) libc.ldso_fini();
  22. __flush_on_exit();
  23. __seek_on_exit();
  24. _Exit(code);
  25. for(;;);
  26. }