ReplicaNet and RNLobby  1
ReplicaObject.h
1 /* START_LICENSE_HEADER
2 
3 Copyright (C) 2000 Martin Piper, original design and program code
4 Copyright (C) 2001 Replica Software
5 
6 This program file is copyright (C) Replica Software and can only be used under license.
7 For more information visit: http://www.replicanet.com/
8 Or email: info@replicanet.com
9 
10 END_LICENSE_HEADER */
11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __REPLICAOBJECT_H__
13 #define __REPLICAOBJECT_H__
14 
15 #include <vector>
16 #include <list>
17 #include <set>
18 
19 #include "RNPlatform/Inc/ThreadClass.h"
20 #include "RNPlatform/Inc/SysTime.h"
21 #include "RNReplicaNet/Inc/DataBlock.h"
22 
23 namespace RNReplicaNet
24 {
25 
26 class ReplicaNet;
27 class ReplicaNetPrivate;
28 struct s_RO_RegistryBlock;
29 
30 const float kReplicaObject_InfiniteDistance = -1.0f;
31 const int kReplicaObjectUnknownUniqueID = -1;
32 
43 class ReplicaObject : private MutexClass
44 {
45 public:
46  enum PacketType
47  {
48  kPacket_Unreliable = 0,
49  kPacket_Reliable = 1,
50  kPacket_Certain = 2,
51  kPacket_Ordered = 3
52  };
53 
57  ReplicaObject();
58 
62  virtual ~ReplicaObject();
63 
68  bool IsReplica(void) const;
69 
74  bool IsMaster(void) const;
75 
80  bool IsPublished(void) const;
81 
86  void Publish(void);
87 
93  void Unpublish(void);
94 
99  virtual const int GetClassID(void) = 0;
100 
105  virtual void SetRegistered(bool flag = true) = 0;
106 
111  virtual bool GetRegistered(void) = 0;
112 
117  int GetUniqueID(void);
118 
123  int GetSessionID(void);
124 
130 
135  virtual bool ApproveFault(void);
136 
141  virtual bool ApproveMigration(void);
142 
146  virtual void OwnerChange(void);
147 
154  void GiveOwnership(int sessionID);
155 
161  void RequestOwnership(void);
162 
168  virtual float CalculateDistanceToObject(ReplicaObject *object);
169 
175  float GetDistanceToObject(ReplicaObject *object);
176 
181  virtual void SetOpaquePointer(void *data);
182 
188  virtual void *GetOpaquePointer(void *data = 0);
189 
195  DataBlock *FindDataBlock(void *pdata);
196 
200  template<typename dataBlockType , typename dataType>
201  dataBlockType *FindDataBlock(dataType &member)
202  {
203  DataBlock *datablock = FindDataBlock(&member);
204  if (!datablock)
205  {
206  return 0;
207  }
208  if (datablock->IsClassType(dataBlockType::StaticThisClassType()))
209  {
210  dataBlockType *realBlock = (dataBlockType*)(datablock);
211  return realBlock;
212  }
213  return 0;
214  }
215 
221  void GiveDeltaHint(float &variable,float delta);
222 
228  void ContinuityBreak(float &variable,unsigned char breakTypes);
229 
235  void UpdateSetReliable(void);
236 
242  void UpdateSetCertain(void);
243 
249  void UpdateSetUnreliable(void);
250 
256  void UpdateSetOrdered(void);
257 
262  bool UpdateIsReliable(void);
263 
268  bool UpdateIsCertain(void);
269 
274  bool UpdateIsUnreliable(void);
275 
280  bool UpdateIsOrdered(void);
281 
286  void SetLoadBalancing(const bool enable = false);
287 
292  void SetLoadBalancingDefault(const bool defaultValue = false);
293 
298  bool GetLoadBalancing(void);
299 
305  void SetLoadScore(const float load = 0.0f);
306 
312  void SetLoadScoreDefault(const float defaultLoad = 0.0f);
313 
319  float GetLoadScore(void);
320 
324  virtual void PostObjectCreate(void);
325 
331  virtual void UserRegisterDataBlocks(void);
332 
337  void AddAutoRegisterDataBlock(DataBlock *const dataBlock);
338 
344  void SetMessageReflectionID(const int sessionID = kReplicaObjectUnknownUniqueID);
345 
350  int GetMessageReflectionID(void) const;
351 
362  void SetPropagateToSessionDistance(const float distance = kReplicaObject_InfiniteDistance);
363 
367  void SetPropagateToSessionDistanceInclude(const float distance = kReplicaObject_InfiniteDistance);
368 
372  void SetPropagateToSessionDistanceExclude(const float distance = kReplicaObject_InfiniteDistance);
373 
379  void SetPropagateToSessionDistanceDefault(const float distance = kReplicaObject_InfiniteDistance);
380 
384  void SetPropagateToSessionDistanceIncludeDefault(const float distance = kReplicaObject_InfiniteDistance);
385 
389  void SetPropagateToSessionDistanceExcludeDefault(const float distance = kReplicaObject_InfiniteDistance);
390 
396  float GetPropagateToSessionDistance(void) const;
397 
401  float GetPropagateToSessionDistanceInclude(void) const;
402 
406  float GetPropagateToSessionDistanceExclude(void) const;
407 
413  void SetPropagateToSessionDistanceRecalculationDelay(const float delay = 0.1f);
414 
419  static ReplicaObject *AllocateForReplicaNet(void);
420 
425  static void DeleteForReplicaNet(ReplicaObject *object);
426 
427 
435  void SetSessionPropagationFilter(const bool enable = false);
436 
441  bool GetSessionPropagationFilter(void) const;
442 
447  void GetSessionPropagationSet(std::set<int> &theSet);
448 
454  bool SessionPropagationAddSession(const int sessionID);
455 
461  bool SessionPropagationRemoveSession(const int sessionID);
462 
467  virtual void DataBlockPacketDataReceived(const DataBlock *datablock);
468 
473  virtual void DataBlockPacketDataReceivedPost(const DataBlock *datablock);
474 
480  virtual s_RO_RegistryBlock *GetRegistryBlock(void) const = 0;
481 
490  void DataSend(const int sessionid,const void *data,const int length,const PacketType type = kPacket_Reliable,const unsigned int band = 0);
491 
500  virtual void CallBackDataReceive(const int fromsessionid,const void *data,const int length,const PacketType type);
501 
508 
513  virtual void CallbackObjectUnpublishPre(void);
514 
519  virtual void CallbackObjectUnpublishPost(void);
520 
527 
532  void DelayedDelete(const float delaySeconds = 0.0f);
533 
537  void DelayedDeleteCancel(void);
538 
542  bool GetDelayedDelete(void);
543 
547  bool GetDelayedDelete(float &delaySeconds);
548 
552  void UpdateSendDormant(const bool dormant = false);
553 
557  bool GetUpdateSendDormant(void) const;
558 
563  void UpdateSendDormantDelay(const bool dormant = false,const float delaySeconds = 0.0f);
564 
568  void UpdateSendDormantDelayCancel(void);
569 
574  bool GetUpdateSendDormantDelay(bool &dormant,float &delaySeconds) const;
575 
579  virtual void UpdateSendDormantDelayStateChange(const bool dormant);
580 
585  void SetBand(const unsigned int band = 0);
586 
591  unsigned int GetBand(void) const;
592 
598  static void SetDelayIDFetch(const bool delay = false);
599 
603  static bool GetDelayIDFetch(void);
604 
611  static void SetDelayBind(const bool delay = false);
612 
616  static bool GetDelayBind(void);
617 
618 protected:
619  // Default is to do nothing as it is set in the ctor
620  // Otherwise it is used to set an update type by using a macroed function call specified in the ROLCompiler commands
621  virtual void _Internal_GetUpdateType(void) {}
622  virtual void _Internal_SetupLoadBalance(void) {}
623  virtual void _Internal_SetupLoadBalanceScore(void) {}
624  virtual void _Internal_SetupLoadBalanceDefault(void) {}
625  virtual void _Internal_SetupLoadBalanceScoreDefault(void) {}
626  virtual void _Internal_SetupOpaquePointer(void) {}
627  virtual void _Internal_SetupPropagateToSessionDistanceRecalculationDelay(void) {}
628  virtual void _Internal_SetupPropagateDistance(void) {}
629  virtual void _Internal_SetupPropagateDistanceDefault(void) {}
630  virtual void _Internal_SetupPropagateDistanceInclude(void) {}
631  virtual void _Internal_SetupPropagateDistanceIncludeDefault(void) {}
632  virtual void _Internal_SetupPropagateDistanceExclude(void) {}
633  virtual void _Internal_SetupPropagateDistanceExcludeDefault(void) {}
634  virtual void _Internal_SetupBand(void) {}
635 
636  // This sets the internal debugging full name
637  void _Internal_SetFullyQualifiedName(const char *name = 0);
638  const char *_Internal_GetFullyQualifiedName(void);
639  // Debugging emit functions
640  void _DebugInternal_EmitClassCreate(const int packetSize,const int toSession);
641  void _DebugInternal_EmitClassDelete(const int packetSize,const int toSession);
642  void _DebugInternal_EmitClassUnpublish(const int packetSize,const int toSession);
643 
648  virtual void RegisterDataBlock(DataBlock *block);
649 
650  virtual void SetNumExpectedDataBlocks(const int expected);
651 
657  virtual int GetNumExpectedDataBlocks(void);
658 
659 private:
660 friend class ReplicaNet; /* ReplicaNet has direct access to ReplicaObject classes */
661 friend class ReplicaNetPrivate; /* ReplicaNet has direct access to ReplicaObject classes */
662 friend struct SessionUnique; /* ReplicaNet has direct access to ReplicaObject classes */
663 friend class DataBlock;
664 
665 // Functions
666  // Safe to call multiple times
667  virtual void PreRegisterDataBlocks(void);
668  // Do not call, except from within PreRegisterDataBlocks()
669  virtual void RegisterDataBlocks(void);
671  void PollInternalForDistance(const SysTimeType localTime,ReplicaObject *observer,const int sessionID);
672 
673 
674 // Variables
675  bool mIsMaster;
676  int mUniqueID;
677  int mSessionID;
678  ReplicaNet *mBoundReplicaNet;
679  bool mBeingDeleted;
680 protected:
681  bool mDataBlocksRegistered;
682 private:
683  bool mFlagForLaterMigration;
684  void *mOpaquePointer;
685  bool mOpaquePointerSet;
686  bool mIsReliable;
687  bool mIsCertain;
688  bool mIsOrdered;
689  int mTryingToGiveTo;
690  bool mObjectHasBeenAdded;
691  bool mEnableLoadBalancing;
692  float mLoadScore;
693  bool mEnableLoadBalancingDefault;
694  float mLoadScoreDefault;
695  int mReflectSessionID;
696  float mDistanceToSessionPropagate;
697  float mDistanceToSessionPropagateDefault;
698  float mDistanceToSessionPropagateOuter;
699  float mDistanceToSessionPropagateOuterDefault;
700  bool mSessionPropagationFilter;
701 
702  std::vector<DataBlock *> mAutoRegister;
703  // std::vector is used for mDataBlocks to allow fast constant time lookups by index.
704  std::vector<DataBlock *> mDataBlocks;
705  std::set<int> mSessionPropagationFilterIDs;
706  // These delay slots are for those pending create class or delete class messages that have not been sent yet.
707  std::set<int> mSessionPropagationFilterDelaySlotAdd;
708  std::set<int> mSessionPropagationFilterDelaySlotRemove;
709 
710  // Distance based optimisations
711  bool mEnableDistanceBased;
712  SysTimeType mDistanceBasedPollTime;
713  SysTimeType mDistanceBasedLastTime;
714 
715  bool mMasterOrReplicaDataBlockPollDone;
716 
717  char *mFullyQualifiedName;
718  bool mPostObjectCreateDone;
719 
720  std::set<int> mObserverFor; // The session IDs that are using this object as an observer
721 
722  int mProcessingDataBlocksFromSessionID;
723  bool mDelayDelete;
724  float mDelayDeleteSeconds;
725  SysTimeType mDelayDeleteTime; // The local time to do the delete
726  bool mUpdateSendDormant;
727 
728  bool mDormantDelayActive;
729  bool mDormantDelayState;
730  float mDormantDelaySeconds;
731  SysTimeType mDormantDelayTime;
732 
733  unsigned int mBand;
734 
735  bool mGetNewSessionIDAndUniqueIDCalled;
736 
737  static bool mDelayIDFetch;
738  static bool mDelayBind;
739 };
740 
741 } // namespace RNReplicaNet
742 
743 #endif
virtual bool ApproveMigration(void)
void DataSend(const int sessionid, const void *data, const int length, const PacketType type=kPacket_Reliable, const unsigned int band=0)
bool GetUpdateSendDormant(void) const
void AddAutoRegisterDataBlock(DataBlock *const dataBlock)
virtual void RegisterDataBlock(DataBlock *block)
virtual float CalculateDistanceToObject(ReplicaObject *object)
bool GetSessionPropagationFilter(void) const
void SetPropagateToSessionDistanceIncludeDefault(const float distance=kReplicaObject_InfiniteDistance)
virtual void SetRegistered(bool flag=true)=0
void DelayedDelete(const float delaySeconds=0.0f)
float GetDistanceToObject(ReplicaObject *object)
virtual void CallBackDataReceive(const int fromsessionid, const void *data, const int length, const PacketType type)
virtual bool ApproveFault(void)
bool GetNewSessionIDAndUniqueID(RNReplicaNet::ReplicaNet *toBindTo=0)
float GetPropagateToSessionDistanceInclude(void) const
void GiveOwnership(int sessionID)
ReplicaNet * GetBoundReplicaNet(void)
virtual bool GetRegistered(void)=0
void SetPropagateToSessionDistanceExcludeDefault(const float distance=kReplicaObject_InfiniteDistance)
virtual void DataBlockPacketDataReceivedPost(const DataBlock *datablock)
bool SessionPropagationAddSession(const int sessionID)
void SetLoadBalancing(const bool enable=false)
void GiveDeltaHint(float &variable, float delta)
virtual void DataBlockPacketDataReceived(const DataBlock *datablock)
bool SessionPropagationRemoveSession(const int sessionID)
bool IsReplica(void) const
void SetBand(const unsigned int band=0)
void SetPropagateToSessionDistanceExclude(const float distance=kReplicaObject_InfiniteDistance)
virtual void CallbackObjectUnpublishPost(void)
void GetSessionPropagationSet(std::set< int > &theSet)
bool GetUpdateSendDormantDelay(bool &dormant, float &delaySeconds) const
virtual s_RO_RegistryBlock * GetRegistryBlock(void) const =0
static void DeleteForReplicaNet(ReplicaObject *object)
float GetPropagateToSessionDistance(void) const
static ReplicaObject * AllocateForReplicaNet(void)
static void SetDelayIDFetch(const bool delay=false)
void SetLoadBalancingDefault(const bool defaultValue=false)
void SetPropagateToSessionDistance(const float distance=kReplicaObject_InfiniteDistance)
virtual void SetOpaquePointer(void *data)
void SetLoadScore(const float load=0.0f)
virtual void PostObjectCreate(void)
float GetPropagateToSessionDistanceExclude(void) const
int GetMessageReflectionID(void) const
Definition: ReplicaObject.h:43
unsigned int GetBand(void) const
Definition: ReplicaNet.h:110
void ContinuityBreak(float &variable, unsigned char breakTypes)
virtual void OwnerChange(void)
static bool GetDelayBind(void)
void UpdateSendDormantDelay(const bool dormant=false, const float delaySeconds=0.0f)
void SetSessionPropagationFilter(const bool enable=false)
virtual int GetNumExpectedDataBlocks(void)
Definition: RO_RegistryBlock.h:29
void UpdateSendDormantDelayCancel(void)
virtual void CallbackObjectUnpublishPre(void)
void SetPropagateToSessionDistanceInclude(const float distance=kReplicaObject_InfiniteDistance)
bool IsPublished(void) const
void SetMessageReflectionID(const int sessionID=kReplicaObjectUnknownUniqueID)
void SetLoadScoreDefault(const float defaultLoad=0.0f)
virtual const int GetClassID(void)=0
static void SetDelayBind(const bool delay=false)
void SetPropagateToSessionDistanceRecalculationDelay(const float delay=0.1f)
Definition: ThreadClass.h:39
bool IsMaster(void) const
virtual void * GetOpaquePointer(void *data=0)
void UpdateSendDormant(const bool dormant=false)
void SetPropagateToSessionDistanceDefault(const float distance=kReplicaObject_InfiniteDistance)
virtual void UserRegisterDataBlocks(void)
dataBlockType * FindDataBlock(dataType &member)
Definition: ReplicaObject.h:201
int GetProcessingDataBlocksFromSessionID(void)
Definition: DataBlock.h:47
virtual void UpdateSendDormantDelayStateChange(const bool dormant)
static bool GetDelayIDFetch(void)
DataBlock * FindDataBlock(void *pdata)