package nachos.ag; import java.util.HashMap; import java.util.Map; import nachos.machine.Lib; import nachos.machine.Machine; import nachos.threads.KThread; import nachos.threads.ThreadedKernel; /** * Some utilty functions for TestGrader * * @author Kang Zhang */ public abstract class BasicTestGrader extends AutoGrader { Map<KThread, ThreadHandler> handlers = new HashMap<KThread, ThreadHandler>(); ThreadHandler currentHandler = null; protected class ThreadHandler { KThread thread; public boolean finished = false; public ThreadHandler (KThread thread) { this.thread = thread; handlers.put(thread, this); } } protected ThreadHandler getThreadHandler (KThread thread) { ThreadHandler r = handlers.get(thread); if (r == null) r = new ThreadHandler(thread); return r; } @Override public void runningThread (KThread thread) { super.runningThread(thread); ThreadHandler handler = getThreadHandler(thread); currentHandler = handler; } @Override public void finishingCurrentThread () { super.finishingCurrentThread(); currentHandler.finished = true; handlers.remove(currentHandler.thread); } protected ThreadHandler forkNewThread (Runnable threadContent) { return forkNewThread(threadContent, 1); } protected ThreadHandler forkNewThread (Runnable threadContent, int priority) { KThread thread = new KThread(threadContent); ThreadHandler handler = getThreadHandler(thread); thread.setName("TestThread"); boolean intStatus = Machine.interrupt().disable(); ThreadedKernel.scheduler.setPriority(thread, priority); thread.fork(); Machine.interrupt().restore(intStatus); return handler; } protected void assertTrue (boolean val, String errMsg) { Lib.assertTrue(val, errMsg); } }