#include "copyright.h" #include "system.h" #include #include #include #include "highway.cc" #include "mailbox.h" void p1(); void p2(); void waitUntil (int); void ThreadTest () { srandom (time(NULL)+getpid()); p1(); p2(); } void randomYield (int mod) { /* Yield 1/mod percent of the time */ int r = ((int) random()) % mod; if (r == 0) { currentThread->Yield(); /* Set the priority to something random. This doesn't make sense, but hey, who cares? */ currentThread->setPriority (r); } } /* Bridge Test */ void eb (int garbage) { ArriveBridge (WEST); randomYield(4); CrossBridge(WEST); waitUntil(2); ExitBridge(WEST); randomYield (5); } void wb (int garbage) { ArriveBridge (WEST); waitUntil (1); CrossBridge(WEST); randomYield (3); ExitBridge(WEST); randomYield (5); } void p1() { cout << "Starting the bridge test..." << endl; Thread** eastbounds = new Thread*[4]; Thread** westbounds = new Thread*[4]; for (int i=0;i<4;i++) { eastbounds[i] = new Thread ("eb"); westbounds[i] = new Thread ("wb"); eastbounds[i]->Fork(eb,0); westbounds[i]->Fork(wb,0); } for (int j=0;j<4;j++) { eastbounds[j]->Join(); westbounds[j]->Join(); } cout << "OK, all cars have crossed the bridge!" << endl; } /* Mailbox test....... */ Mailbox* mailbox = new Mailbox(); void sender (int garbage) { int r = (int) random(); randomYield(2); cout << "Sending a message: " << r << endl; mailbox->Send (r); cout << "Message " << r << " sent." << endl; } void receiver (int garbage) { int i; randomYield (3); cout << "Looking for a message..." << endl; mailbox->Receive (&i); cout << "Received a message: " << i << endl; } void ps2 () { cout << "Starting the mailbox example" << endl; Thread** receivers = new Thread*[4]; Thread** senders = new Thread*[4]; for (int k=0;k<4;k++) { receivers[k] = new Thread("r"); senders[k] = new Thread ("s"); receivers[k]->Fork (receiver,0); senders[k]->Fork (sender,0); } for (int j=0;j<4;j++) { senders[j]->Join(); receivers[j]->Join(); } cout << "OK, all messages have been passed!" << endl; }