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             {
 39                 // new job available => catch it
 40                 msgServiced1 = (cMessage *) queue.pop();
 41                 simtime_t serviceTime = startService( msgServiced1 );
 42                 scheduleAt( simTime()+serviceTime, endServiceMsg1 );
 43             }
 44         }
 45         else if (msg==endServiceMsg2)
 46         {
 47             // server 2 has finished a job
 48             endService( msgServiced2 );
 49             if (queue.empty())
 50             {
 51                 msgServiced2 = NULL;
 52             }
 53             else
 54             {
 55                 // new job available => catch it
 56                 msgServiced2 = (cMessage *) queue.pop();
 57                 simtime_t serviceTime = startService( msgServiced2 );
 58                 scheduleAt( simTime()+serviceTime, endServiceMsg2 );
 59             }
 60         }
 61         else if (msg==recordHistogram)
 62         {
 63             // record current queue length
 64             hist.collect(queue.length());
 65             // resubmit message for next record 0.1s later
 66             scheduleAt( simTime()+0.1, recordHistogram );
 67         }
 68         else if (!msgServiced1)
 69         {
 70             // new job arrival and server 1 is idle => start there
 71             arrival( msg );
 72             msgServiced1 = msg;
 73             simtime_t serviceTime = startService( msgServiced1 );
 74             scheduleAt( simTime()+serviceTime, endServiceMsg1 );
 75
 76         }
 77         else if (!msgServiced2)
 78         {
 79             // new job arrival and server 1 is active, server 2 is idle => start on server 2
 80             arrival( msg );
 81             msgServiced2 = msg;
 82             simtime_t serviceTime = startService( msgServiced2 );
 83             scheduleAt( simTime()+serviceTime, endServiceMsg2 );
 84
 85         }
 86         else
 87         {
 88             // new arrival but no idlle server => queue it
 89             arrival( msg );
 90             queue.insert( msg );
 91         }
 92     }
 93 }
 94
 95 void FF2AbstractFifo::finish()
 96 {
 97     ev << "*** Module: " << fullPath() << "***" << endl;
 98     ev << "Stack allocated: " << stackSize() << " bytes";
 99     ev << " (includes " << ev.extraStackForEnvir() << " bytes for environment)" << endl;
100     ev << "Stack actually used: " << stackUsage() << " bytes" << endl;
101
102     ofstream of(par("hist_file"), ios::app);
103     int samples = hist.samples();
104     int i = 0;
105     int s = 0;
106     of << endl << endl << "*********** new run ***********" << endl << endl << "count: " << samples << endl << "bucket, count, rel. perc" << endl;
107     while ((s<samples) && (i<hist.cells())) {
108         of << i << ", " << (int) hist.cell(i) << ", " << hist.cell(i)/samples << endl;
109         s+=hist.cell(i);
110         i++;
111     }
112 /* FILE *f; f=fopen(par("hist_file"),"a+"); hist.saveToFile(f); fclose(f);*/
113 }
114
115 //------------------------------------------------
116
117 Define_Module( FF2PacketFifo );
118
119 simtime_t FF2PacketFifo::startService(cMessage *msg)
120 {
121     ev << "Starting service of " << msg->name() << endl;
122     return par("service_time");
123 }
124
125 void FF2PacketFifo::endService(cMessage *msg)
126 {
127     ev << "Completed service of " << msg->name() << endl;
128     send( msg, "out" );
129 }
130
131