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, MessageItemmessages
 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     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.

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

Parameters:
msg This is a GiaIDMessage

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

NodeHandle GiaMessageBookkeeping::getNextHop ( GiaIDMessage *  msg  ) 

Parameters:
msg This is a GiaIDMessage

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


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 Tue Jul 24 16:51:18 2007 for ITM OverSim by  doxygen 1.5.1