Equalizer  1.6.1
include/eq/fabric/config.h
1 
2 /* Copyright (c) 2005-2013, Stefan Eilemann <eile@equalizergraphics.com>
3  * 2010, Cedric Stalder <cedric Stalder@gmail.com>
4  * 2011, Daniel Nachbaur <danielnachbaur@gmail.com>
5  *
6  * This library is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU Lesser General Public License version 2.1 as published
8  * by the Free Software Foundation.
9  *
10  * This library is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13  * details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with this library; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #ifndef EQFABRIC_CONFIG_H
21 #define EQFABRIC_CONFIG_H
22 
23 #include <eq/fabric/api.h>
24 #include <eq/fabric/types.h> // typedefs
25 #include <eq/fabric/object.h> // DIRTY_CUSTOM enum
26 
27 namespace eq
28 {
29 namespace fabric
30 {
32  template< class S, class C, class O, class L, class CV, class N, class V >
33  class Config : public Object
34  {
35  public:
36  typedef std::vector< O* > Observers;
37  typedef std::vector< L* > Layouts;
38  typedef std::vector< CV* > Canvases;
39  typedef std::vector< N* > Nodes;
40 
44  EQFABRIC_INL lunchbox::RefPtr< S > getServer();
45 
47  EQFABRIC_INL lunchbox::RefPtr< const S > getServer() const;
48 
50  const Observers& getObservers() const { return _observers; }
51 
53  const Layouts& getLayouts() const { return _layouts; }
54 
56  const Canvases& getCanvases() const { return _canvases; }
57 
62  EQFABRIC_INL uint32_t getTimeout() const;
63 
68  const Nodes& getNodes() const { return _nodes; }
69 
70  EQFABRIC_INL N* findAppNode();
71  EQFABRIC_INL const N* findAppNode() const;
72 
80  EQFABRIC_INL VisitorResult accept( V& visitor );
81 
83  EQFABRIC_INL VisitorResult accept( V& visitor ) const;
84 
86  template< typename T > EQFABRIC_INL T* find( const uint128_t& id );
87 
89  template< typename T >
90  EQFABRIC_INL const T* find( const uint128_t& id ) const;
91 
93  template< typename T >
94  EQFABRIC_INL T* find( const std::string& name );
95 
97  template< typename T >
98  EQFABRIC_INL const T* find( const std::string& name ) const;
99 
101  O* getObserver( const ObserverPath& path );
102 
104  L* getLayout( const LayoutPath& path );
105 
107  CV* getCanvas( const CanvasPath& path );
108 
110  template< typename T > void find( const uint128_t& id, T** result );
111 
113  template< typename T > void find( const std::string& name,
114  const T** result ) const;
115 
117  virtual void updateCanvas( CV* ) { /* NOP */ }
118 
120  virtual void exitCanvas( CV* ) { /* NOP */ }
122 
125  // Note: also update string array initialization in config.ipp
126 
129  {
132  FATTR_LAST,
133  FATTR_ALL = FATTR_LAST + 5
134  };
135 
138  {
140  IATTR_LAST,
141  IATTR_ALL = IATTR_LAST + 5
142  };
143 
145  void setFAttribute( const FAttribute attr, const float value )
146  { _fAttributes[attr] = value; }
148  void setIAttribute( const IAttribute attr, const int32_t value )
149  { _iAttributes[attr] = value; }
150 
152  float getFAttribute( const FAttribute attr ) const
153  { return _fAttributes[attr]; }
154 
156  int32_t getIAttribute( const IAttribute attr ) const
157  { return _iAttributes[attr]; }
158 
160  static const std::string& getFAttributeString( const FAttribute attr );
162  static const std::string& getIAttributeString( const IAttribute attr );
164 
165 
179  virtual void setLatency( const uint32_t latency );
180 
182  uint32_t getLatency() const { return _data.latency; }
183 
185  EQFABRIC_INL virtual void restore();
187 
188  virtual void output( std::ostream& ) const {}
189  void create( O** observer );
190  void release( O* observer );
191  void create( L** layout );
192  void release( L* layout );
193  void create( CV** canvas );
194  void release( CV* canvas );
195  void create( N** node );
196  void release( N* node );
197 
198  protected:
200  EQFABRIC_INL Config( lunchbox::RefPtr< S > parent );
201 
203  EQFABRIC_INL virtual ~Config();
204 
206  EQFABRIC_INL virtual void attach( const UUID& id,
207  const uint32_t instanceID );
208 
210  EQFABRIC_INL virtual void serialize( co::DataOStream& os,
211  const uint64_t dirtyBits );
212  EQFABRIC_INL virtual void deserialize( co::DataIStream& is,
213  const uint64_t dirtyBits );
214  EQFABRIC_INL virtual void notifyDetach();
215 
217  virtual void _removeChild( const UUID& )
218  { LBUNIMPLEMENTED; }
219 
220  template< class, class, class, class, class, class >
221  friend class Server;
222 
223  void setAppNodeID( const co::NodeID& nodeID );
224 
225  const co::NodeID& getAppNodeID() const { return _appNodeID; }
226 
227  virtual void changeLatency( const uint32_t ) { /* NOP */ }
228  virtual bool mapViewObjects() const { return false; }
229  virtual bool mapNodeObjects() const { return false; }
230 
232  virtual VisitorResult _acceptCompounds( V& )
233  { return TRAVERSE_CONTINUE; }
235  virtual VisitorResult _acceptCompounds( V& ) const
236  { return TRAVERSE_CONTINUE; }
237  template< class C2, class V2 >
238  friend VisitorResult _acceptImpl( C2*, V2& );
239 
240  N* _findNode( const uint128_t& id );
241 
243  EQFABRIC_INL virtual uint128_t commit( const uint32_t incarnation =
244  CO_COMMIT_NEXT );
246 
247  private:
249  lunchbox::RefPtr< S > _server;
250 
252  float _fAttributes[FATTR_ALL];
253 
255  int32_t _iAttributes[IATTR_ALL];
256 
258  Observers _observers;
259 
261  Layouts _layouts;
262 
264  Canvases _canvases;
265 
267  Nodes _nodes;
268 
270  co::NodeID _appNodeID;
271 
272  struct BackupData
273  {
274  BackupData() : latency( 1 ) {}
275 
277  uint32_t latency;
278  }
279  _data, _backup;
280 
281  struct Private;
282  Private* _private; // placeholder for binary-compatible changes
283 
284  enum DirtyBits
285  {
286  DIRTY_MEMBER = Object::DIRTY_CUSTOM << 0,
287  DIRTY_LATENCY = Object::DIRTY_CUSTOM << 1,
288  DIRTY_ATTRIBUTES = Object::DIRTY_CUSTOM << 2,
289  DIRTY_NODES = Object::DIRTY_CUSTOM << 3,
290  DIRTY_OBSERVERS = Object::DIRTY_CUSTOM << 4,
291  DIRTY_LAYOUTS = Object::DIRTY_CUSTOM << 5,
292  DIRTY_CANVASES = Object::DIRTY_CUSTOM << 6,
293  DIRTY_CONFIG_BITS =
294  DIRTY_MEMBER | DIRTY_ATTRIBUTES | DIRTY_OBSERVERS |
295  DIRTY_LAYOUTS | DIRTY_CANVASES | DIRTY_NODES | DIRTY_LATENCY
296  };
297 
299  virtual uint64_t getRedistributableBits() const
300  { return DIRTY_CONFIG_BITS; }
301 
302  template< class, class > friend class Observer;
303  void _addObserver( O* observer );
304  bool _removeObserver( O* observer );
305 
306  template< class, class, class > friend class Layout;
307  void _addLayout( L* layout );
308  bool _removeLayout( L* layout );
309 
310  template< class, class, class, class > friend class Canvas;
311  void _addCanvas( CV* canvas );
312  bool _removeCanvas( CV* canvas );
313 
314  template< class, class, class, class > friend class Node;
315  void _addNode( N* node );
316  EQFABRIC_INL bool _removeNode( N* node );
317 
318  typedef co::CommandFunc< Config< S, C, O, L, CV, N, V > > CmdFunc;
319  bool _cmdNewLayout( co::ICommand& command );
320  bool _cmdNewCanvas( co::ICommand& command );
321  bool _cmdNewObserver( co::ICommand& command );
322  bool _cmdNewEntityReply( co::ICommand& command );
323  };
324 
325  template< class S, class C, class O, class L, class CV, class N, class V >
326  EQFABRIC_INL std::ostream& operator << ( std::ostream& os,
327  const Config< S, C, O, L, CV, N, V >& config );
328 }
329 }
330 #endif // EQFABRIC_CONFIG_H
Internal base class for all distributed, inheritable Equalizer objects.
Definition: object.h:39
float getFAttribute(const FAttribute attr) const
A configuration is a visualization session driven by an application.
virtual void setLatency(const uint32_t latency)
Set the maximum accepted latency for this config.
IAttribute
Possible values for integer attributes.
Definition: iAttribute.h:30
uint32_t getLatency() const
const Canvases & getCanvases() const
int32_t getIAttribute(const IAttribute attr) const
const Observers & getObservers() const
const Layouts & getLayouts() const
std::vector< L * > Layouts
A vector of layouts.
std::vector< CV * > Canvases
A vector of canvases.
EQFABRIC_INL lunchbox::RefPtr< S > getServer()
const Nodes & getNodes() const
Base data class for a configuration.
std::vector< N * > Nodes
A vector of nodes.
EQFABRIC_INL T * find(const uint128_t &id)
The default interocular distance in meters.
EQFABRIC_INL VisitorResult accept(V &visitor)
Perform a depth-first traversal of this config.
The version of the file loaded.
std::vector< O * > Observers
A vector of observers.