package nachos.ag; import java.util.Vector; import nachos.machine.Lib; import nachos.machine.Machine; import nachos.threads.Communicator; import nachos.threads.KThread; import nachos.threads.RoundRobinScheduler; import nachos.threads.ThreadedKernel; /** * <li>ThreadGrader2: <b>Communicator</b><br> * <ol type=a> * <li>Test ThreadGrader2.a: Tests your communicator * <li>Test ThreadGrader2.b: Tests your communicator, with more * speakers/listeners * <li>Test ThreadGrader2.c: Tests your communicator, with more * speakers/listneers, and transmits more messages * </ol> * </li> * * @author Isaac * */ public class ThreadGrader2 extends BasicTestGrader { static int total = 0; static int totalMax = 100; static int count = 0; static Vector<Integer> list = new Vector<Integer>(); public void run () { assertTrue(ThreadedKernel.scheduler instanceof RoundRobinScheduler, "this test requires roundrobin scheduler"); com = new Communicator(); /* Test ThreadGrader2.a: Tests your communicator */ total = 1; count = 0; list.clear(); forkNewThread(new a(111)); forkNewThread(new b()); while (count != total) { assertTrue(Machine.timer().getTime() < 2000, "Too many ticks wasted on \nTest ThreadGrader2.a"); KThread.yield(); } /* * Test ThreadGrader2.b: Tests your communicator, with more * speakers/listeners */ total = 2; count = 0; forkNewThread(new a(111)); forkNewThread(new a(222)); forkNewThread(new b()); forkNewThread(new b()); while (count != total) { assertTrue(Machine.timer().getTime() < 2000, "Too many ticks wasted on \nTest ThreadGrader2.b"); KThread.yield(); } /* * Test ThreadGrader2.c: Tests your communicator, with more * speakers/listneers, and transmits more messages */ total = 50; count = 0; int na = 0, nb = 0; for (int i = 0; i < total * 2; ++i) { int tmp = Lib.random(2); if (tmp == 0) { ++na; forkNewThread(new a(i)); } else { ++nb; forkNewThread(new b()); } } if (na < nb) { for (int i = 0; i < nb - na; ++i) forkNewThread(new a(i + total * 2)); } else if (na > nb) { for (int i = 0; i < na - nb; ++i) forkNewThread(new b()); } while (count != total) { assertTrue(Machine.timer().getTime() < 10000, "Too many ticks wasted on \nTest ThreadGrader2.c"); KThread.yield(); } done(); } private Communicator com = null; private class a implements Runnable { int word; public a (int word) { this.word = word; } public void run () { list.add(word); com.speak(word); // System.out.println(KThread.currentThread() + " say " + word); } } private class b implements Runnable { public void run () { int w = com.listen(); assertTrue(list.contains(new Integer(w)), "unknown message received"); list.remove(new Integer(w)); // System.out.println(KThread.currentThread() + " listened " // + com.listen()); ++count; } } }