#include "copyright.h" #include "system.h" #include #include #include #include #include "highway.cc" #include "messagebox.h" void p1(); void p2(); //void waitUntil (int); void timerOut(int arg) { scheduler->ReadyToRun((Thread*)arg); } void waitUntil(int tim) { int waitTime = stats->totalTicks + tim; printf("\nThe current time is %d and waitTime is %d\n", stats->totalTicks, waitTime); interrupt->SetLevel(IntOff); interrupt->Schedule(timerOut, (int)currentThread, waitTime, TimerInt); printf("\n The thread waiting is %s", currentThread->getName()); currentThread->Sleep(); printf("\n The thread finished waiting was %s at time %d\n", currentThread->getName(), stats->totalTicks); } void ThreadTest () { srandom (time(NULL)+getpid()); p1(); p2(); //Thread* t1 = new Thread("child1"); //Thread* t2 = new Thread("child2"); //t2->Fork(&waitUntil, 500); //t1->Fork(&waitUntil, 400); //currentThread->Yield(); } 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() { printf("Starting the bridge test..."); Thread** eastbounds = new Thread*[4]; Thread** westbounds = new Thread*[4]; char name[4]; for (int i=0;i<4;i++) { name[0] = i + '0'; name[1] = 'e'; name[2] = 'b'; name[3] = '\0'; printf("%s\n", name); eastbounds[i] = new Thread (name); name[0] = i + '0'; name[1] = 'w'; name[2] = 'b'; name[3] = '\0'; printf("%s\n", name); westbounds[i] = new Thread (name); eastbounds[i]->Fork(eb,0); westbounds[i]->Fork(wb,0); } for (int j=0;j<4;j++) { eastbounds[j]->Join(); westbounds[j]->Join(); } printf("OK, all cars have crossed the bridge!"); } /* Mailbox test....... */ MessageBox* mailbox = new MessageBox(); void sender (int garbage) { int r = (int) random(); randomYield(2); printf("Sending a message: %d\n", r); mailbox->Send(r); printf("Message %d sent.\n", r ); } void receiver (int garbage) { int i; randomYield (3); printf("Looking for a message..."); mailbox->Receive(&i); printf("Received a message: %d\n",i); } void p2 () { printf("Starting the mailbox example\n"); 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(); } printf("OK, all messages have been passed!\n"); }