X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstdlib.c;h=e05ddc2d4ed07316e1958507402cd992f91df514;hb=7a70e3527bc012c065959382187c2361624e1911;hp=6e81c654ea82b905e50c70f56e40ed23486837da;hpb=479d0634670b58da044bc58149662adba0ad1d0b;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stdlib.c b/Usermode/Libraries/libc.so_src/stdlib.c index 6e81c654..e05ddc2d 100644 --- a/Usermode/Libraries/libc.so_src/stdlib.c +++ b/Usermode/Libraries/libc.so_src/stdlib.c @@ -7,21 +7,34 @@ #include #include "lib.h" -extern void *_crt0_exit_handler; +extern void _stdio_cleanup(void); + +#define MAX_ATEXIT_HANDLERS 64 // Standard defines >=32 // === PROTOTYPES === EXPORT int atoi(const char *str); EXPORT void exit(int status); // === GLOBALS === -void (*g_stdlib_exithandler)(void); +typedef void (*stdlib_exithandler_t)(void); +stdlib_exithandler_t g_stdlib_exithandlers[MAX_ATEXIT_HANDLERS]; + int g_stdlib_num_exithandlers; // === CODE === -void atexit(void (*__func)(void)) +void _call_atexit_handlers(void) +{ + int i; + for( i = g_stdlib_num_exithandlers; i --; ) + g_stdlib_exithandlers[i](); + _stdio_cleanup(); +} + +EXPORT void atexit(void (*__func)(void)) { - g_stdlib_exithandler = __func; - // TODO: Replace with meta-function to allow multiple atexit() handlers - _crt0_exit_handler = __func; + if( g_stdlib_num_exithandlers < MAX_ATEXIT_HANDLERS ) + { + g_stdlib_exithandlers[g_stdlib_num_exithandlers++] = __func; + } } /** @@ -30,8 +43,7 @@ void atexit(void (*__func)(void)) */ EXPORT void exit(int status) { - if( g_stdlib_exithandler ) - g_stdlib_exithandler(); + _call_atexit_handlers(); _exit(status); }