blob: 92f11c5e69e4387bbe20167d867698a3a01c0b98 [file] [log] [blame]
/*
* exit.c
*
* exit(), including the handling of the atexit chain.
*/
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include "atexit.h"
/* Link chain for atexit/on_exit */
struct atexit *__atexit_list;
__noreturn exit(int rv)
{
struct atexit *ap;
for (ap = __atexit_list; ap; ap = ap->next) {
/* This assumes extra args are harmless. They should
be in all normal C ABIs, but if an architecture has
some particularly bizarre ABI this might be worth
watching out for. */
ap->fctn(rv, ap->arg);
}
/* Handle any library destructors if we ever start using them... */
_exit(rv);
}