GiaMessageBookkeeping Class Reference

This class contains all send messages and their timestamp. More...

#include <GiaMessageBookkeeping.h>

List of all members.

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, MessageItemmessages
 contains all sent messages
GiaNeighborsneighbors
 pointer to our neighbor list
uint32_t timeout

Detailed Description

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.


Constructor & Destructor Documentation

GiaMessageBookkeeping::GiaMessageBookkeeping ( GiaNeighbors neighbors,
uint32_t  timeout 
)

Constructor.

Parameters:
neighbors Pointer to neighbors-list
timeout Value for timing out old messages

Definition at line 30 of file GiaMessageBookkeeping.cc.

00031 {
00032     this->neighbors = neighbors;
00033     this->timeout = timeout;
00034 }

GiaMessageBookkeeping::~GiaMessageBookkeeping (  ) 

Destructor.

Definition at line 36 of file GiaMessageBookkeeping.cc.

00037 {}


Member Function Documentation

void GiaMessageBookkeeping::addMessage ( GiaIDMessage *  msg  ) 

Add GiaMessage to MessageBookkeeping.

Parameters:
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  ) 
Parameters:
msg This is a GiaIDMessage
Returns:
true, if MessageBookkeeping contains GiaMessage

Definition at line 69 of file GiaMessageBookkeeping.cc.

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  ) 
Parameters:
msg This is a GiaIDMessage
Returns:
Next hop to route message to, NULL, if no token available

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 (  ) 
Returns:
Size of MessageBookkeeping-List

Definition at line 39 of file GiaMessageBookkeeping.cc.

00040 {
00041     return messages.size();
00042 }

void GiaMessageBookkeeping::removeMessage ( GiaIDMessage *  msg  ) 

Removes GiaMessage from MessageBookkeeping.

Parameters:
msg This is a GiaIDMessage

Definition at line 61 of file GiaMessageBookkeeping.cc.

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 }

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 }


Member Data Documentation

contains all sent messages

Definition at line 107 of file GiaMessageBookkeeping.h.

Referenced by addMessage(), contains(), getNextHop(), getSize(), removeMessage(), and removeTimedoutMessages().

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().


The documentation for this class was generated from the following files:
Generated on Wed May 26 16:21:17 2010 for OverSim by  doxygen 1.6.3