package nachos.ag;
import nachos.machine.Machine;
import nachos.threads.KThread;
import nachos.threads.RoundRobinScheduler;
import nachos.threads.ThreadedKernel;
/**
* <li>ThreadGrader3: <b>Join</b><br>
* <ol type=a>
* <li>Test ThreadGrader3.a: Tries a join on thread x before x actually runs
* <li>Test ThreadGrader3.b: Tries a join on thread x after x has completed
* </ol>
* </li>
*
* @author Isaac
*
*/
public class ThreadGrader3 extends BasicTestGrader
{
static StringBuffer buf = null;
void run ()
{
assertTrue(ThreadedKernel.scheduler instanceof RoundRobinScheduler,
"this test requires roundrobin scheduler");
/* Test ThreadGrader3.a: Tries a join on thread x before x actually runs */
buf = new StringBuffer();
ThreadHandler t1 = forkNewThread(new PingTest(1));
t1.thread.join();
forkNewThread(new PingTest(0));
while (buf.length() < 10)
{
assertTrue(Machine.timer().getTime() < 1500,
"Too many ticks wasted on \nTest ThreadGrader3.a");
KThread.yield();
}
assertTrue(buf.toString().equals("1111100000"),
"sequence error in execution");
/* Test ThreadGrader3.b: Tries a join on thread x after x has completed */
buf = new StringBuffer();
ThreadHandler t2 = forkNewThread(new PingTest(1));
forkNewThread(new PingTest(0));
t2.thread.join();
while (buf.length() < 10)
{
assertTrue(Machine.timer().getTime() < 2000,
"Too many ticks wasted on \nTest ThreadGrader3.b");
System.out.println(buf.toString());
KThread.yield();
}
assertTrue(buf.toString().equals("1010101010"),
"sequence error in execution");
done();
}
private static class PingTest implements Runnable
{
PingTest (int which)
{
this.which = which;
}
public void run ()
{
for (int i = 0; i < 5; i++)
{
buf.append(which);
KThread.yield();
}
}
private int which;
}
}