#include #include struct quit_list_node { struct quit_list_node *prev; void (*f)(); }; static struct quit_list_node head = { .f = &_exit_task }; static struct quit_list_node *last = &head; void on_quit(void (*run_f)()) { struct quit_list_node *new = get_block(sizeof(struct quit_list_node)); new->prev = last; new->f = run_f; last = new; } __attribute__ ((noreturn)) void quit() { struct quit_list_node *node = last; while (1) { node->f(); node = node->prev; } }