-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathServerNode.cc
94 lines (66 loc) · 2.51 KB
/
ServerNode.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "ServerNode.h"
#include <cmath>
#include <iomanip>
Define_Module(ServerNode);
void ServerNode::initialize()
{
processing_delay=par("processingDelay").doubleValue();
queue_size=par("queueSize").intValue();
watts_per_second=par("wattsConsumePerSecond").intValue();
scheduleEvent = new cMessage("scheduleEvent");
}
void ServerNode::handleMessage(cMessage *msg)
{
if (! msg->isSelfMessage() ){
addToQueue(msg);
if (!scheduleEvent->isScheduled())
scheduleAt(simTime()+processing_delay, scheduleEvent); //wait until get last message in queue
}
else if (msg == scheduleEvent && !waitingMessagePool.empty()){
msg = waitingMessagePool.front();
waitingMessagePool.pop(); //take the message
forwardMessage(msg);
scheduleAt(simTime()+processing_delay, scheduleEvent);
}
else{
}
}
void ServerNode::addToQueue(cMessage *msg){
if (waitingMessagePool.size() < queue_size)
{
sum_utilize_time+=processing_delay;
EV<<"sum processing time: "+sum_utilize_time.str()<<endl;
waitingMessagePool.push(msg);
}
else
{
bubble(("Queue full, deleted image -" + functions.getMessageID(msg)).c_str());
delete msg;
}
}
void ServerNode::forwardMessage(cMessage *msg)
{
EV << "msg sent at " << getName() << " - " << (simTime().dbl() ) << endl;
std::string outputGateName = functions.getDestGate(std::string(this->getName()), std::string(msg->getArrivalGate()->getName()), msg);
msg->setName(("image-" + functions.getMessageID(msg) + " processed " + functions.getPcName(msg)).c_str());
bubble(("Image served with id: " + functions.getMessageID(msg)).c_str());
send(msg, outputGateName.c_str());
}
ServerNode::~ServerNode()
{
while (!waitingMessagePool.empty()) {
cMessage* msg = waitingMessagePool.front();
waitingMessagePool.pop();
delete msg;
}
if (scheduleEvent) {
cancelAndDelete(scheduleEvent);
scheduleEvent = nullptr;
}
}
void ServerNode::finish() {
double utlztime=measurments.getServerUtilizationPrecent(sum_utilize_time.dbl(),waitingMessagePool.size(),processing_delay);
double powr_cunsume=measurments.getPowerConsume(sum_utilize_time, watts_per_second);
EV << "server power consume: " << std::fixed << std::setprecision(1) << powr_cunsume << " Joule" << endl;
EV << "server ulitization: " << std::fixed << std::setprecision(2) << utlztime << "%\n";
}