package nachos.ag; import nachos.machine.Lib; import nachos.machine.Machine; import nachos.threads.KThread; import nachos.threads.RoundRobinScheduler; import nachos.threads.ThreadedKernel; /** * <li> ThreadGrader4: <b>WaitUntil</b><br> * <ol type=a> * <li>Test ThreadGrader4.a: Tests waitUntil to ensure it waits at least * minimum amount of time * <li>Test ThreadGrader4.b: Tests whether waitUntil actually wakes up at * correct time * </ol> * </li> * * @author Isaac * */ public class ThreadGrader4 extends BasicTestGrader { static int count = 0; static int total = 0; public void run() { assertTrue(ThreadedKernel.scheduler instanceof RoundRobinScheduler, "this test requires roundrobin scheduler"); /* * Test ThreadGrader4.a: Tests waitUntil to ensure it waits at least * minimum amount of time */ count = 0; total = 1; forkNewThread(new PingTest(500)); while (count != total) { assertTrue(Machine.timer().getTime() < 2500, "Too many ticks wasted on \nTest ThreadGrader4.a"); KThread.yield(); } /* * Test ThreadGrader4.b: Tests whether waitUntil actually wakes up at * correct time */ count = 0; total = 100; for (int i = 0; i < 100; ++i) forkNewThread(new PingTest(Lib.random(1000))); while (count != total) { System.out.println(Machine.timer().getTime()); assertTrue(Machine.timer().getTime() < 80000, "Too many ticks wasted on \nTest ThreadGrader4.b"); KThread.yield(); } done(); } private class PingTest implements Runnable { private long wakeTick = 0; PingTest(int time) { wakeTick = Machine.timer().getTime() + time; ThreadedKernel.alarm.waitUntil(time); } public void run() { assertTrue(Machine.timer().getTime() > wakeTick, "wake up at a wrong time"); ++count; } } }