[task] Actually deschedule tasks that exit

This commit is contained in:
Kevin Lange 2011-04-08 16:26:34 -05:00
parent 42c9b0e782
commit fabd941361
3 changed files with 22 additions and 4 deletions

View File

@ -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;
}

View File

@ -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");
}

View File

@ -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;