lib/client/node.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef EQ_NODE_H
00019 #define EQ_NODE_H
00020
00021 #include <eq/client/types.h>
00022 #include <eq/client/visitorResult.h>
00023
00024 #include <eq/net/barrier.h>
00025 #include <eq/net/objectVersion.h>
00026 #include <eq/base/base.h>
00027
00028 namespace eq
00029 {
00030 class CommandQueue;
00031 class FrameData;
00032 class NodeVisitor;
00033
00039 class Node : public net::Object
00040 {
00041 public:
00043 EQ_EXPORT Node( Config* parent );
00044
00046 EQ_EXPORT virtual ~Node();
00047
00053 Config* getConfig() { return _config; }
00054 const Config* getConfig() const { return _config; }
00055
00056 EQ_EXPORT ClientPtr getClient();
00057 EQ_EXPORT ServerPtr getServer();
00058
00059 const PipeVector& getPipes() const { return _pipes; }
00060 const std::string& getName() const { return _name; }
00061
00072 uint32_t getTasks() const { return _tasks; }
00073
00074 EQ_EXPORT CommandQueue* getNodeThreadQueue();
00075
00082 EQ_EXPORT VisitorResult accept( NodeVisitor& visitor );
00083
00091 net::Barrier* getBarrier( const net::ObjectVersion barrier );
00092
00100 FrameData* getFrameData( const net::ObjectVersion& dataVersion );
00101
00103 EQ_EXPORT void waitInitialized() const;
00104 EQ_EXPORT bool isRunning() const;
00105
00112 EQ_EXPORT void waitFrameStarted( const uint32_t frameNumber ) const;
00113
00114 uint32_t getFinishedFrame() const { return _finishedFrame; }
00115
00120
00122 enum IAttribute
00123 {
00124 IATTR_THREAD_MODEL,
00125 IATTR_FILL1,
00126 IATTR_FILL2,
00127 IATTR_ALL
00128 };
00129
00130 EQ_EXPORT void setIAttribute( const IAttribute attr,
00131 const int32_t value );
00132 EQ_EXPORT int32_t getIAttribute( const IAttribute attr ) const;
00133 EQ_EXPORT static const std::string& getIAttributeString(
00134 const IAttribute attr );
00136
00137 class TransmitThread : public base::Thread
00138 {
00139 public:
00140 TransmitThread( Node* parent ) : _node( parent ) {}
00141 virtual ~TransmitThread() {}
00142
00143 void send( FrameData* data, net::NodePtr node,
00144 const uint32_t frameNumber );
00145
00146 protected:
00147 virtual void* run();
00148
00149 private:
00150 struct Task
00151 {
00152 Task( FrameData* d, net::NodePtr n, const uint32_t f )
00153 : data( d ), node( n ), frameNumber( f ) {}
00154
00155 FrameData* data;
00156 net::NodePtr node;
00157 uint32_t frameNumber;
00158 };
00159
00160 base::MTQueue< Task > _tasks;
00161 Node* const _node;
00162 };
00163
00164 TransmitThread transmitter;
00165
00166 protected:
00167 friend class Config;
00168
00169 EQ_EXPORT virtual void attachToSession( const uint32_t id,
00170 const uint32_t instanceID,
00171 net::Session* session );
00172
00180 EQ_EXPORT void startFrame( const uint32_t frameNumber );
00181
00187 EQ_EXPORT void releaseFrame( const uint32_t frameNumber );
00188
00194 EQ_EXPORT void releaseFrameLocal( const uint32_t frameNumber );
00196
00204
00210 EQ_EXPORT virtual bool configInit( const uint32_t initID );
00211
00215 EQ_EXPORT virtual bool configExit();
00216
00229 EQ_EXPORT virtual void frameStart( const uint32_t frameID,
00230 const uint32_t frameNumber );
00231
00243 virtual void frameFinish( const uint32_t frameID,
00244 const uint32_t frameNumber )
00245 { releaseFrame( frameNumber ); }
00246
00258 EQ_EXPORT virtual void frameDrawFinish( const uint32_t frameID,
00259 const uint32_t frameNumber );
00260
00275 EQ_EXPORT virtual void frameTasksFinish( const uint32_t frameID,
00276 const uint32_t frameNumber );
00278
00289 EQ_EXPORT void setErrorMessage( const std::string& message );
00291
00292 private:
00294 Config* const _config;
00295
00297 std::string _name;
00298
00300 int32_t _iAttributes[IATTR_ALL];
00302 static std::string _iAttributeStrings[IATTR_ALL];
00303
00305 uint32_t _tasks;
00306
00308 PipeVector _pipes;
00309
00311 std::string _error;
00312
00313 enum State
00314 {
00315 STATE_STOPPED,
00316 STATE_INITIALIZING,
00317 STATE_INIT_FAILED,
00318 STATE_RUNNING
00319 };
00321 base::Monitor< State > _state;
00322
00324 base::Monitor<uint32_t> _currentFrame;
00325
00327 uint32_t _unlockedFrame;
00328
00330 uint32_t _finishedFrame;
00331
00332 typedef stde::hash_map< uint32_t, net::Barrier* > BarrierHash;
00334 BarrierHash _barriers;
00335 base::Lock _barriersMutex;
00336
00337 typedef stde::hash_map< uint32_t, FrameData* > FrameDataHash;
00339 FrameDataHash _frameDatas;
00340 base::Lock _frameDatasMutex;
00341
00342 union
00343 {
00344 char dummy[64];
00345 };
00346
00347 friend class Pipe;
00348 void _addPipe( Pipe* pipe );
00349 void _removePipe( Pipe* pipe );
00350 Pipe* _findPipe( const uint32_t id );
00351
00352 void _finishFrame( const uint32_t frameNumber ) const;
00353 void _frameFinish( const uint32_t frameID, const uint32_t frameNumber );
00354
00355 void _flushObjects();
00356
00357 virtual void getInstanceData( net::DataOStream& os ) { EQDONTCALL }
00358 virtual void applyInstanceData( net::DataIStream& is ) { EQDONTCALL }
00359
00361 net::CommandResult _cmdCreatePipe( net::Command& command );
00362 net::CommandResult _cmdDestroyPipe( net::Command& command );
00363 net::CommandResult _cmdConfigInit( net::Command& command );
00364 net::CommandResult _cmdConfigExit( net::Command& command );
00365 net::CommandResult _cmdFrameStart( net::Command& command );
00366 net::CommandResult _cmdFrameFinish( net::Command& command );
00367 net::CommandResult _cmdFrameDrawFinish( net::Command& command );
00368 net::CommandResult _cmdFrameTasksFinish( net::Command& command );
00369
00370 CHECK_THREAD_DECLARE( _nodeThread );
00371 };
00372 }
00373
00374 #endif // EQ_NODE_H
00375