MessageBookkeeping Class Reference

#include <MessageBookkeeping.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

 MessageBookkeeping (Neighbors *neighbors, uint timeout)
 Constructor.
 ~MessageBookkeeping ()
 Destructor.
uint getSize ()
void addMessage (GiaIDMessage *msg)
 Add GiaMessage to MessageBookkeeping.
void removeMessage (GiaIDMessage *msg)
 Removes GiaMessage from MessageBookkeeping.
bool contains (GiaIDMessage *msg)
GiaNodegetNextHop (GiaIDMessage *msg)
void removeTimedoutMessages ()
 Removes timedout messages from list.

Protected Attributes

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

Classes

struct  MessageItem
class  nodeQueueCompare


Constructor & Destructor Documentation

MessageBookkeeping::MessageBookkeeping ( Neighbors 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 }

MessageBookkeeping::~MessageBookkeeping (  ) 

Destructor.

00035 {}


Member Function Documentation

void MessageBookkeeping::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
00051                 (i)->getNodeHandle().key != msg->getSrcNode().key) //msg->getSrcKey() )
00052             remainNodes.push_back(*(neighbors->get
00053                                     (i)));
00054     MessageItem messageItem;
00055     messageItem.remainNodes = remainNodes;
00056     messageItem.timestamp = simulation.simTime();
00057     messages[msg->getID()] = messageItem;
00058 }

bool MessageBookkeeping::contains ( GiaIDMessage *  msg  ) 

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

GiaNode * MessageBookkeeping::getNextHop ( GiaIDMessage *  msg  ) 

Parameters:
msg This is a GiaIDMessage
Returns:
Next hop to route message to, NULL, if no token available
00078 {
00079     if ( neighbors->getSize() > 0 ) {
00080         std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID());
00081         std::priority_queue<GiaNode, std::vector<GiaNode>, nodeQueueCompare> nodeQueue;
00082 
00083         if ( it->first == msg->getID() ) {
00084             MessageItem messageItem = it->second;
00085             std::vector<GiaNode> remNodes = messageItem.remainNodes;
00086             if ( remNodes.size() == 0) {
00087                 for ( uint i=0; i<neighbors->getSize(); i++ ) {
00088                     remNodes.push_back(*(neighbors->get
00089                                          (i)));
00090                 }
00091             }
00092 
00093             for ( uint i=0; i<remNodes.size(); i++ ) {
00094                 if(!(remNodes[i].isUnspecified())) //(remNodes[i] != GiaNode::UNSPECIFIED_NODE )
00095                     nodeQueue.push(remNodes[i]);
00096             }
00097 
00098             GiaNode* nextHop = neighbors->get
00099                                (nodeQueue.top());
00100 
00101             nodeQueue.pop();
00102             if ( nextHop->getReceivedTokens() > 0 ) {
00103                 remNodes.clear();
00104                 while ( !nodeQueue.empty() ) {
00105                     remNodes.push_back(nodeQueue.top());
00106                     nodeQueue.pop();
00107                 }
00108                 messageItem.remainNodes = remNodes;
00109                 messageItem.timestamp = simulation.simTime();
00110                 messages[msg->getID()] = messageItem;
00111                 return nextHop;
00112             } else
00113                 return NULL;
00114         } else
00115             return NULL;
00116     } else
00117         return NULL;
00118 }

uint MessageBookkeeping::getSize (  ) 

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

void MessageBookkeeping::removeMessage ( GiaIDMessage *  msg  ) 

Removes GiaMessage from MessageBookkeeping.

Parameters:
msg This is a GiaIDMessage
00061 {
00062     std::map<OverlayKey, MessageItem>::iterator it = messages.find(msg->getID());
00063     // delete message if key is equal
00064     if ( it->first == msg->getID() )
00065         messages.erase(messages.find(msg->getID()));
00066 }

void MessageBookkeeping::removeTimedoutMessages (  ) 

Removes timedout messages from list.

00121 {
00122     std::map<OverlayKey, MessageItem>::iterator it = messages.begin();
00123     std::map<OverlayKey, MessageItem>::iterator it2 = messages.begin();
00124     for ( uint i=0; i<messages.size(); i++) {
00125         OverlayKey key = it->first;
00126         MessageItem messageItem = it->second;
00127         it2 = it++;
00128         if ( simulation.simTime() > (messageItem.timestamp + timeout))
00129             messages.erase(it2);
00130     }
00131 }


Member Data Documentation

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

contains all sent messages

Neighbors* MessageBookkeeping::neighbors [protected]

pointer to our neighbor list

uint MessageBookkeeping::timeout [protected]


The documentation for this class was generated from the following files:
Generated on Wed Apr 4 13:37:06 2007 for ITM OverSim by  doxygen 1.4.7