diff --git a/src/sys/kernel/sched.c b/src/sys/kernel/sched.c index 79568f8..0389e8c 100644 --- a/src/sys/kernel/sched.c +++ b/src/sys/kernel/sched.c @@ -41,6 +41,7 @@ extern union descriptorTableUnion ubixGDT[5]; static spinLock_t schedSpinLock = SPIN_LOCK_INITIALIZER; +static spinLock_t schedTaskSpinLock = SPIN_LOCK_INITIALIZER; kTask_t *taskList = 0x0; uInt32 nextID = -1; @@ -115,11 +116,11 @@ //kprintf("v86Task\n"); irqDisable(0x0); } - ubixGDT[4].descriptor.baseLow = (memAddr & 0xFFFF); - ubixGDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); - ubixGDT[4].descriptor.baseHigh = (memAddr >> 24); - ubixGDT[4].descriptor.access = '\x89'; - spinUnlock(&schedSpinLock); + ubixGDT[4].descriptor.baseLow = (memAddr & 0xFFFF); + ubixGDT[4].descriptor.baseMed = ((memAddr >> 16) & 0xFF); + ubixGDT[4].descriptor.baseHigh = (memAddr >> 24); + ubixGDT[4].descriptor.access = '\x89'; + spinUnlock(&schedSpinLock); asm("ljmp $0x20,$0\n"); } spinUnlock(&schedSpinLock); @@ -130,6 +131,8 @@ kTask_t *tmpTask = (kTask_t *)kmalloc(sizeof(kTask_t)); kTask_t *listLoop = 0x0; + spinLock(&schedTaskSpinLock); + for (listLoop = taskList; listLoop; listLoop = listLoop->next) { if (0x0 == listLoop->next) { @@ -147,11 +150,14 @@ //tmpTask->oInfo.container = findMount("s"); tmpTask->oInfo.cwd = (char *)kmalloc(1024); + spinUnlock(&schedTaskSpinLock); return(tmpTask); } /* schedNewTask() */ int schedDeleteTask(uInt32 id) { kTask_t *tmpTask = 0x0; + + spinLock(&schedTaskSpinLock); for (tmpTask = taskList; tmpTask; tmpTask=tmpTask->next) { @@ -169,6 +175,7 @@ } /* if tmpTask-> == id */ } /* for */ + spinUnlock(&schedTaskSpinLock); return(0); } /* deleteTask() */ @@ -218,6 +225,9 @@ /*** $Log$ + Revision 1.7 2004/05/21 21:15:04 reddawg + Fixed a few bugs which prevented the system from loadin + Revision 1.6 2004/05/21 15:49:13 reddawg The os does better housekeeping now when a task is exited