00001
00002
00003
00004
00005 #ifndef EQNET_DELTAMASTERCM_H
00006 #define EQNET_DELTAMASTERCM_H
00007
00008 #include "objectInstanceDataOStream.h"
00009
00010 #include <eq/net/nodeID.h>
00011 #include <eq/net/objectCM.h>
00012 #include <eq/net/types.h>
00013
00014 #include <deque>
00015
00016 namespace eq
00017 {
00018 namespace net
00019 {
00020 class Node;
00021 class ObjectDeltaDataOStream;
00022
00027 class DeltaMasterCM : public ObjectCM
00028 {
00029 public:
00030 DeltaMasterCM( Object* object );
00031 virtual ~DeltaMasterCM();
00032
00033 virtual void notifyAttached();
00034 virtual void makeThreadSafe(){}
00035
00039
00040 virtual uint32_t commitNB();
00041 virtual uint32_t commitSync( const uint32_t commitID );
00042
00043 virtual void obsolete( const uint32_t version ) { EQUNIMPLEMENTED; }
00044
00045 virtual void setAutoObsolete( const uint32_t count,
00046 const uint32_t flags )
00047 { _nVersions = count; _obsoleteFlags = flags; }
00048
00049 virtual uint32_t getAutoObsoleteCount() const { return _nVersions; }
00050
00051 virtual uint32_t sync( const uint32_t version )
00052 { EQDONTCALL; return _version; }
00053
00054 virtual uint32_t getHeadVersion() const { return _version; }
00055 virtual uint32_t getVersion() const { return _version; }
00056 virtual uint32_t getOldestVersion() const;
00057
00058
00059 virtual bool isMaster() const { return true; }
00060 virtual uint32_t getMasterInstanceID() const
00061 { EQDONTCALL; return EQ_ID_INVALID; }
00062 virtual void addSlave( NodePtr node, const uint32_t instanceID,
00063 const uint32_t version );
00064 virtual void removeSlave( NodePtr node );
00065
00066 virtual void applyMapData() { EQDONTCALL; }
00067
00068 private:
00070 Object* _object;
00071
00073 NodeVector _slaves;
00074
00076 NodeIDHash< uint32_t > _slavesCount;
00077
00079 uint32_t _version;
00080
00082 uint32_t _commitCount;
00083
00085 uint32_t _nVersions;
00086
00088 uint32_t _obsoleteFlags;
00089
00091 base::RequestHandler _requestHandler;
00092
00093 struct InstanceData
00094 {
00095 InstanceData( const Object* object )
00096 : os( object ), commitCount(0) {}
00097
00098 ObjectInstanceDataOStream os;
00099 uint32_t commitCount;
00100 };
00101
00102 typedef ObjectDeltaDataOStream DeltaData;
00103
00105 std::deque< InstanceData* > _instanceDatas;
00106
00108 std::deque< DeltaData* > _deltaDatas;
00109
00110 std::vector< InstanceData* > _instanceDataCache;
00111 std::vector< DeltaData* > _deltaDataCache;
00112
00113 DeltaData* _newDeltaData();
00114 InstanceData* _newInstanceData();
00115
00116 void _obsolete();
00117 void _checkConsistency() const;
00118
00119
00120 CommandResult _cmdCommit( Command& pkg );
00121 CommandResult _cmdDiscard( Command& pkg ) { return COMMAND_HANDLED; }
00122
00123 CHECK_THREAD_DECLARE( _thread );
00124 };
00125 }
00126 }
00127
00128 #endif // EQNET_DELTAMASTERCM_H