diff options
Diffstat (limited to 'core/thread/exit_thread.c')
-rw-r--r-- | core/thread/exit_thread.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/core/thread/exit_thread.c b/core/thread/exit_thread.c new file mode 100644 index 00000000..d9fd83ad --- /dev/null +++ b/core/thread/exit_thread.c @@ -0,0 +1,30 @@ +#include <limits.h> +#include <stdlib.h> +#include <klibc/compiler.h> +#include "thread.h" +#include "core.h" + +__noreturn __exit_thread(void) +{ + struct thread *curr = current(); + + cli(); + + /* Remove from the linked list */ + curr->list.prev->next = curr->list.next; + curr->list.next->prev = curr->list.prev; + + /* Free allocated stacks (note: free(NULL) is permitted and safe). */ + free(curr->stack); + free(curr->rmstack); + + /* + * Note: __schedule() can explictly handle the case where + * curr isn't part of the linked list anymore, as long as + * curr->list.next is still valid. + */ + __schedule(); + + /* We should never get here */ + kaboom(); +} |