diff --git a/src/sys/kernel/sched.c b/src/sys/kernel/sched.c index e548e25..dff3f11 100644 --- a/src/sys/kernel/sched.c +++ b/src/sys/kernel/sched.c @@ -65,7 +65,7 @@ ************************************************************************/ -int sched_init() { +int sched_init() { taskList = (kTask_t *)kmalloc(sizeof(kTask_t)); if(taskList == 0x0) kpanic("Unable to create task list"); @@ -85,11 +85,13 @@ kTask_t *tmpTask = 0x0; kTask_t *delTask = 0x0; - if (!spinTryLock(&schedulerSpinLock)) - return; - + //if (!spinTryLock(&schedulerSpinLock)) + // return; + spinLock(&schedulerSpinLock); + + tmpTask = _current->next; - //outportByte(0xE9,_current->id + '0'); + schedStart: /* Yield the next task from the current prio queue */ @@ -104,7 +106,6 @@ { delTask = tmpTask; tmpTask = tmpTask->next; - //sched_deleteTask(delTask->id); if (delTask->prev != 0x0) delTask->prev->next = delTask->next; @@ -114,16 +115,21 @@ taskList = delTask->next; - sched_addDelTask(delTask); + vmmFreeProcessPages(delTask->id); + if (delTask->imageFd != 0x0) + fclose(delTask->imageFd); + kfree(delTask); + goto schedStart; } } /* Finished all the tasks, restarting the list */ - if (0x0 == tmpTask) { + if (tmpTask == NULL) { tmpTask = taskList; goto schedStart; } + spinUnlock(&schedulerSpinLock); if (_current->state > 0x0) { @@ -135,14 +141,10 @@ ubixGDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); ubixGDT[4].descriptor.baseHigh = (memAddr >> 24); ubixGDT[4].descriptor.access = '\x89'; - spinUnlock(&schedulerSpinLock); asm("sti"); asm("ljmp $0x20,$0\n"); } - else - { - spinUnlock(&schedulerSpinLock); - } + spinUnlock(&schedulerSpinLock); return; } @@ -277,7 +279,8 @@ Notes: ************************************************************************/ -int sched_setStatus(pidType pid,tState state) { +int sched_setStatus(pidType pid,tState state) +{ kTask_t *tmpTask = schedFindTask(pid); if (tmpTask == 0x0) return(0x1); @@ -285,6 +288,14 @@ return(0x0); } +int sched_setStatus2(kTask_t *task, tState state) +{ + if(task == 0x0) + return 0x1; + task->state = state; + return 0x0; +} + /*** END ***/ diff --git a/src/sys/kernel/systemtask.c b/src/sys/kernel/systemtask.c index 85980f1..615ea63 100644 --- a/src/sys/kernel/systemtask.c +++ b/src/sys/kernel/systemtask.c @@ -46,7 +46,7 @@ uInt32 counter = 0x0; int i = 0x0; int *x = 0x0; - + kTask_t *tmpTask = 0x0; if (mpi_createMbox("system") != 0x0) { kpanic("Error: Error creating mailbox: system\n"); } @@ -92,7 +92,19 @@ break; } } +/* + tmpTask = sched_getDelTask(); + + if (tmpTask != 0x0) { + vmmFreeProcessPages(tmpTask->id); + + if (tmpTask->imageFd != 0x0) + fclose(tmpTask->imageFd); + + kfree(tmpTask); + } +*/ sched_yield(); }