]> pd.if.org Git - pdclib/commitdiff
Fallback to static array as pre-main malloc() created problems. (_start calls atexit...
authorsolar <unknown>
Sun, 5 Feb 2006 21:37:24 +0000 (21:37 +0000)
committersolar <unknown>
Sun, 5 Feb 2006 21:37:24 +0000 (21:37 +0000)
functions/stdlib/atexit.c
functions/stdlib/exit.c

index 14363566a8147dba4f6c6c7962a9c62ea26eb61f..0d61e32a818f39c9f6645f279bd6331ab5bfdb4a 100644 (file)
 
 #ifndef REGTEST
 
-extern struct _PDCLIB_exitfunc_t * regstack;
+extern void (*_PDCLIB_regstack[])( void );
+extern size_t _PDCLIB_regptr;
 
 int atexit( void (*func)( void ) )
 {
-    struct _PDCLIB_exitfunc_t * regfunc = (struct _PDCLIB_exitfunc_t *)malloc( sizeof( struct _PDCLIB_exitfunc_t ) );
-    if ( regfunc == NULL )
+    if ( _PDCLIB_regptr == 0 )
     {
         return -1;
     }
     else
     {
-        regfunc->func = func;
-       regfunc->next = regstack;
-       regstack = regfunc;
+        _PDCLIB_regstack[ --_PDCLIB_regptr ] = func;
        return 0;
     }
 }
index 969b795f7100fa92de5b503f225060c5de92493f..0d816a3bba1a6ecd9b9b867bfc0fbe4ab0d22479 100644 (file)
    functions that had already been called at the time it was registered.
 */
 
-struct _PDCLIB_exitfunc_t * regstack = NULL;
+/* TODO: 32 is guaranteed. This should be dynamic but ATM gives problems
+   with my malloc.
+*/
+#define NUMBER_OF_SLOTS 40
+
+void (*_PDCLIB_regstack[ NUMBER_OF_SLOTS ])( void );
+size_t _PDCLIB_regptr = NUMBER_OF_SLOTS;
 
 void exit( int status )
 {
-    struct _PDCLIB_exitfunc_t * next = regstack;
-    while ( next != NULL )
+    while ( _PDCLIB_regptr < NUMBER_OF_SLOTS )
     {
-        next->func();
-        regstack = next->next;
-        free( next );
-        next = regstack;
+        _PDCLIB_regstack[ _PDCLIB_regptr++ ]();
     }
     _Exit( status );
 }