sources:
fifo1.cpp (4.0k)
fifo1.h (1.2k)
fifo1_n.cpp (4.0k)
fifonet1_n.cpp (10.2k)
gen1.cpp (1.3k)
gen1.h (443 bytes)
gen1_n.cpp (4.1k)
sink1.cpp (1.4k)
sink1.h (503 bytes)
sink1_n.cpp (3.9k)


website:
more info here


screenshot:
studies/performance/Performance-Code4/fifo1.cpp
download file

  1 //-------------------------------------------------------------
  2 // file: fifo1.cc
  3 // (part of Fifo1 - an OMNeT++ demo simulation)
  4 //-------------------------------------------------------------
  5
  6 #include "fifo1.h"
  7 #include <fstream>
  8
  9 using namespace std;
 10
 11
 12 void FF2AbstractFifo::activity()
 13 {
 14     msgServiced1 = NULL;
 15     msgServiced2 = NULL;
 16     endServiceMsg1 = new cMessage("end-service-server-1");
 17     endServiceMsg2 = new cMessage("end-service-server-2");
 18     recordHistogram = new cMessage("record-histogram");
 19     queue.setName("queue");
 20     hist.setRange(0.0, 50.0);
 21     hist.setNumCells(51);
 22
 23     // send record request
 24     scheduleAt( simTime(), recordHistogram );
 25
 26     for(;;)
 27     {
 28         cMessage *msg = receive();
 29         if (msg==endServiceMsg1)
 30         {
 31             // server 1 has finished a job
 32             endService( msgServiced1 );
 33             if (queue.empty())
 34             {
 35                 msgServiced1 = NULL;
 36             }
 37             else             {
 38                 // new job available => catch it
 39                 msgServiced1 = (cMessage *) queue.pop();
 40                 simtime_t serviceTime = startService( msgServiced1 );
 41                 scheduleAt( simTime()+serviceTime, endServiceMsg1 );
 42             }
 43         }
 44         else if (msg==endServiceMsg2)
 45         {
 46             // server 2 has finished a job
 47             endService( msgServiced2 );
 48             if (queue.empty())
 49             {
 50                 msgServiced2 = NULL;
 51             }
 52             else             {
 53                 // new job available => catch it
 54                 msgServiced2 = (cMessage *) queue.pop();
 55                 simtime_t serviceTime = startService( msgServiced2 );
 56                 scheduleAt( simTime()+serviceTime, endServiceMsg2 );
 57             }
 58         }
 59         else if (msg==recordHistogram)
 60         {
 61             // record current queue length
 62             hist.collect(queue.length());
 63             // resubmit message for next record 0.1s later
 64             scheduleAt( simTime()+0.1, recordHistogram );
 65         }
 66         else if (!msgServiced1)
 67         {
 68             // new job arrival and server 1 is idle => start there
 69             arrival( msg );
 70             msgServiced1 = msg;
 71             simtime_t serviceTime = startService( msgServiced1 );
 72             scheduleAt( simTime()+serviceTime, endServiceMsg1 );
 73
 74         }
 75         else if (!msgServiced2)
 76         {
 77             // new job arrival and server 1 is active, server 2 is idle => start on server 2
 78             arrival( msg );
 79             msgServiced2 = msg;
 80             simtime_t serviceTime = startService( msgServiced2 );
 81             scheduleAt( simTime()+serviceTime, endServiceMsg2 );
 82
 83         }
 84         else         {
 85             // new arrival but no idlle server => queue it
 86             arrival( msg );
 87             queue.insert( msg );
 88         }
 89     }
 90 }
 91
 92 void FF2AbstractFifo::finish()
 93 {
 94     ev << "*** Module: " << fullPath() << "***" << endl;
 95     ev << "Stack allocated: " << stackSize() << " bytes";
 96     ev << " (includes " << ev.extraStackForEnvir() << " bytes for environment)" << endl;
 97     ev << "Stack actually used: " << stackUsage() << " bytes" << endl;
 98
 99     ofstream of(par("hist_file"), ios::app);
100     int samples = hist.samples();
101     int i = 0;
102     int s = 0;
103     of << endl << endl << "*********** new run ***********" << endl << endl << "count: " << samples << endl << "bucket, count, rel. perc" << endl;
104     while ((s<samples) && (i<hist.cells())) {
105         of << i << ", " << (int) hist.cell(i) << ", " << hist.cell(i)/samples << endl;
106         s+=hist.cell(i);
107         i++;
108     }
109 /* FILE *f; f=fopen(par("hist_file"),"a+"); hist.saveToFile(f); fclose(f);*/
110 }
111
112 //------------------------------------------------
113
114 Define_Module( FF2PacketFifo );
115
116 simtime_t FF2PacketFifo::startService(cMessage *msg)
117 {
118     ev << "Starting service of " << msg->name() << endl;
119     return par("service_time");
120 }
121
122 void FF2PacketFifo::endService(cMessage *msg)
123 {
124     ev << "Completed service of " << msg->name() << endl;
125     send( msg, "out" );
126 }
127
128
129