This class contains all send messages and their timestamp. More...
#include <GiaMessageBookkeeping.h>
Classes | |
class | GiaNodeQueueCompare |
struct | MessageItem |
Public Member Functions | |
GiaMessageBookkeeping (GiaNeighbors *neighbors, uint32_t timeout) | |
Constructor. | |
~GiaMessageBookkeeping () | |
Destructor. | |
uint32_t | 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 | |
uint32_t | timeout |
This class contains all send messages and their timestamp.
It is used for timing out old messages and for biased random walk.
Definition at line 42 of file GiaMessageBookkeeping.h.
GiaMessageBookkeeping::GiaMessageBookkeeping | ( | GiaNeighbors * | neighbors, | |
uint32_t | timeout | |||
) |
Constructor.
neighbors | Pointer to neighbors-list | |
timeout | Value for timing out old messages |
Definition at line 30 of file GiaMessageBookkeeping.cc.
GiaMessageBookkeeping::~GiaMessageBookkeeping | ( | ) |
void GiaMessageBookkeeping::addMessage | ( | GiaIDMessage * | msg | ) |
Add GiaMessage to MessageBookkeeping.
msg | This is a GiaIDMessage |
Definition at line 44 of file GiaMessageBookkeeping.cc.
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 ( uint32_t i=0; i<neighbors->getSize(); i++ ) { 00052 if ( neighbors->get(i).getKey() != msg->getSrcNode().getKey()) 00053 remainNodes.push_back(neighbors->get(i)); 00054 } 00055 MessageItem messageItem; 00056 messageItem.remainNodes = remainNodes; 00057 messageItem.timestamp = simTime(); 00058 messages[msg->getID()] = messageItem; 00059 }
bool GiaMessageBookkeeping::contains | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
Definition at line 69 of file GiaMessageBookkeeping.cc.
Referenced by Gia::forwardMessage().
NodeHandle GiaMessageBookkeeping::getNextHop | ( | GiaIDMessage * | msg | ) |
msg | This is a GiaIDMessage |
Definition at line 78 of file GiaMessageBookkeeping.cc.
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 ( uint32_t i=0; i<neighbors->getSize(); i++ ) { 00089 remNodes.push_back(neighbors->get(i)); 00090 } 00091 } 00092 00093 for ( uint32_t 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 = simTime(); 00115 messages[msg->getID()] = messageItem; 00116 return nextHop; 00117 } 00118 } 00119 } 00120 } 00121 return NodeHandle::UNSPECIFIED_NODE; 00122 }
uint32_t GiaMessageBookkeeping::getSize | ( | ) |
Definition at line 39 of file GiaMessageBookkeeping.cc.
00040 { 00041 return messages.size(); 00042 }
void GiaMessageBookkeeping::removeMessage | ( | GiaIDMessage * | msg | ) |
Removes GiaMessage from MessageBookkeeping.
msg | This is a GiaIDMessage |
Definition at line 61 of file GiaMessageBookkeeping.cc.
void GiaMessageBookkeeping::removeTimedoutMessages | ( | ) |
Removes timedout messages from list.
Definition at line 124 of file GiaMessageBookkeeping.cc.
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 ( uint32_t i=0; i<messages.size(); i++) { 00129 OverlayKey key = it->first; 00130 MessageItem messageItem = it->second; 00131 it2 = it++; 00132 if (simTime() > (messageItem.timestamp + timeout)) 00133 messages.erase(it2); 00134 } 00135 }
std::map<OverlayKey, MessageItem> GiaMessageBookkeeping::messages [protected] |
contains all sent messages
Definition at line 107 of file GiaMessageBookkeeping.h.
Referenced by addMessage(), contains(), getNextHop(), getSize(), removeMessage(), and removeTimedoutMessages().
GiaNeighbors* GiaMessageBookkeeping::neighbors [protected] |
pointer to our neighbor list
Definition at line 108 of file GiaMessageBookkeeping.h.
Referenced by addMessage(), and getNextHop().
uint32_t GiaMessageBookkeeping::timeout [protected] |
Definition at line 109 of file GiaMessageBookkeeping.h.
Referenced by removeTimedoutMessages().