class Scheduler { private: Queue readyList; SpinLock schedulerSpinLock; public: void suspend(SpinLock *lock); void makeReady(Thread *thread); } void Scheduler::suspend(SpinLock *lock) { TCB *chosenTCB; disableInterrupts(); schedulerSpinLock.acquire(); lock->release(); runningThread->state = #\waitingThreadState#; chosenTCB = readyList.getNextThread(); thread_switch(runningThread, chosenTCB); runningThread->state = #\runningThreadState#; schedulerSpinLock.release(); enableInterrupts(); } void Scheduler::makeReady(TCB *thread) { disableInterrupts(); schedulerSpinLock.acquire(); readyList.add(thread); thread->state = #\readyThreadState#; schedulerSpinLock.release(); enableInterrupts(); }