Equalizer
1.4.1
|
00001 00002 /* Copyright (c) 2005-2012, Stefan Eilemann <eile@equalizergraphics.com> 00003 * 2010, Cedric Stalder <cedric.stalder@gmail.com> 00004 * 00005 * This library is free software; you can redistribute it and/or modify it under 00006 * the terms of the GNU Lesser General Public License version 2.1 as published 00007 * by the Free Software Foundation. 00008 * 00009 * This library is distributed in the hope that it will be useful, but WITHOUT 00010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00011 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 00012 * details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public License 00015 * along with this library; if not, write to the Free Software Foundation, Inc., 00016 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 00017 */ 00018 00019 #ifndef CO_LOCALNODE_H 00020 #define CO_LOCALNODE_H 00021 00022 #include <co/defines.h> 00023 #include <co/node.h> // base class 00024 #include <co/objectHandler.h> // base class 00025 #include <co/objectVersion.h> // VERSION_FOO used inline 00026 #include <lunchbox/requestHandler.h> // base class 00027 #include <boost/function/function1.hpp> 00028 #include <boost/function/function4.hpp> 00029 00030 namespace co 00031 { 00032 namespace detail { class LocalNode; class ReceiverThread; class CommandThread; } 00033 00040 class LocalNode : public lunchbox::RequestHandler, public Node, 00041 public ObjectHandler 00042 { 00043 public: 00044 CO_API LocalNode(); 00045 CO_API virtual ~LocalNode(); 00046 00047 typedef NodePtr SendToken; 00048 00050 typedef boost::function< void( const uint128_t&, 00051 const uint128_t&, 00052 const uint128_t&, 00053 DataIStream& ) > PushHandler; 00054 00056 typedef boost::function< bool( Command& ) > CommandHandler; 00057 00088 CO_API virtual bool initLocal( const int argc, char** argv ); 00089 00102 CO_API virtual bool listen(); 00103 CO_API virtual bool listen( ConnectionPtr connection ); 00104 00114 CO_API virtual bool close(); 00115 00117 virtual bool exitLocal() { return close(); } 00118 00134 CO_API bool connect( NodePtr node ); 00135 00147 CO_API NodePtr connect( const NodeID& nodeID ); 00148 00156 CO_API virtual bool disconnect( NodePtr node ); 00158 00162 CO_API void disableInstanceCache(); 00163 00165 CO_API void expireInstanceData( const int64_t age ); 00166 00182 CO_API void enableSendOnRegister(); 00183 00185 CO_API void disableSendOnRegister(); 00186 00198 CO_API virtual bool registerObject( Object* object ); 00199 00205 CO_API virtual void deregisterObject( Object* object ); 00206 00240 CO_API bool mapObject( Object* object, const UUID& id, 00241 const uint128_t& version = VERSION_OLDEST ); 00242 00244 bool mapObject( Object* object, const ObjectVersion& v ) 00245 { return mapObject( object, v.identifier, v.version ); } 00246 00248 CO_API uint32_t mapObjectNB( Object* object, const UUID& id, 00249 const uint128_t& version = VERSION_OLDEST); 00250 00255 CO_API virtual uint32_t mapObjectNB( Object* object, const UUID& id, 00256 const uint128_t& version, 00257 NodePtr master ); 00258 00260 CO_API virtual bool mapObjectSync( const uint32_t requestID ); 00261 00267 CO_API virtual void unmapObject( Object* object ); 00268 00270 CO_API void releaseObject( Object* object ); 00271 00290 CO_API virtual void objectPush( const uint128_t& groupID, 00291 const uint128_t& objectType, 00292 const uint128_t& objectID, 00293 DataIStream& istream ); 00294 00304 CO_API void registerPushHandler( const uint128_t& groupID, 00305 const PushHandler& handler ); 00306 00315 CO_API bool registerCommandHandler( const uint128_t& command, 00316 const CommandHandler& func, 00317 CommandQueue* queue ); 00318 00321 CO_API void swapObject( Object* oldObject, Object* newObject ); 00323 00334 CO_API NodePtr getNode( const NodeID& id ) const; 00335 00337 CO_API void getNodes( Nodes& nodes, const bool addSelf = true ) const; 00338 00340 CO_API CommandQueue* getCommandThreadQueue(); 00341 00346 CO_API bool inCommandThread() const; 00347 00349 CO_API int64_t getTime64() const; 00351 00358 CO_API ConnectionPtr addListener( ConnectionDescriptionPtr desc ); 00359 00361 CO_API void addListener( ConnectionPtr connection ); 00362 00364 CO_API void removeListeners( const Connections& connections ); 00365 00372 CO_API void flushCommands(); 00373 00375 CO_API Command& cloneCommand( Command& command ); 00376 00378 CO_API Command& allocCommand( const uint64_t size ); 00379 00387 CO_API bool dispatchCommand( Command& command ); 00388 00393 CO_API SendToken acquireSendToken( NodePtr toNode ); 00394 CO_API void releaseSendToken( SendToken& token ); 00395 00397 CO_API Zeroconf getZeroconf(); 00399 00401 CO_API void ackRequest( NodePtr node, const uint32_t requestID ); 00402 00404 CO_API void ping( NodePtr remoteNode ); 00405 00411 CO_API bool pingIdleNodes(); 00412 00414 CO_API void setAffinity( const int32_t affinity ); 00415 00416 protected: 00429 CO_API bool connect( NodePtr node, ConnectionPtr connection ); 00430 00432 virtual void notifyDisconnect( NodePtr node ) { } 00433 00434 private: 00435 detail::LocalNode* const _impl; 00436 00437 bool _connectSelf(); 00438 void _connectMulticast( NodePtr node ); 00439 00440 bool _startCommandThread(); 00441 bool _notifyCommandThreadIdle(); 00442 friend class detail::ReceiverThread; 00443 friend class detail::CommandThread; 00444 00445 void _cleanup(); 00446 CO_API void _addConnection( ConnectionPtr connection ); 00447 void _removeConnection( ConnectionPtr connection ); 00448 00449 NodePtr _connect( const NodeID& nodeID, NodePtr peer ); 00450 NodePtr _connectFromZeroconf( const NodeID& nodeID ); 00451 uint32_t _removeListenerNB( ConnectionPtr connection ); 00452 uint32_t _connect( NodePtr node ); 00453 uint32_t _connect( NodePtr node, ConnectionPtr connection ); 00454 00455 void _runReceiverThread(); 00456 void _handleConnect(); 00457 void _handleDisconnect(); 00458 bool _handleData(); 00459 void _initService(); 00460 void _exitService(); 00461 00462 friend class ObjectStore; 00463 template< typename T > void 00464 _registerCommand( const uint32_t command, const CommandFunc< T >& func, 00465 CommandQueue* destinationQueue ) 00466 { 00467 registerCommand( command, func, destinationQueue ); 00468 } 00469 00470 void _dispatchCommand( Command& command ); 00471 void _redispatchCommands(); 00472 00474 bool _cmdAckRequest( Command& packet ); 00475 bool _cmdStopRcv( Command& command ); 00476 bool _cmdStopCmd( Command& command ); 00477 bool _cmdSetAffinity( Command& command ); 00478 bool _cmdConnect( Command& command ); 00479 bool _cmdConnectReply( Command& command ); 00480 bool _cmdConnectAck( Command& command ); 00481 bool _cmdID( Command& command ); 00482 bool _cmdDisconnect( Command& command ); 00483 bool _cmdGetNodeData( Command& command ); 00484 bool _cmdGetNodeDataReply( Command& command ); 00485 bool _cmdAcquireSendToken( Command& command ); 00486 bool _cmdAcquireSendTokenReply( Command& command ); 00487 bool _cmdReleaseSendToken( Command& command ); 00488 bool _cmdAddListener( Command& command ); 00489 bool _cmdRemoveListener( Command& command ); 00490 bool _cmdPing( Command& command ); 00491 bool _cmdCommand( Command& command ); 00492 bool _cmdCommandAsync( Command& command ); 00493 bool _cmdDiscard( Command& ) { return true; } 00495 00496 LB_TS_VAR( _cmdThread ); 00497 LB_TS_VAR( _rcvThread ); 00498 }; 00499 inline std::ostream& operator << ( std::ostream& os, const LocalNode& node ) 00500 { 00501 os << static_cast< const Node& >( node ); 00502 return os; 00503 } 00504 } 00505 #endif // CO_LOCALNODE_H