1
2
3
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
24 scheduleAt( simTime(), recordHistogram );
25
26 for(;;)
27 {
28 cMessage *msg = receive();
29 if (msg==endServiceMsg1)
30 {
31
32 endService( msgServiced1 );
33 if (queue.empty())
34 {
35 msgServiced1 = NULL;
36 }
37 else
{
38
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
47 endService( msgServiced2 );
48 if (queue.empty())
49 {
50 msgServiced2 = NULL;
51 }
52 else
{
53
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
62 hist.collect(queue.length());
63
64 scheduleAt( simTime()+0.1, recordHistogram );
65 }
66 else if (!msgServiced1)
67 {
68
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
78 arrival( msg );
79 msgServiced2 = msg;
80 simtime_t serviceTime = startService( msgServiced2 );
81 scheduleAt( simTime()+serviceTime, endServiceMsg2 );
82
83 }
84 else
{
85
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
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