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
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
48 endService( msgServiced2 );
49 if (queue.empty())
50 {
51 msgServiced2 = NULL;
52 }
53 else
54 {
55
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
64 hist.collect(queue.length());
65
66 scheduleAt( simTime()+0.1, recordHistogram );
67 }
68 else if (!msgServiced1)
69 {
70
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
80 arrival( msg );
81 msgServiced2 = msg;
82 simtime_t serviceTime = startService( msgServiced2 );
83 scheduleAt( simTime()+serviceTime, endServiceMsg2 );
84
85 }
86 else
87 {
88
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
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