xref: /minix3/minix/lib/libc/sys/_exit.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc #include <sys/cdefs.h>
2*433d6423SLionel Sambuc #include "namespace.h"
3*433d6423SLionel Sambuc #include <lib.h>
4*433d6423SLionel Sambuc 
5*433d6423SLionel Sambuc #include <string.h>
6*433d6423SLionel Sambuc #include <unistd.h>
7*433d6423SLionel Sambuc 
8*433d6423SLionel Sambuc #ifdef __weak_alias
9*433d6423SLionel Sambuc __weak_alias(_Exit, _exit)
10*433d6423SLionel Sambuc #endif
11*433d6423SLionel Sambuc 
12*433d6423SLionel Sambuc __dead void _exit(status)
13*433d6423SLionel Sambuc int status;
14*433d6423SLionel Sambuc {
15*433d6423SLionel Sambuc   void (*suicide)(void);
16*433d6423SLionel Sambuc   message m;
17*433d6423SLionel Sambuc 
18*433d6423SLionel Sambuc   memset(&m, 0, sizeof(m));
19*433d6423SLionel Sambuc   m.m_lc_pm_exit.status = status;
20*433d6423SLionel Sambuc   _syscall(PM_PROC_NR, PM_EXIT, &m);
21*433d6423SLionel Sambuc 
22*433d6423SLionel Sambuc   /* If exiting nicely through PM fails for some reason, try to
23*433d6423SLionel Sambuc    * commit suicide. E.g., message to PM might fail due to deadlock.
24*433d6423SLionel Sambuc    */
25*433d6423SLionel Sambuc   suicide = (void (*)(void)) -1;
26*433d6423SLionel Sambuc   suicide();
27*433d6423SLionel Sambuc 
28*433d6423SLionel Sambuc   /* If committing suicide fails for some reason, hang. */
29*433d6423SLionel Sambuc   for(;;) { }
30*433d6423SLionel Sambuc }
31*433d6423SLionel Sambuc 
32