diff --git a/src/sys/include/ubixos/sched.h b/src/sys/include/ubixos/sched.h index 827a0e9..cf6c699 100644 --- a/src/sys/include/ubixos/sched.h +++ b/src/sys/include/ubixos/sched.h @@ -65,20 +65,14 @@ tty_term *term; } kTask_t; -typedef struct prioQueue { - kTask_t *start; - kTask_t *end; - struct prioQueue *next; - struct prioQueue *prev; - uInt32 prio; -} prioQueue_t; -#define MAXPRIOLEVELS 11 - -int sched_init(); -int sched_setStatus(pidType,tState); -void sched(); -void sched_yield(); +int sched_init(); +int sched_setStatus(pidType,tState); +int sched_deleteTask(pidType); +int sched_addDelTask(kTask_t *); +kTask_t *sched_getDelTask(); +void sched_yield(); +void sched(); void schedEndTask(pidType pid); kTask_t *schedNewTask(); @@ -92,6 +86,9 @@ /*** $Log$ + Revision 1.27 2004/09/08 21:19:32 reddawg + All good now + Revision 1.26 2004/09/07 21:54:38 reddawg ok reverted back to old scheduling for now.... diff --git a/src/sys/kernel/endtask.c b/src/sys/kernel/endtask.c index aacb9be..1edf660 100644 --- a/src/sys/kernel/endtask.c +++ b/src/sys/kernel/endtask.c @@ -48,6 +48,10 @@ tmpTask = schedFindTask(pid); + if (sched_deleteTask(pid) != 0x0) + kpanic("sched_deleteTask: Failed\n"); + //kprintf("Ending Task: (%i:0x%X)\n",tmpTask->id,tmpTask); + sched_addDelTask(tmpTask); tmpTask->state = DEAD; //tmpTask->term->owner = tmpTask->parentPid; @@ -59,6 +63,9 @@ /*** $Log$ + Revision 1.20 2004/09/07 21:54:38 reddawg + ok reverted back to old scheduling for now.... + Revision 1.19 2004/09/06 22:01:28 reddawg Created functions sched_addDelTask and sched_getDelTask so we can lock the delete task list to prevent corruption of pointers.... a very random case but possible none the less diff --git a/src/sys/kernel/sched.c b/src/sys/kernel/sched.c index 3c625ea..65c5357 100644 --- a/src/sys/kernel/sched.c +++ b/src/sys/kernel/sched.c @@ -41,16 +41,8 @@ #include #include - -static spinLock_t schedSpinLock = SPIN_LOCK_INITIALIZER; -static spinLock_t schedTaskSpinLock = SPIN_LOCK_INITIALIZER; - -static prioQueue_t *prioLevels[MAXPRIOLEVELS - 1]; -static prioQueue_t *prioQStart = 0x0; -static prioQueue_t *prioQEnd = 0x0; -static prioQueue_t *_currentQueue = 0x0; - static kTask_t *taskList = 0x0; +static kTask_t *delList = 0x0; static uInt32 nextID = -1; kTask_t *_current = 0x0; @@ -146,33 +138,44 @@ } -/* - * This is at least O(N)... it was written to - * have it functional; soon it will be changed to O(1). - */ - -int -schedDeleteTask(uInt32 id) { +int sched_deleteTask(pidType id) { kTask_t *tmpTask = 0x0; /* Checking each task from the prio queue */ for (tmpTask = taskList; tmpTask != 0x0; tmpTask = tmpTask->next) { if (tmpTask->id == id) { - if (_current == tmpTask) - kpanic("you can not delete yourself!!!\n"); - if (tmpTask == taskList) - kpanic("Whoa"); - if (tmpTask->prev) + if (tmpTask->prev != 0x0) tmpTask->prev->next = tmpTask->next; - if (tmpTask->next) + if (tmpTask->next != 0x0) tmpTask->next->prev = tmpTask->prev; - kfree(tmpTask->oInfo.cwd); - kfree(tmpTask); + if (taskList == tmpTask) + taskList = tmpTask->next; + return(0x0); } } return(0x1); } + +int sched_addDelTask(kTask_t *tmpTask) { + tmpTask->next = delList; + tmpTask->prev = 0x0; + if (delList != 0x0) + delList->prev = tmpTask; + delList = tmpTask; + return(0x0); + } + +kTask_t *sched_getDelTask() { + kTask_t *tmpTask = 0x0; + + if (delList == 0x0) + return(0x0); + + tmpTask = delList; + delList = delList->next; + return(tmpTask); + } kTask_t * @@ -252,6 +255,9 @@ /*** $Log$ + Revision 1.50 2004/09/08 21:19:32 reddawg + All good now + Revision 1.49 2004/09/07 22:05:59 reddawg only changes I have to contribute diff --git a/src/sys/kernel/syscall.c b/src/sys/kernel/syscall.c index ed2318e..2b72c26 100644 --- a/src/sys/kernel/syscall.c +++ b/src/sys/kernel/syscall.c @@ -128,6 +128,8 @@ kTask_t *tmpTask = schedFindTask(pid); if ((tmpTask != 0x0) && (ptr != 0x0)) *ptr = tmpTask->state; + else + *ptr = 0x0; return; } @@ -188,6 +190,12 @@ /*** $Log$ + Revision 1.29 2004/08/29 21:43:06 reddawg + sched: we now yeild almost propper + syscall: it still uses ebx,ecx,edx + + Boys don't cry + Revision 1.28 2004/08/21 20:06:28 reddawg ok check out exec.c diff --git a/src/sys/kernel/systemtask.c b/src/sys/kernel/systemtask.c index 3bda3c3..343b279 100644 --- a/src/sys/kernel/systemtask.c +++ b/src/sys/kernel/systemtask.c @@ -94,15 +94,15 @@ break; } } - //tmpTask = sched_getDelTask(); + tmpTask = sched_getDelTask(); if (tmpTask != 0x0) { - - //vmmFreeProcessPages(tmpTask->id); + kprintf("Deleting Task: %i\n",tmpTask->id); + vmmFreeProcessPages(tmpTask->id); - /* + if (_current->imageFd) fclose(_current->imageFd); - */ + //kfree(tmpTask->oInfo.cwd); //kfree(tmpTask); @@ -116,6 +116,9 @@ /*** $Log$ + Revision 1.19 2004/09/07 21:54:38 reddawg + ok reverted back to old scheduling for now.... + Revision 1.18 2004/09/06 22:01:28 reddawg Created functions sched_addDelTask and sched_getDelTask so we can lock the delete task list to prevent corruption of pointers.... a very random case but possible none the less