lib/client/node.h

00001 
00002 /* Copyright (c) 2005-2009, Stefan Eilemann <eile@equalizergraphics.com> 
00003  *
00004  * This library is free software; you can redistribute it and/or modify it under
00005  * the terms of the GNU Lesser General Public License version 2.1 as published
00006  * by the Free Software Foundation .
00007  *  
00008  * This library is distributed in the hope that it will be useful, but WITHOUT
00009  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00010  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00011  * details.
00012  * 
00013  * You should have received a copy of the GNU Lesser General Public License
00014  * along with this library; if not, write to the Free Software Foundation, Inc.,
00015  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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>  // enum
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         // Note: also update string array initialization in node.cpp
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 // placeholder for binary-compatible changes
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 
Generated on Mon Aug 10 18:58:40 2009 for Equalizer 0.9 by  doxygen 1.5.8