31 lines
690 B
C
31 lines
690 B
C
#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();
|
|
}
|