//------------------------------------------------------------- // file: fifo1.cc // (part of Fifo1 - an OMNeT++ demo simulation) //------------------------------------------------------------- #include "fifo1.h" #include using namespace std; void FF2AbstractFifo::activity() { msgServiced1 = NULL; msgServiced2 = NULL; endServiceMsg1 = new cMessage("end-service-server-1"); endServiceMsg2 = new cMessage("end-service-server-2"); recordHistogram = new cMessage("record-histogram"); queue.setName("queue"); hist.setRange(0.0, 50.0); hist.setNumCells(51); // send record request scheduleAt( simTime(), recordHistogram ); for(;;) { cMessage *msg = receive(); if (msg==endServiceMsg1) { // server 1 has finished a job endService( msgServiced1 ); if (queue.empty()) { msgServiced1 = NULL; } else { // new job available => catch it msgServiced1 = (cMessage *) queue.pop(); simtime_t serviceTime = startService( msgServiced1 ); scheduleAt( simTime()+serviceTime, endServiceMsg1 ); } } else if (msg==endServiceMsg2) { // server 2 has finished a job endService( msgServiced2 ); if (queue.empty()) { msgServiced2 = NULL; } else { // new job available => catch it msgServiced2 = (cMessage *) queue.pop(); simtime_t serviceTime = startService( msgServiced2 ); scheduleAt( simTime()+serviceTime, endServiceMsg2 ); } } else if (msg==recordHistogram) { // record current queue length hist.collect(queue.length()); // resubmit message for next record 0.1s later scheduleAt( simTime()+0.1, recordHistogram ); } else if (!msgServiced1) { // new job arrival and server 1 is idle => start there arrival( msg ); msgServiced1 = msg; simtime_t serviceTime = startService( msgServiced1 ); scheduleAt( simTime()+serviceTime, endServiceMsg1 ); } else if (!msgServiced2) { // new job arrival and server 1 is active, server 2 is idle => start on server 2 arrival( msg ); msgServiced2 = msg; simtime_t serviceTime = startService( msgServiced2 ); scheduleAt( simTime()+serviceTime, endServiceMsg2 ); } else { // new arrival but no idlle server => queue it arrival( msg ); queue.insert( msg ); } } } void FF2AbstractFifo::finish() { ev << "*** Module: " << fullPath() << "***" << endl; ev << "Stack allocated: " << stackSize() << " bytes"; ev << " (includes " << ev.extraStackForEnvir() << " bytes for environment)" << endl; ev << "Stack actually used: " << stackUsage() << " bytes" << endl; ofstream of(par("hist_file"), ios::app); int samples = hist.samples(); int i = 0; int s = 0; of << endl << endl << "*********** new run ***********" << endl << endl << "count: " << samples << endl << "bucket, count, rel. perc" << endl; while ((sname() << endl; return par("service_time"); } void FF2PacketFifo::endService(cMessage *msg) { ev << "Completed service of " << msg->name() << endl; send( msg, "out" ); }