Select Git revision
chartspage.cpp
dp3n18 authored
chartspage.cpp 10.84 KiB
#include "chartspage.h"
#include "packet.h"
ChartsPage::ChartsPage(bool isSys,bool isFPGA, bool isMbox, bool isCore, bool isThread, int boardX,int boardY,int mboxX,int mboxY,int coreID, int threadID,int maxValues) {
this->boardX = boardX;
this->boardY = boardY;
this->mboxXA = mboxX;
this->mboxYA = mboxY;
this->coreid = coreID;
this->threadid = threadID;
this->maxValues = maxValues;
if (isSys) {
this->isSys = true;
this->isFpga = false;
this->isMbox = false;
this->isCore = false;
this->isThread = false;
}
else if (isFPGA) {
this->isSys = false;
this->isFpga = true;
this->isMbox = false;
this->isCore = false;
this->isThread = false;
}
else if (isMbox) {
this->isSys = false;
this->isFpga = false;
this->isMbox = true;
this->isCore = false;
this->isThread = false;
}
else if (isCore) {
this->isSys = false;
this->isFpga = false;
this->isMbox = false;
this->isCore = true;
this->isThread = false;
}
else if (isThread){
this->isSys = false;
this->isFpga = false;
this->isMbox = false;
this->isCore = false;
this->isThread = true;
}
}
void ChartsPage::receivePacket(Packet &p) {
// check the page type, then check ID values, either add packet values to buffers or skip.
if (this->isSys) {
//accept all packets
//lock and update buffers
queueLock.lock();
recLock.lock();
utilLock.lock();
chrLock.lock();
msentBuffer.enqueue(p.messagesSent);
this->mreceivedBuffer.enqueue(p.messagesReceived);
this->utilBuffer.enqueue(p.Utilization);
this->chrBuffer.enqueue(p.CacheHitRate);
//all the same size so if one is over limit then dequeue
if (this->msentBuffer.size() > this->maxValues) {
msentBuffer.dequeue();
}
if (this->mreceivedBuffer.size() > this->maxValues) {
mreceivedBuffer.dequeue();
}
if (this->utilBuffer.size() > this->maxValues) {
utilBuffer.dequeue();
}
if (this->chrBuffer.size() > this->maxValues) {
chrBuffer.dequeue();
}
queueLock.unlock();
recLock.unlock();
utilLock.unlock();
chrLock.unlock();
}
else if (this->isFpga) {
//only accept data from particular fpga from sender.
if (p.BoardX == this->boardX && p.BoardY == this->boardY) {
//accept
queueLock.lock();
recLock.lock();
utilLock.lock();
chrLock.lock();
msentBuffer.enqueue(p.messagesSent);
this->mreceivedBuffer.enqueue(p.messagesReceived);
this->utilBuffer.enqueue(p.Utilization);
this->chrBuffer.enqueue(p.CacheHitRate);
//all the same size so if one is over limit then dequeue
if (this->msentBuffer.size() > this->maxValues) {
msentBuffer.dequeue();
}
if (this->mreceivedBuffer.size() > this->maxValues) {
mreceivedBuffer.dequeue();
}
if (this->utilBuffer.size() > this->maxValues) {
utilBuffer.dequeue();
}
if (this->chrBuffer.size() > this->maxValues) {
chrBuffer.dequeue();
}
queueLock.unlock();
recLock.unlock();
utilLock.unlock();
chrLock.unlock();;
}
}
else if (this->isMbox) {
int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA ) {
//accept
queueLock.lock();
recLock.lock();
utilLock.lock();
chrLock.lock();
msentBuffer.enqueue(p.messagesSent);
this->mreceivedBuffer.enqueue(p.messagesReceived);
this->utilBuffer.enqueue(p.Utilization);
this->chrBuffer.enqueue(p.CacheHitRate);
//all the same size so if one is over limit then dequeue
if (this->msentBuffer.size() > this->maxValues) {
msentBuffer.dequeue();
}
if (this->mreceivedBuffer.size() > this->maxValues) {
mreceivedBuffer.dequeue();
}
if (this->utilBuffer.size() > this->maxValues) {
utilBuffer.dequeue();
}
if (this->chrBuffer.size() > this->maxValues) {
chrBuffer.dequeue();
}
queueLock.unlock();
recLock.unlock();
utilLock.unlock();
chrLock.unlock();
}
}
else if (this->isCore) {
int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA&&p.core == this->coreid) {
//acept
//accept
queueLock.lock();
recLock.lock();
utilLock.lock();
chrLock.lock();
msentBuffer.enqueue(p.messagesSent);
this->mreceivedBuffer.enqueue(p.messagesReceived);
this->utilBuffer.enqueue(p.Utilization);
this->chrBuffer.enqueue(p.CacheHitRate);
//all the same size so if one is over limit then dequeue
if (this->msentBuffer.size() > this->maxValues) {
msentBuffer.dequeue();
}
if (this->mreceivedBuffer.size() > this->maxValues) {
mreceivedBuffer.dequeue();
}
if (this->utilBuffer.size() > this->maxValues) {
utilBuffer.dequeue();
}
if (this->chrBuffer.size() > this->maxValues) {
chrBuffer.dequeue();
}
queueLock.unlock();
recLock.unlock();
utilLock.unlock();
chrLock.unlock();
}
}
else if (this->isThread) {
int packetMboxAbsX = 4 * p.BoardX + p.mboxX;
int packetMboxAbsY = 4 * p.BoardY + p.mboxY;
if (packetMboxAbsX == this->mboxXA && packetMboxAbsY == this->mboxYA && p.core == this->coreid && p.thread == this->threadid) {
//accept
queueLock.lock();
recLock.lock();
utilLock.lock();
chrLock.lock();
msentBuffer.enqueue(p.messagesSent);
this->mreceivedBuffer.enqueue(p.messagesReceived);
this->utilBuffer.enqueue(p.Utilization);
this->chrBuffer.enqueue(p.CacheHitRate);
//all the same size so if one is over limit then dequeue
if (this->msentBuffer.size() > this->maxValues) {
msentBuffer.dequeue();
}
if (this->mreceivedBuffer.size() > this->maxValues) {
mreceivedBuffer.dequeue();
}
if (this->utilBuffer.size() > this->maxValues) {
utilBuffer.dequeue();
}
if (this->chrBuffer.size() > this->maxValues) {
chrBuffer.dequeue();
}
queueLock.unlock();
recLock.unlock();
utilLock.unlock();
chrLock.unlock();
}
}
}
float ChartsPage::dequeueSentElement() {
queueLock.lock();
float get;
if (!msentBuffer.isEmpty()) {
get = msentBuffer.dequeue();
}
else {
get = 0;
}
queueLock.unlock();
return get;
}
float ChartsPage::dequeueRecElement() {
recLock.lock();
float get;
if (!mreceivedBuffer.isEmpty()) {
get = mreceivedBuffer.dequeue();
}
else {
get = 0;
}
recLock.unlock();
return get;
}
float ChartsPage::dequeueUtilElement() {
utilLock.lock();
float get;
if (!utilBuffer.isEmpty()) {
get = utilBuffer.dequeue();
}
else {
get = 0;
}
utilLock.unlock();
return get;
}
float ChartsPage::dequeueCHRElement() {
chrLock.lock();
float get;
if (!chrBuffer.isEmpty()) {
get = chrBuffer.dequeue();
}
else {
get = 0;
}
chrLock.unlock();
return get;
}
float ChartsPage::reCalculateSent() {
queueLock.lock();
if (this->msentBuffer.size() > 0) {
this->msent = std::accumulate(std::begin(msentBuffer), std::end(msentBuffer), 0.0) / maxValues;
// msentBuffer.enqueue(0); //for constnat data flow. REMOVE IF SENDER IS CONSTANTLY SENDING PACKETS CONSISTENTLY AND EVENLY.
msentBuffer.dequeue();
//msentBuffer.clear();
}
else {
this->msent = 0;
}
queueLock.unlock();
return msent;
}
float ChartsPage::reCalculateReceived() {
recLock.lock();
if (this->mreceivedBuffer.size() >0) {
this->mreceived = std::accumulate(std::begin(mreceivedBuffer), std::end(mreceivedBuffer), 0.0) / maxValues;
// msentBuffer.clear();
mreceivedBuffer.dequeue();
}
else {
this->mreceived= 0;
}
recLock.unlock();
return mreceived;
}
float ChartsPage::reCalculateCHR() {
//mutex.lock();
chrLock.lock();
if (chrBuffer.size() > 0){
this->chr = std::accumulate(std::begin(chrBuffer), std::end(chrBuffer), 0.0) / maxValues;
//built in for a smooth flow of data...
chrBuffer.dequeue();
}
else {
this->chr = 0;
}
chrLock.unlock();
return this->chr;
}
float ChartsPage::reCalculateutil() {
utilLock.lock();
if (this->utilBuffer.size() > 0) {
this->util = std::accumulate(std::begin(utilBuffer), std::end(utilBuffer), 0.0) / maxValues;
//utilBuffer.clear();
utilBuffer.dequeue();
}
else {
util = 0;
}
utilLock.unlock();
return util;
}
ChartsPage::~ChartsPage() {
}