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