package nachos.ag; import java.util.HashSet; import java.util.Set; import nachos.machine.Lib; import nachos.machine.Machine; import nachos.threads.KThread; import nachos.threads.LotteryScheduler; import nachos.threads.ThreadedKernel; /** * <li>ThreadGrader7: <b>Lottery Scheduling</b><br> * <ol type=a> * <li>Test ThreadGrader7.a: Tests lottery scheduler without donation * <li>Test ThreadGrader7.b: Tests lottery scheduler without donation, altering * priorities of threads after they've started running * </ol> * </li> * * @author Isaac * */ public class ThreadGrader7 extends BasicTestGrader { static int total = 0; static int count = 0; Set<ThreadHandler> set = new HashSet<ThreadHandler>(); public void run () { assertTrue(ThreadedKernel.scheduler instanceof LotteryScheduler, "this test requires lottery scheduler"); /* Test ThreadGrader7.a: Tests lottery scheduler without donation */ total = 200; count = 0; set.clear(); for (int i = 0; i < total; ++i) set.add(forkNewThread(new a())); for (ThreadHandler t : set) t.thread.join(); assertTrue(count == total, "not all threads finished in \nTest ThreadGrader7.a"); /* * Test ThreadGrader7.b: Tests lottery scheduler without donation, altering * priorities of threads after they've started running */ total = 200; count = 0; set.clear(); boolean intStatus = Machine.interrupt().disable(); for (int i = 0; i < total; ++i) set.add(forkNewThread(new a(), Lib.random(10000))); Machine.interrupt().restore(intStatus); for (ThreadHandler t : set) t.thread.join(); assertTrue(count == total, "not all threads finished \nTest ThreadGrader7.b"); done(); } private class a implements Runnable { public void run () { KThread.yield(); ++count; } } }