| /* |
| * This test program will register the maximum number of exit functions |
| * with atexit(). When this program exits, each exit function should get |
| * called in the reverse order in which it was registered. (If the system |
| * supports more than 25 exit functions, the function names will loop, but |
| * the effect will be the same. Feel free to add more functions if desired) |
| */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| typedef void (*vfuncp) (void); |
| |
| /* All functions call exit(), in order to test that exit functions can call |
| * exit() without screwing everything up. :) |
| */ |
| #define make_exitfunc(num) \ |
| __attribute__ ((__noreturn__)) static \ |
| void exitfunc##num(void) \ |
| { \ |
| printf("Executing exitfunc"#num".\n"); \ |
| exit(0); \ |
| } |
| make_exitfunc(0) |
| make_exitfunc(1) |
| make_exitfunc(2) |
| make_exitfunc(3) |
| make_exitfunc(4) |
| make_exitfunc(5) |
| make_exitfunc(6) |
| make_exitfunc(7) |
| make_exitfunc(8) |
| make_exitfunc(9) |
| make_exitfunc(10) |
| make_exitfunc(11) |
| make_exitfunc(12) |
| make_exitfunc(13) |
| make_exitfunc(14) |
| make_exitfunc(15) |
| make_exitfunc(16) |
| make_exitfunc(17) |
| make_exitfunc(18) |
| make_exitfunc(19) |
| make_exitfunc(20) |
| make_exitfunc(21) |
| make_exitfunc(22) |
| make_exitfunc(23) |
| make_exitfunc(24) |
| |
| static vfuncp func_table[] = |
| { |
| exitfunc0, exitfunc1, exitfunc2, exitfunc3, exitfunc4, |
| exitfunc5, exitfunc6, exitfunc7, exitfunc8, exitfunc9, |
| exitfunc10, exitfunc11, exitfunc12, exitfunc13, exitfunc14, |
| exitfunc15, exitfunc16, exitfunc17, exitfunc18, exitfunc19, |
| exitfunc20, exitfunc21, exitfunc22, exitfunc23, exitfunc24 |
| }; |
| |
| /* glibc dynamically adds exit functions, so it will keep adding until |
| * it runs out of memory! So this will limit the number of exit functions |
| * we add in the loop below. uClibc has a set limit (currently 20), so the |
| * loop will go until it can't add any more (so it should not hit this limit). |
| */ |
| #define ATEXIT_LIMIT 20 |
| |
| int |
| main ( void ) |
| { |
| int i = 0; |
| int count = 0; |
| int numfuncs = sizeof(func_table)/sizeof(vfuncp); |
| |
| /* loop until no more can be added */ |
| while(count < ATEXIT_LIMIT && atexit(func_table[i]) >= 0) { |
| printf("Registered exitfunc%d with atexit()\n", i); |
| count++; |
| i = (i+1) % numfuncs; |
| } |
| printf("%d functions registered with atexit.\n", count); |
| |
| return 0; |
| } |