#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 |
00043 { 00044 assert(!(msg->getID().isUnspecified())); 00045 00046 std::vector<GiaNode> remainNodes; 00047 // push all neighbors except the node where message was comming from 00048 // to remainNodes 00049 for ( uint i=0; i<neighbors->getSize(); i++ ) { 00050 if ( neighbors->get(i).key != msg->getSrcNode().key) 00051 remainNodes.push_back(neighbors->get(i)); 00052 } 00053 MessageItem messageItem; 00054 messageItem.remainNodes = remainNodes; 00055 messageItem.timestamp = simulation.simTime(); 00056 messages[msg->getID()] = messageItem; 00057 }
void GiaMessageBookkeeping::removeMessage | ( | GiaIDMessage * | msg | ) |
Removes GiaMessage from MessageBookkeeping.
msg | This is a GiaIDMessage |
00060 { 00061 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00062 // delete message if key is equal 00063 if ( it->first == msg->getID() ) 00064 messages.erase(messages.find(msg->getID())); 00065 }
bool GiaMessageBookkeeping::contains | ( | GiaIDMessage * | msg | ) |
NodeHandle GiaMessageBookkeeping::getNextHop | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
00077 { 00078 if ( neighbors->getSize() > 0 ) { 00079 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00080 std::priority_queue<FullGiaNodeInfo, std::vector<FullGiaNodeInfo>, GiaNodeQueueCompare> nodeQueue; 00081 00082 if ( it != messages.end() && it->first == msg->getID() ) { 00083 MessageItem messageItem = it->second; 00084 std::vector<GiaNode> remNodes = messageItem.remainNodes; 00085 if ( remNodes.size() == 0) { 00086 for ( uint i=0; i<neighbors->getSize(); i++ ) { 00087 remNodes.push_back(neighbors->get(i)); 00088 } 00089 } 00090 00091 for ( uint i=0; i<remNodes.size(); i++ ) { 00092 if(!(remNodes[i].isUnspecified())) { 00093 FullGiaNodeInfo temp; 00094 temp.node = remNodes[i]; 00095 temp.info = neighbors->get(temp.node); 00096 if (temp.info) nodeQueue.push(temp); 00097 } 00098 } 00099 00100 if (!nodeQueue.empty()) { 00101 NodeHandle nextHop = nodeQueue.top().node; 00102 GiaNeighborInfo* nextHopInfo = neighbors->get(nextHop); 00103 nodeQueue.pop(); 00104 00105 if (nextHopInfo != NULL && nextHopInfo->receivedTokens > 0 ) { 00106 remNodes.clear(); 00107 while ( !nodeQueue.empty() ) { 00108 remNodes.push_back(nodeQueue.top().node); 00109 nodeQueue.pop(); 00110 } 00111 messageItem.remainNodes = remNodes; 00112 messageItem.timestamp = simulation.simTime(); 00113 messages[msg->getID()] = messageItem; 00114 return nextHop; 00115 } 00116 } 00117 } 00118 } 00119 return NodeHandle::UNSPECIFIED_NODE; 00120 }
void GiaMessageBookkeeping::removeTimedoutMessages | ( | ) |
Removes timedout messages from list.
00123 { 00124 std::map<OverlayKey, MessageItem>::iterator it = messages.begin(); 00125 std::map<OverlayKey, MessageItem>::iterator it2 = messages.begin(); 00126 for ( uint i=0; i<messages.size(); i++) { 00127 OverlayKey key = it->first; 00128 MessageItem messageItem = it->second; 00129 it2 = it++; 00130 if ( simulation.simTime() > (messageItem.timestamp + timeout)) 00131 messages.erase(it2); 00132 } 00133 }
std::map<OverlayKey, MessageItem> GiaMessageBookkeeping::messages [protected] |
contains all sent messages
GiaNeighbors* GiaMessageBookkeeping::neighbors [protected] |
pointer to our neighbor list
uint GiaMessageBookkeeping::timeout [protected] |