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 ()
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
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
00031 {
00032     this->neighbors = neighbors;
00033     this->timeout = timeout;
00034 }

GiaMessageBookkeeping::~GiaMessageBookkeeping (  ) 

Destructor.

00037 {}


Member Function Documentation

uint GiaMessageBookkeeping::getSize (  ) 

Returns:
Size of MessageBookkeeping-List
00040 {
00041     return messages.size();
00042 }

void GiaMessageBookkeeping::addMessage ( GiaIDMessage *  msg  ) 

Add GiaMessage to MessageBookkeeping.

Parameters:
msg This is a GiaIDMessage

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 ( uint i=0; i<neighbors->getSize(); i++ ) {
00052         if ( neighbors->get(i).key != msg->getSrcNode().key)
00053             remainNodes.push_back(neighbors->get(i));
00054     }
00055     MessageItem messageItem;
00056     messageItem.remainNodes = remainNodes;
00057     messageItem.timestamp = simulation.simTime();
00058     messages[msg->getID()] = messageItem;
00059 }

void GiaMessageBookkeeping::removeMessage ( GiaIDMessage *  msg  ) 

Removes GiaMessage from MessageBookkeeping.

Parameters:
msg This is a GiaIDMessage
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 }

bool GiaMessageBookkeeping::contains ( GiaIDMessage *  msg  ) 

Parameters:
msg This is a GiaIDMessage
Returns:
true, if MessageBookkeeping contains GiaMessage

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

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 ( uint i=0; i<neighbors->getSize(); i++ ) {
00089                     remNodes.push_back(neighbors->get(i));
00090                 }
00091             }
00092 
00093             for ( uint 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 = simulation.simTime();
00115                     messages[msg->getID()] = messageItem;
00116                     return nextHop;
00117                 }
00118             }
00119         }
00120     }
00121     return NodeHandle::UNSPECIFIED_NODE;
00122 }

void GiaMessageBookkeeping::removeTimedoutMessages (  ) 

Removes timedout messages from list.

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 ( uint i=0; i<messages.size(); i++) {
00129         OverlayKey key = it->first;
00130         MessageItem messageItem = it->second;
00131         it2 = it++;
00132         if ( simulation.simTime() > (messageItem.timestamp + timeout))
00133             messages.erase(it2);
00134     }
00135 }


Member Data Documentation

contains all sent messages

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

pointer to our neighbor list

Referenced by addMessage(), and getNextHop().

Referenced by removeTimedoutMessages().


The documentation for this class was generated from the following files:

Generated on Fri Sep 19 13:05:06 2008 for ITM OverSim by  doxygen 1.5.5