2014-07-28 00:09:31 +00:00
|
|
|
|
2014-08-08 00:58:41 +00:00
|
|
|
#include <stdint.h>
|
2014-07-28 00:09:31 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
2014-08-08 00:58:41 +00:00
|
|
|
#include <syscall.h>
|
|
|
|
|
2014-09-05 01:22:04 +00:00
|
|
|
struct atexit_cb {
|
|
|
|
struct atexit_cb *next;
|
|
|
|
void (*cb)(void);
|
|
|
|
};
|
|
|
|
|
|
|
|
static uint64_t _atexit_count = 0;
|
|
|
|
static struct atexit_cb _atexits[32]; // POSIX requires at least 32 atexit functions
|
|
|
|
static struct atexit_cb *_atexit_last = NULL;
|
|
|
|
|
2014-07-28 00:09:31 +00:00
|
|
|
int
|
|
|
|
atexit(void (*function)(void))
|
|
|
|
{
|
2014-09-05 01:22:04 +00:00
|
|
|
if (_atexit_count < 32) {
|
|
|
|
struct atexit_cb *prev = _atexit_last;
|
|
|
|
|
|
|
|
_atexits[_atexit_count].cb = function;
|
|
|
|
_atexits[_atexit_count].next = prev;
|
|
|
|
|
|
|
|
_atexit_last = &_atexits[_atexit_count];
|
|
|
|
_atexit_count++;
|
|
|
|
} else {
|
|
|
|
// XXX: Support malloc
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2014-07-28 00:09:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
exit(int status)
|
|
|
|
{
|
2014-09-05 01:22:04 +00:00
|
|
|
while (_atexit_last != NULL) {
|
|
|
|
(_atexit_last->cb)();
|
|
|
|
_atexit_last = _atexit_last->next;
|
|
|
|
}
|
2014-07-28 00:09:31 +00:00
|
|
|
|
2014-08-08 00:58:41 +00:00
|
|
|
SystemExit(status);
|
|
|
|
|
2014-07-28 00:09:31 +00:00
|
|
|
__builtin_unreachable();
|
|
|
|
}
|
|
|
|
|