[task] Actually deschedule tasks that exit
This commit is contained in:
parent
42c9b0e782
commit
fabd941361
|
@ -12,8 +12,7 @@ static int print(char * s) {
|
|||
static int exit(int retval) {
|
||||
/* Deschedule the current task */
|
||||
kprintf("Task (id=%d) exiting with return value %d.\n", getpid(), retval);
|
||||
current_task->retval = retval;
|
||||
current_task->finished = 1;
|
||||
task_exit(retval);
|
||||
while (1) { };
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -257,10 +257,28 @@ enter_user_jmp(uintptr_t location, int argc, char ** argv) {
|
|||
: : "m"(location), "m"(argc), "m"(argv));
|
||||
}
|
||||
|
||||
void kexit(int retval) {
|
||||
kprintf("Kernel task (id=%d) exiting with return value %d.\n", getpid(), retval);
|
||||
void task_exit(int retval) {
|
||||
__asm__ __volatile__ ("cli");
|
||||
current_task->retval = retval;
|
||||
current_task->finished = 1;
|
||||
/* Dequeue us */
|
||||
task_t volatile * temp = ready_queue;
|
||||
task_t volatile * prev = NULL;
|
||||
while (temp != current_task && temp != NULL) {
|
||||
prev = temp;
|
||||
temp = temp->next;
|
||||
}
|
||||
if (prev == NULL) {
|
||||
ready_queue = current_task->next;
|
||||
} else {
|
||||
prev->next = current_task->next;
|
||||
}
|
||||
__asm__ __volatile__ ("sti");
|
||||
}
|
||||
|
||||
void kexit(int retval) {
|
||||
kprintf("Kernel task (id=%d) exiting with return value %d.\n", getpid(), retval);
|
||||
task_exit(retval);
|
||||
while (1) {
|
||||
__asm__ __volatile__("hlt");
|
||||
}
|
||||
|
|
|
@ -191,6 +191,7 @@ extern page_table_t * clone_table(page_table_t * src, uintptr_t * physAddr);
|
|||
extern void move_stack(void *new_stack_start, size_t size);
|
||||
extern task_t * gettask(uint32_t pid);
|
||||
extern void kexit(int retval);
|
||||
extern void task_exit(int retval);
|
||||
|
||||
typedef struct tss_entry {
|
||||
uint32_t prev_tss;
|
||||
|
|
Loading…
Reference in New Issue