#include <MessageBookkeeping.h>
It is used for timing out old messages and for biased random walk.
Public Member Functions | |
MessageBookkeeping (Neighbors *neighbors, uint timeout) | |
Constructor. | |
~MessageBookkeeping () | |
Destructor. | |
uint | getSize () |
void | addMessage (GiaIDMessage *msg) |
Add GiaMessage to MessageBookkeeping. | |
void | removeMessage (GiaIDMessage *msg) |
Removes GiaMessage from MessageBookkeeping. | |
bool | contains (GiaIDMessage *msg) |
GiaNode * | getNextHop (GiaIDMessage *msg) |
void | removeTimedoutMessages () |
Removes timedout messages from list. | |
Protected Attributes | |
std::map< OverlayKey, MessageItem > | messages |
contains all sent messages | |
Neighbors * | neighbors |
pointer to our neighbor list | |
uint | timeout |
Classes | |
struct | MessageItem |
class | nodeQueueCompare |
MessageBookkeeping::MessageBookkeeping | ( | Neighbors * | neighbors, | |
uint | timeout | |||
) |
void MessageBookkeeping::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 00051 (i)->getNodeHandle().key != msg->getSrcNode().key) //msg->getSrcKey() ) 00052 remainNodes.push_back(*(neighbors->get 00053 (i))); 00054 MessageItem messageItem; 00055 messageItem.remainNodes = remainNodes; 00056 messageItem.timestamp = simulation.simTime(); 00057 messages[msg->getID()] = messageItem; 00058 }
bool MessageBookkeeping::contains | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
00069 { 00070 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00071 00072 if(it != messages.end()) // it->first == msg->getID() ) 00073 return true; 00074 return false; 00075 }
GiaNode * MessageBookkeeping::getNextHop | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
00078 { 00079 if ( neighbors->getSize() > 0 ) { 00080 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00081 std::priority_queue<GiaNode, std::vector<GiaNode>, nodeQueueCompare> nodeQueue; 00082 00083 if ( it->first == msg->getID() ) { 00084 MessageItem messageItem = it->second; 00085 std::vector<GiaNode> remNodes = messageItem.remainNodes; 00086 if ( remNodes.size() == 0) { 00087 for ( uint i=0; i<neighbors->getSize(); i++ ) { 00088 remNodes.push_back(*(neighbors->get 00089 (i))); 00090 } 00091 } 00092 00093 for ( uint i=0; i<remNodes.size(); i++ ) { 00094 if(!(remNodes[i].isUnspecified())) //(remNodes[i] != GiaNode::UNSPECIFIED_NODE ) 00095 nodeQueue.push(remNodes[i]); 00096 } 00097 00098 GiaNode* nextHop = neighbors->get 00099 (nodeQueue.top()); 00100 00101 nodeQueue.pop(); 00102 if ( nextHop->getReceivedTokens() > 0 ) { 00103 remNodes.clear(); 00104 while ( !nodeQueue.empty() ) { 00105 remNodes.push_back(nodeQueue.top()); 00106 nodeQueue.pop(); 00107 } 00108 messageItem.remainNodes = remNodes; 00109 messageItem.timestamp = simulation.simTime(); 00110 messages[msg->getID()] = messageItem; 00111 return nextHop; 00112 } else 00113 return NULL; 00114 } else 00115 return NULL; 00116 } else 00117 return NULL; 00118 }
uint MessageBookkeeping::getSize | ( | ) |
void MessageBookkeeping::removeMessage | ( | GiaIDMessage * | msg | ) |
Removes GiaMessage from MessageBookkeeping.
msg | This is a GiaIDMessage |
00061 { 00062 std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID()); 00063 // delete message if key is equal 00064 if ( it->first == msg->getID() ) 00065 messages.erase(messages.find(msg->getID())); 00066 }
void MessageBookkeeping::removeTimedoutMessages | ( | ) |
Removes timedout messages from list.
00121 { 00122 std::map<OverlayKey, MessageItem>::iterator it = messages.begin(); 00123 std::map<OverlayKey, MessageItem>::iterator it2 = messages.begin(); 00124 for ( uint i=0; i<messages.size(); i++) { 00125 OverlayKey key = it->first; 00126 MessageItem messageItem = it->second; 00127 it2 = it++; 00128 if ( simulation.simTime() > (messageItem.timestamp + timeout)) 00129 messages.erase(it2); 00130 } 00131 }
std::map<OverlayKey, MessageItem> MessageBookkeeping::messages [protected] |
contains all sent messages
Neighbors* MessageBookkeeping::neighbors [protected] |
pointer to our neighbor list
uint MessageBookkeeping::timeout [protected] |