GiaMessageBookkeeping Class Reference

#include <GiaMessageBookkeeping.h>

List of all members.


Detailed Description

This class contains all send messages and their timestamp.

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

void addMessage (GiaIDMessage *msg)
 Add GiaMessage to MessageBookkeeping.
void removeMessage (GiaIDMessage *msg)
 Removes GiaMessage from MessageBookkeeping.
bool contains (GiaIDMessage *msg)
 
Parameters:
msg This is a GiaIDMessage

NodeHandle getNextHop (GiaIDMessage *msg)
 
Parameters:
msg This is a GiaIDMessage

void removeTimedoutMessages ()
 Removes timedout messages from list.

Protected Attributes

std::map< OverlayKey,
MessageItem
messages
 contains all sent messages
GiaNeighborsneighbors
 pointer to our neighbor list
uint timeout

Classes

class  GiaNodeQueueCompare
struct  MessageItem


Constructor & Destructor Documentation

GiaMessageBookkeeping::GiaMessageBookkeeping ( GiaNeighbors neighbors,
uint  timeout 
)

Constructor.

Parameters:
neighbors Pointer to neighbors-list
timeout Value for timing out old messages
00029 {
00030     this->neighbors = neighbors;
00031     this->timeout = timeout;
00032 }

GiaMessageBookkeeping::~GiaMessageBookkeeping (  ) 

Destructor.

00035 {}


Member Function Documentation

uint GiaMessageBookkeeping::getSize (  ) 

Returns:
Size of MessageBookkeeping-List

00038 {
00039     return messages.size();
00040 }

void GiaMessageBookkeeping::addMessage ( GiaIDMessage *  msg  ) 

Add GiaMessage to MessageBookkeeping.

Parameters:
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.

Parameters:
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  ) 

Parameters:
msg This is a GiaIDMessage

Returns:
true, if MessageBookkeeping contains GiaMessage
00068 {
00069     std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID());
00070 
00071     if(it != messages.end())
00072         return true;
00073     return false;
00074 }

NodeHandle GiaMessageBookkeeping::getNextHop ( GiaIDMessage *  msg  ) 

Parameters:
msg This is a GiaIDMessage

Returns:
Next hop to route message to, NULL, if no token available
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 }


Member Data Documentation

std::map<OverlayKey, MessageItem> GiaMessageBookkeeping::messages [protected]

contains all sent messages

GiaNeighbors* GiaMessageBookkeeping::neighbors [protected]

pointer to our neighbor list

uint GiaMessageBookkeeping::timeout [protected]


The documentation for this class was generated from the following files:
Generated on Thu Apr 17 13:19:29 2008 for ITM OverSim by  doxygen 1.5.3