00001 /* ex: set tabstop=4 expandtab: */ 00002 /* */ 00003 /* (c) 2004-2006 Iowa State University */ 00004 /* see the LICENSE file in the top level directory */ 00005 /* */ 00006 /* $Header: /afs/scl/project/cvsroot/fountain/source/nodes/FountainNode.h,v 1.41 2006/03/08 05:09:16 samm Exp $ */ 00015 #ifndef FOUNTAIN_NODE_H__ 00016 #define FOUNTAIN_NODE_H__ 00017 00018 //forward class declarations 00019 template <class T> class FountainNodeCreator; 00020 00021 #include "define.h" 00022 #include "FountainMessage.h" 00023 #include "NodeMessage.h" 00024 #include "FountainWireProt.h" 00025 #include "FountainSocketHandlers.h" 00026 #include "NodeID.h" 00027 #include "FountainErrors.h" 00028 #include "monitor/NodeMonitor.h" 00029 #include "TreeTopology.h" 00030 #include "LokiInclude.h" 00031 #include <bamboo/SSSXML.h> 00032 #include <string> 00033 #include <unistd.h> 00034 #include <memory> 00035 #include <sys/types.h> //for time_t 00036 00049 class FountainNode { 00050 protected: 00051 //member variables 00052 00060 FountainSocketHandlers socketHandlers_; 00061 00065 TreeTopology::ChildNodeContainer children_; 00066 00072 typedef TreeTopology::ChildNodeContainer::iterator childIterator; 00073 00079 typedef TreeTopology::ChildNodeContainer::const_iterator constChildIterator; 00080 00084 NodeID myID_; 00085 00089 NodeID parentID_; 00090 00094 FountainWireProtPtr parentConnectionPtr_; 00095 00096 private: 00097 //member variables 00098 00102 NodeID masterNodeID_; 00103 00108 NodeMonitorBase::NodeMonitorPtr myNodeInfoPtr_; 00109 00113 time_t parentPulseLastSeen_; 00114 00115 public: 00116 //member methods 00117 00122 virtual void checkConnections(); 00123 00124 protected: 00125 //member methods 00126 00135 virtual NodeResponsePtr processRequest(FountainMessage::MessageAction action, ConstParseMsgPtr request, time_t timeout=0); 00136 00144 virtual NodeResponsePtr processPingPong(ConstParseMsgPtr request, time_t timeout=0); 00145 00150 void handleParentMessage(); 00151 00155 void checkChildren(); 00156 00162 void handleJoin(ConstParseMsgPtr request, FountainWireProtPtr requestConnection); 00163 00169 FountainNode(const NodeID& myID, const NodeID& masterNodeID); 00170 00174 virtual ~FountainNode() {} 00175 00181 class forwardMessageToChildren { 00182 public: 00187 forwardMessageToChildren(ConstParseMsgPtr request) : request_(request) {} 00188 00193 inline void operator() (TreeTopology::ChildNodeContainer::value_type element) { 00194 element.second->forwardMessage(request_); 00195 } 00196 private: 00197 ConstParseMsgPtr request_; 00198 }; 00199 00200 private: 00201 //member methods 00202 00211 int handleChildMessage(FountainWireProtPtr childCon, const NodeID& childID); 00212 00219 virtual int handleLostChild(const NodeID& childID); 00220 00226 virtual void handleLostParent(const char* message); 00227 00232 void pokeParent(); 00233 00237 void pokeChildren(); 00238 00244 void handleSync(ConstParseMsgPtr request, FountainWireProtPtr requestCon); 00245 00256 void handleWakeup(); 00257 00262 virtual void joinMasterNode(); 00263 00270 int joinParentNode(const NodeID& newParentID); 00271 00276 void checkParent(); 00277 00281 FountainNode& operator=(const FountainNode& rhs); 00282 00286 FountainNode(const FountainNode& rhs); 00287 00288 //these two classes have to be friends of us since they do the actual 00289 //object instantiation 00290 template <typename T> friend class Loki::CreateUsingNew; 00291 template <typename T> friend class FountainNodeCreator; 00292 }; 00293 00299 template <class T> 00300 class FountainNodeCreator : public Loki::CreateUsingNew<T> { 00301 public: 00302 static T* Create(); 00303 }; 00304 00310 typedef Loki::SingletonHolder<FountainNode, FountainNodeCreator> SingleFountainNode; 00311 00312 #endif
1.4.6