/* * Get the next runnable thread from the run queue. * This is the scheduler. */ struct Kernel_Thread* Get_Next_Runnable(void) { struct Kernel_Thread* best = 0; best = Find_Best(&s_runQueue); KASSERT(best != 0); Remove_Thread(&s_runQueue, best); /* * Print("Scheduling %x\n", best); */ return best; }
/* * Wake up a single thread waiting on given wait queue * (if there are any threads waiting). Chooses the highest priority thread. * Interrupts must be disabled! */ void Wake_Up_Thread(struct Thread_Queue* waitQueue, int pid) { struct Kernel_Thread* thread = Lookup_Thread(pid);; KASSERT(!Interrupts_Enabled()); if (thread != 0) { Remove_Thread(waitQueue, thread); Make_Runnable(thread); /*Print("Wake_Up_One: waking up %x from %x\n", best, g_currentThread); */ } }
/* * Wake up a single thread waiting on given wait queue * (if there are any threads waiting). Chooses the highest priority thread. * Interrupts must be disabled! */ void Wake_Up_One(struct Thread_Queue* waitQueue) { struct Kernel_Thread* best; KASSERT(!Interrupts_Enabled()); best = Find_Best(waitQueue); if (best != 0) { Remove_Thread(waitQueue, best); Make_Runnable(best); /*Print("Wake_Up_One: waking up %x from %x\n", best, g_currentThread); */ } }
/* * Get the next runnable thread from the run queue. * This is the scheduler. */ struct Kernel_Thread* Get_Next_Runnable(void) { struct Kernel_Thread* best = 0; int i; for(i = 0; i < MAX_QUEUE_LEVEL; i++) { best = Find_Best(&s_runQueue[i]); if(best != 0) break; } KASSERT(best != 0); Remove_Thread(&s_runQueue[i], best); //Print("Scheduling %x %x", best->pid, best->currentReadyQueue); return best; }