package nachos.ag; import nachos.machine.Lib; import nachos.machine.Machine; import nachos.threads.KThread; import nachos.threads.ThreadedKernel; /** * A grader for priority scheduling. * * @author Sangxia Huang */ public class LotteryGraderS extends PriorityGraderS1 { protected class LotteryTreeNode extends PriorityGraderS1.TreeNode { public LotteryTreeNode (int priority, TreeNode parent, ThreadHandler th) { super(priority, parent, th); } public int getPriority () { return priority + currentDonate; } public void addChild (TreeNode c) { children.add(c); c.parent = this; c.time = Machine.timer().getTime(); currentDonate += c.getPriority(); if (parent != null) parent.update(); } public void update () { int temp = 0; for (TreeNode child : children) temp += child.getPriority(); currentDonate = temp; if (parent != null) parent.update(); } public void releaseChild (TreeNode x) { Lib.assertTrue(parent == null); x.parent = null; currentDonate -= x.getPriority(); children.remove(x); } } public PriorityGraderS1.TreeNode getTreeNode (int priority, TreeNode parent, ThreadHandler th) { return new LotteryTreeNode(priority, parent, th); } @Override public int getRandomPriority () { return Lib.random(10) + 1; } @Override public void runningThread (KThread thread) { super.runningThread(thread, false); } @Override public void assertCorrectScheduler () { assertTrue(ThreadedKernel.scheduler.getClass().getSimpleName().equals( "LotteryScheduler"), "This test need LotteryScheduler."); } }