]> pd.if.org Git - pdclib/blobdiff - functions/stdlib/atexit.c
Fallback to static array as pre-main malloc() created problems. (_start calls atexit...
[pdclib] / functions / stdlib / atexit.c
index 1ca1e7fa3eeb3e06fd8424d5690854e0eaab4e90..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;
     }
 }
@@ -34,12 +32,33 @@ int atexit( void (*func)( void ) )
 
 #ifdef TEST
 #include <_PDCLIB_test.h>
+#include <assert.h>
+
+static int flags[ 32 ];
+
+static void counthandler()
+{
+    static int rc = 0;
+    flags[ rc ] = rc;
+    ++rc;
+}
+
+static void checkhandler()
+{
+    for ( int i = 0; i < 31; ++i )
+    {
+        assert( flags[ i ] == i );
+    }
+}
 
 int main()
 {
-    int NO_TESTDRIVER = 0;
     BEGIN_TESTS;
-    TESTCASE( NO_TESTDRIVER );
+    TESTCASE( atexit( &checkhandler ) == 0 );
+    for ( int i = 0; i < 31; ++i )
+    {
+        TESTCASE( atexit( &counthandler ) == 0 );
+    }
     return TEST_RESULTS;
 }