#include <GiaMessageBookkeeping.h>
It is used for timing out old messages and for biased random walk.
Public Member Functions | |
GiaMessageBookkeeping (GiaNeighbors *neighbors, uint timeout) | |
Constructor. | |
~GiaMessageBookkeeping () | |
Destructor. | |
uint | getSize () |
void | addMessage (GiaIDMessage *msg) |
Add GiaMessage to MessageBookkeeping. | |
void | removeMessage (GiaIDMessage *msg) |
Removes GiaMessage from MessageBookkeeping. | |
bool | contains (GiaIDMessage *msg) |
NodeHandle | getNextHop (GiaIDMessage *msg) |
void | removeTimedoutMessages () |
Removes timedout messages from list. | |
Protected Attributes | |
std::map< OverlayKey, MessageItem > | messages |
contains all sent messages | |
GiaNeighbors * | neighbors |
pointer to our neighbor list | |
uint | timeout |
Classes | |
class | GiaNodeQueueCompare |
struct | MessageItem |
GiaMessageBookkeeping::GiaMessageBookkeeping | ( | GiaNeighbors * | neighbors, | |
uint | timeout | |||
) |
uint GiaMessageBookkeeping::getSize | ( | ) |
void GiaMessageBookkeeping::addMessage | ( | GiaIDMessage * | msg | ) |
Add GiaMessage to MessageBookkeeping.
msg | This is a GiaIDMessage |
Referenced by Gia::forwardMessage().
00045 { 00046 assert(!(msg->getID().isUnspecified())); 00047 00048 std::vector<GiaNode> remainNodes; 00049 // push all neighbors except the node where message was comming from 00050 // to remainNodes 00051 for ( uint i=0; i<neighbors->getSize(); i++ ) { 00052 if ( neighbors->get(i).key != msg->getSrcNode().key) 00053 remainNodes.push_back(neighbors->get(i)); 00054 } 00055 MessageItem messageItem; 00056 messageItem.remainNodes = remainNodes; 00057 messageItem.timestamp = simulation.simTime(); 00058 messages[msg->getID()] = messageItem; 00059 }
void GiaMessageBookkeeping::removeMessage | ( | GiaIDMessage * | msg | ) |
Removes GiaMessage from MessageBookkeeping.
msg | This is a GiaIDMessage |
00062 { 00063 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00064 // delete message if key is equal 00065 if ( it->first == msg->getID() ) 00066 messages.erase(messages.find(msg->getID())); 00067 }
bool GiaMessageBookkeeping::contains | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
Referenced by Gia::forwardMessage().
00070 { 00071 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00072 00073 if(it != messages.end()) 00074 return true; 00075 return false; 00076 }
NodeHandle GiaMessageBookkeeping::getNextHop | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
Referenced by Gia::forwardMessage().
00079 { 00080 if ( neighbors->getSize() > 0 ) { 00081 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00082 std::priority_queue<FullGiaNodeInfo, std::vector<FullGiaNodeInfo>, GiaNodeQueueCompare> nodeQueue; 00083 00084 if ( it != messages.end() && it->first == msg->getID() ) { 00085 MessageItem messageItem = it->second; 00086 std::vector<GiaNode> remNodes = messageItem.remainNodes; 00087 if ( remNodes.size() == 0) { 00088 for ( uint i=0; i<neighbors->getSize(); i++ ) { 00089 remNodes.push_back(neighbors->get(i)); 00090 } 00091 } 00092 00093 for ( uint i=0; i<remNodes.size(); i++ ) { 00094 if(!(remNodes[i].isUnspecified())) { 00095 FullGiaNodeInfo temp; 00096 temp.node = remNodes[i]; 00097 temp.info = neighbors->get(temp.node); 00098 if (temp.info) nodeQueue.push(temp); 00099 } 00100 } 00101 00102 if (!nodeQueue.empty()) { 00103 NodeHandle nextHop = nodeQueue.top().node; 00104 GiaNeighborInfo* nextHopInfo = neighbors->get(nextHop); 00105 nodeQueue.pop(); 00106 00107 if (nextHopInfo != NULL && nextHopInfo->receivedTokens > 0 ) { 00108 remNodes.clear(); 00109 while ( !nodeQueue.empty() ) { 00110 remNodes.push_back(nodeQueue.top().node); 00111 nodeQueue.pop(); 00112 } 00113 messageItem.remainNodes = remNodes; 00114 messageItem.timestamp = simulation.simTime(); 00115 messages[msg->getID()] = messageItem; 00116 return nextHop; 00117 } 00118 } 00119 } 00120 } 00121 return NodeHandle::UNSPECIFIED_NODE; 00122 }
void GiaMessageBookkeeping::removeTimedoutMessages | ( | ) |
Removes timedout messages from list.
Referenced by Gia::handleTimerEvent().
00125 { 00126 std::map<OverlayKey, MessageItem>::iterator it = messages.begin(); 00127 std::map<OverlayKey, MessageItem>::iterator it2 = messages.begin(); 00128 for ( uint i=0; i<messages.size(); i++) { 00129 OverlayKey key = it->first; 00130 MessageItem messageItem = it->second; 00131 it2 = it++; 00132 if ( simulation.simTime() > (messageItem.timestamp + timeout)) 00133 messages.erase(it2); 00134 } 00135 }
std::map<OverlayKey, MessageItem> GiaMessageBookkeeping::messages [protected] |
contains all sent messages
Referenced by addMessage(), contains(), getNextHop(), getSize(), removeMessage(), and removeTimedoutMessages().
GiaNeighbors* GiaMessageBookkeeping::neighbors [protected] |
uint GiaMessageBookkeeping::timeout [protected] |
Referenced by removeTimedoutMessages().