package nachos.threads; import nachos.machine.*; import java.util.LinkedList; import java.util.Iterator; /** * A round-robin scheduler tracks waiting threads in FIFO queues, implemented * with linked lists. When a thread begins waiting for access, it is appended * to the end of a list. The next thread to receive access is always the first * thread in the list. This causes access to be given on a first-come * first-serve basis. */ public class RoundRobinScheduler extends Scheduler { /** * Allocate a new round-robin scheduler. */ public RoundRobinScheduler() { } /** * Allocate a new FIFO thread queue. * * @param transferPriority ignored. Round robin schedulers have * no priority. * @return a new FIFO thread queue. */ public ThreadQueue newThreadQueue(boolean transferPriority) { return new FifoQueue(); } private class FifoQueue extends ThreadQueue { /** * Add a thread to the end of the wait queue. * * @param thread the thread to append to the queue. */ public void waitForAccess(KThread thread) { Lib.assertTrue(Machine.interrupt().disabled()); waitQueue.add(thread); } /** * Remove a thread from the beginning of the queue. * * @return the first thread on the queue, or <tt>null</tt> if the * queue is * empty. */ public KThread nextThread() { Lib.assertTrue(Machine.interrupt().disabled()); if (waitQueue.isEmpty()) return null; return (KThread) waitQueue.removeFirst(); } /** * The specified thread has received exclusive access, without using * <tt>waitForAccess()</tt> or <tt>nextThread()</tt>. Assert that no * threads are waiting for access. */ public void acquire(KThread thread) { Lib.assertTrue(Machine.interrupt().disabled()); Lib.assertTrue(waitQueue.isEmpty()); } /** * Print out the contents of the queue. */ public void print() { Lib.assertTrue(Machine.interrupt().disabled()); for (Iterator i=waitQueue.iterator(); i.hasNext(); ) System.out.print((KThread) i.next() + " "); } private LinkedList<KThread> waitQueue = new LinkedList<KThread>(); } }