summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/atexit.c
diff options
context:
space:
mode:
authorGwenolé Beauchesne <gbeauchesne@mandriva.org>2003-06-04 18:31:57 +0000
committerGwenolé Beauchesne <gbeauchesne@mandriva.org>2003-06-04 18:31:57 +0000
commit09e967c2d732783b2579e4e120cd9b608404cb00 (patch)
tree8d2783a6a7e33608c6012efd6a88b8f5694df81d /mdk-stage1/dietlibc/lib/atexit.c
parent18fcff49d3c836697d3b75a3d01d31c700e69974 (diff)
downloaddrakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar
drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.gz
drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.bz2
drakx-09e967c2d732783b2579e4e120cd9b608404cb00.tar.xz
drakx-09e967c2d732783b2579e4e120cd9b608404cb00.zip
Merge from R9_0-AMD64, most notably:
- AMD64 support to insmod-busybox, minilibc, et al. - Sync with insmod-modutils 2.4.19 something but everyone should use dietlibc nowadays - Factor out compilation and prefix with $(DIET) for dietlibc builds - 64-bit & varargs fixes
Diffstat (limited to 'mdk-stage1/dietlibc/lib/atexit.c')
-rw-r--r--mdk-stage1/dietlibc/lib/atexit.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c
index 8204af06c..e0eef19c6 100644
--- a/mdk-stage1/dietlibc/lib/atexit.c
+++ b/mdk-stage1/dietlibc/lib/atexit.c
@@ -1,23 +1,31 @@
+#include <stdlib.h>
+
typedef void (*function)(void);
-static function __atexitlist[4];
+#define NUM_ATEXIT 32
+
+static function __atexitlist[NUM_ATEXIT];
+static int atexit_counter = 0;
int atexit(function t) {
- int i;
- for (i=0; i<4; i++)
- if (__atexitlist[i]==0) {
- __atexitlist[i]=t;
- return 0;
- }
+ if (atexit_counter<NUM_ATEXIT) {
+ __atexitlist[atexit_counter]=t;
+ ++atexit_counter;
+ return 0;
+ }
return -1;
}
extern void _exit(int code) __attribute__((noreturn));
+extern void __thread_doexit();
-void exit(int code) {
- if (__atexitlist[3]) __atexitlist[3]();
- if (__atexitlist[2]) __atexitlist[2]();
- if (__atexitlist[1]) __atexitlist[1]();
- if (__atexitlist[0]) __atexitlist[0]();
+void __libc_exit(int code);
+void __libc_exit(int code) {
+ register int i=atexit_counter;
+ __thread_doexit();
+ while(i) {
+ __atexitlist[--i]();
+ }
_exit(code);
}
+void exit(int code) __attribute__((alias("__libc_exit")));