Equalizer  2.1.0
Parallel Rendering Framework
fabric/config.h
1 
2 /* Copyright (c) 2005-2015, Stefan Eilemann <eile@equalizergraphics.com>
3  * Cedric Stalder <cedric Stalder@gmail.com>
4  * 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/object.h> // DIRTY_CUSTOM enum
25 #include <eq/fabric/types.h> // typedefs
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 // cppcheck-suppress noConstructor
34 class Config : public Object
35 {
36 public:
37  typedef std::vector<O*> Observers;
38  typedef std::vector<L*> Layouts;
39  typedef std::vector<CV*> Canvases;
40  typedef std::vector<N*> Nodes;
41 
45  EQFABRIC_INL lunchbox::RefPtr<S> getServer();
46 
48  EQFABRIC_INL lunchbox::RefPtr<const S> getServer() const;
49 
51  const Observers& getObservers() const { return _observers; }
53  const Layouts& getLayouts() const { return _layouts; }
55  const Canvases& getCanvases() const { return _canvases; }
56 
61  EQFABRIC_INL uint32_t getTimeout() const;
62 
67  const Nodes& getNodes() const { return _nodes; }
68  EQFABRIC_INL N* findAppNode();
69  EQFABRIC_INL const N* findAppNode() const;
70 
78  EQFABRIC_INL VisitorResult accept(V& visitor);
79 
81  EQFABRIC_INL VisitorResult accept(V& visitor) const;
82 
84  template <typename T>
85  EQFABRIC_INL T* find(const uint128_t& id);
86 
88  template <typename T>
89  EQFABRIC_INL const T* find(const uint128_t& id) const;
90 
92  template <typename T>
93  EQFABRIC_INL T* find(const std::string& name);
94 
96  template <typename T>
97  EQFABRIC_INL const T* find(const std::string& name) const;
98 
100  O* getObserver(const ObserverPath& path);
101 
103  L* getLayout(const LayoutPath& path);
104 
106  CV* getCanvas(const CanvasPath& path);
107 
109  template <typename T>
110  void find(const uint128_t& id, T** result);
111 
113  template <typename T>
114  void find(const std::string& name, 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  {
147  _fAttributes[attr] = value;
148  }
150  void setIAttribute(const IAttribute attr, const int32_t value)
151  {
152  _iAttributes[attr] = value;
153  }
154 
156  float getFAttribute(const FAttribute attr) const
157  {
158  return _fAttributes[attr];
159  }
160 
162  int32_t getIAttribute(const IAttribute attr) const
163  {
164  return _iAttributes[attr];
165  }
166 
168  static const std::string& getFAttributeString(const FAttribute attr);
170  static const std::string& getIAttributeString(const IAttribute attr);
172 
186  virtual void setLatency(const uint32_t latency);
187 
189  uint32_t getLatency() const { return _data.latency; }
191  EQFABRIC_INL virtual void restore();
193 
194  virtual void output(std::ostream&) const {}
195  void create(O** observer);
196  void release(O* observer);
197  void create(L** layout);
198  void release(L* layout);
199  void create(CV** canvas);
200  void release(CV* canvas);
201  void create(N** node);
202  void release(N* node);
203 
204 protected:
206  EQFABRIC_INL explicit Config(lunchbox::RefPtr<S> parent);
207 
209  EQFABRIC_INL virtual ~Config();
210 
212  EQFABRIC_INL virtual void attach(const uint128_t& id,
213  const uint32_t instanceID);
214 
216  EQFABRIC_INL virtual void serialize(co::DataOStream& os,
217  const uint64_t dirtyBits);
218  EQFABRIC_INL virtual void deserialize(co::DataIStream& is,
219  const uint64_t dirtyBits);
220  EQFABRIC_INL virtual void notifyDetach();
221 
223  virtual void _removeChild(const uint128_t&) { LBUNIMPLEMENTED; }
224  template <class, class, class, class, class, class>
225  friend class Server;
226 
227  void setAppNodeID(const co::NodeID& nodeID);
228 
229  const co::NodeID& getAppNodeID() const { return _appNodeID; }
231  EQFABRIC_INL EventOCommand sendError(co::NodePtr node, const uint32_t event,
232  const Error& error);
233 
234  virtual void changeLatency(const uint32_t) { /* NOP */}
235  virtual bool mapViewObjects() const { return false; }
236  virtual bool mapNodeObjects() const { return false; }
237 
238  virtual VisitorResult _acceptCompounds(V&) { return TRAVERSE_CONTINUE; }
240  virtual VisitorResult _acceptCompounds(V&) const
241  {
242  return TRAVERSE_CONTINUE;
243  }
244  template <class C2, class V2>
245  friend VisitorResult _acceptImpl(C2*, V2&);
246 
247  N* _findNode(const uint128_t& id);
248 
250  EQFABRIC_INL virtual uint128_t commit(
251  const uint32_t incarnation = CO_COMMIT_NEXT);
253 
254 private:
256  lunchbox::RefPtr<S> _server;
257 
259  float _fAttributes[FATTR_ALL];
260 
262  int32_t _iAttributes[IATTR_ALL];
263 
265  Observers _observers;
266 
268  Layouts _layouts;
269 
271  Canvases _canvases;
272 
274  Nodes _nodes;
275 
277  co::NodeID _appNodeID;
278 
279  struct BackupData
280  {
281  BackupData()
282  : latency(1)
283  {
284  }
285 
287  uint32_t latency;
288  } _data, _backup;
289 
290  struct Private;
291  Private* _private; // placeholder for binary-compatible changes
292 
293  enum DirtyBits
294  {
295  DIRTY_MEMBER = Object::DIRTY_CUSTOM << 0,
296  DIRTY_LATENCY = Object::DIRTY_CUSTOM << 1,
297  DIRTY_ATTRIBUTES = Object::DIRTY_CUSTOM << 2,
298  DIRTY_NODES = Object::DIRTY_CUSTOM << 3,
299  DIRTY_OBSERVERS = Object::DIRTY_CUSTOM << 4,
300  DIRTY_LAYOUTS = Object::DIRTY_CUSTOM << 5,
301  DIRTY_CANVASES = Object::DIRTY_CUSTOM << 6,
302  DIRTY_CONFIG_BITS = DIRTY_MEMBER | DIRTY_ATTRIBUTES | DIRTY_OBSERVERS |
303  DIRTY_LAYOUTS | DIRTY_CANVASES | DIRTY_NODES |
304  DIRTY_LATENCY
305  };
306 
308  virtual uint64_t getRedistributableBits() const
309  {
310  return DIRTY_CONFIG_BITS;
311  }
312 
313  template <class, class>
314  friend class Observer;
315  void _addObserver(O* observer);
316  bool _removeObserver(O* observer);
317 
318  template <class, class, class>
319  friend class Layout;
320  void _addLayout(L* layout);
321  bool _removeLayout(L* layout);
322 
323  template <class, class, class, class>
324  friend class Canvas;
325  void _addCanvas(CV* canvas);
326  bool _removeCanvas(CV* canvas);
327 
328  template <class, class, class, class>
329  friend class Node;
330  void _addNode(N* node);
331  EQFABRIC_INL bool _removeNode(N* node);
332 
333  typedef co::CommandFunc<Config<S, C, O, L, CV, N, V>> CmdFunc;
334  bool _cmdNewLayout(co::ICommand& command);
335  bool _cmdNewCanvas(co::ICommand& command);
336  bool _cmdNewObserver(co::ICommand& command);
337  bool _cmdNewEntityReply(co::ICommand& command);
338 };
339 
340 template <class S, class C, class O, class L, class CV, class N, class V>
341 EQFABRIC_INL std::ostream& operator<<(
342  std::ostream& os, const Config<S, C, O, L, CV, N, V>& config);
343 }
344 }
345 #endif // EQFABRIC_CONFIG_H
const Observers & getObservers() const
Definition: fabric/config.h:51
EQFABRIC_INL VisitorResult accept(V &visitor)
Perform a depth-first traversal of this config.
EQFABRIC_INL lunchbox::RefPtr< S > getServer()
Defines export visibility macros for library EqualizerFabric.
Base data transport class for observers.
const Nodes & getNodes() const
Definition: fabric/config.h:67
DirtyBits
The changed parts of the object since the last pack().
Definition: object.h:107
EQFABRIC_INL T * find(const uint128_t &id)
std::vector< N * > Nodes
A vector of nodes.
Definition: fabric/config.h:40
Base co::Node class for a server.
Definition: fabric/server.h:32
float getFAttribute(const FAttribute attr) const
A wrapper for error codes to allow intuitive bool-like usage.
Base data transport class for nodes.
Definition: fabric/node.h:32
std::vector< L * > Layouts
A vector of layouts.
Definition: fabric/config.h:38
const Layouts & getLayouts() const
Definition: fabric/config.h:53
const Canvases & getCanvases() const
Definition: fabric/config.h:55
std::vector< O * > Observers
A vector of observers.
Definition: fabric/config.h:37
int32_t getIAttribute(const IAttribute attr) const
The Equalizer client library.
Definition: eq/agl/types.h:23
The default interocular distance in meters.
std::ostream & operator<<(std::ostream &os, const AxisEvent &event)
Print the axis event to the given output stream.
Definition: axisEvent.h:49
The version of the file loaded.
A canvas represents a logical 2D projection surface.
Definition: fabric/canvas.h:35
std::vector< CV * > Canvases
A vector of canvases.
Definition: fabric/config.h:39
Base data transport class for layouts.
Definition: fabric/layout.h:33
Base data class for a configuration.
Definition: fabric/config.h:34
Internal base class for all distributed, inheritable Equalizer objects.
Definition: object.h:44
virtual void setLatency(const uint32_t latency)
Set the maximum accepted latency for this config.
uint32_t getLatency() const
Tolerate resource failures.