00001
00002
00003
00004
00005 #ifndef EQNET_BARRIER_H
00006 #define EQNET_BARRIER_H
00007
00008 #include <eq/net/object.h>
00009 #include <eq/net/nodeID.h>
00010 #include <eq/base/monitor.h>
00011
00012 #include <map>
00013
00014 namespace eq
00015 {
00016 namespace net
00017 {
00018 class Node;
00019
00023 class EQ_EXPORT Barrier : public Object
00024 {
00025 public:
00029 Barrier( NodePtr master, const uint32_t height = 0 );
00030
00034 Barrier();
00035
00039 virtual ~Barrier();
00040
00047
00048 void setHeight( const uint32_t height ) { _height = height; }
00049 void increase() { ++_height; }
00050
00051 uint32_t getHeight() const { return _height; }
00052
00053
00055
00062 void enter();
00063
00064
00065 protected:
00066 virtual void attachToSession( const uint32_t id,
00067 const uint32_t instanceID,
00068 Session* session );
00069 virtual ChangeType getChangeType() const { return DELTA; }
00070
00071 virtual void getInstanceData( DataOStream& os );
00072 virtual void applyInstanceData( DataIStream& is );
00073 virtual void pack( DataOStream& os );
00074 virtual void unpack( DataIStream& is );
00075
00076 private:
00078 NodeID _masterID;
00079
00081 uint32_t _height;
00082
00084 NodePtr _master;
00085
00087 std::map< uint32_t, NodeVector > _enteredNodes;
00088
00090 base::Monitor<uint32_t> _leaveNotify;
00091
00092
00093 CommandResult _cmdEnter( Command& command );
00094 CommandResult _cmdEnterReply( Command& command );
00095
00096 CHECK_THREAD_DECLARE( _thread );
00097 };
00098 }
00099 }
00100
00101 #endif // EQNET_BARRIER_H
00102