diff options
author | Nicholas <nbnoll@eml.cc> | 2021-11-20 17:07:23 -0800 |
---|---|---|
committer | Nicholas <nbnoll@eml.cc> | 2021-11-20 17:07:23 -0800 |
commit | c9a32c1a43d2bdded07eaa45732c3a6e195a5442 (patch) | |
tree | cb7e9cb8c34cbe6551b801eff4201afcf71dd0fd /sys/rt/exit.c | |
parent | e97c8c469db0aa27985dab2879dc1f14905c7387 (diff) |
Chore: cleaned up the exit code to cleanly interface with libc
We use weak linking to ensure we clean up at exit time correctly. If
libc is linked, then we call our cleanup function by registering an
atexit callback with the library. If libc is not linked, we have a weak
symbol that results in a noop. Similarly, if we call rt·exit while
linked with libc, this immediately calls libc's exit (which will call
our cleanup as we registered it). If we are not linked to libc, exit()
is given as a weak link to a noop function.
Diffstat (limited to 'sys/rt/exit.c')
-rw-r--r-- | sys/rt/exit.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/rt/exit.c b/sys/rt/exit.c index e6027b7..386a1bf 100644 --- a/sys/rt/exit.c +++ b/sys/rt/exit.c @@ -2,10 +2,13 @@ #include <rt.h> #include <syscall.h> -/* XXX: - * if we are here, we are in charge, call exit syscalls - * think of better way to encapsulate these syscalls? - */ +/* tell linker to go find */ +void noreturn exit(int code); + +/* if did not call rt·atexit, then don't pull it in */ +static void noop(void){} +weakalias(noop, rt·clean); + static noreturn void rt·shutdown(int code) { @@ -14,14 +17,18 @@ rt·shutdown(int code) if(rt·context.exit) rt·context.exit(); + /* XXX: better way to encapsulate these calls? */ _syscall1(·ExitGroup, code); for(;;) _syscall1(·Exit, code); } -weakalias(rt·shutdown, exit); noreturn void rt·exit(int code) { - rt·shutdown(code); + /* ring libc, anyone home? */ + exit(code); + /* if we are here, we are in charge, shut it down */ + rt·clean(); + rt·shutdown(code); } |