11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __DEFINE_RO_H__
13 #define __DEFINE_RO_H__
14 #include "RNReplicaNet/Inc/DataBlock.h"
15 #include "RNReplicaNet/Inc/ROConstants.h"
16 #ifdef REPLICANET_VISUALDEBUGGER
17 #include "RNXPURL/Inc/XPURL.h"
18 #include "RNXPURL/Inc/DebugHandler.h"
19 #include "RNReplicaNet/Inc/RO_RegistryBlock.h"
20 #include "RNReplicaNet/Inc/ReplicaNet.h"
23 #define _MAKE_BASE(x) x
24 #define _MAKE_RO(x) _RO_##x
25 #define _MAKE_RO_ALLOCFUNC(x) _RO_AllocateFunc_##x
26 #define _MAKE_RO_DELETEFUNC(x) _RO_DeleteFunc_##x
27 #define _MAKE_RO_SETCLASSIDFUNC(x) _RO_SetClassIDFunc_##x
28 #define _MAKE_RO_REGISTERFUNC(x) _RO_RegisterFunc_##x
30 #ifdef REPLICANET_VISUALDEBUGGER
31 #define _RO_DODEBUGNAME() \
32 if (RNReplicaNet::XPURL::GetDebugHandler() && GetRegistryBlock() && GetRegistryBlock()->GetName()) \
34 _Internal_SetFullyQualifiedName(GetRegistryBlock()->GetName()); \
37 #define _RO_DODEBUGNAME()
42 #define _RO_DO_STD_FRAMEWORK(x) \
44 _Internal_GetUpdateType(); \
45 _Internal_SetupLoadBalance(); \
46 _Internal_SetupLoadBalanceScore(); \
47 _Internal_SetupLoadBalanceDefault(); \
48 _Internal_SetupLoadBalanceScoreDefault(); \
49 _Internal_SetupPropagateToSessionDistanceRecalculationDelay(); \
50 _Internal_SetupPropagateDistance(); \
51 _Internal_SetupPropagateDistanceDefault(); \
52 _Internal_SetupPropagateDistanceInclude(); \
53 _Internal_SetupPropagateDistanceIncludeDefault(); \
54 _Internal_SetupPropagateDistanceExclude(); \
55 _Internal_SetupPropagateDistanceExcludeDefault(); \
56 _Internal_SetupBand(); \
61 _RO_DO_ALLOCATEFUNC(x)
66 #define _RO_STD_FRAMEWORK(x) \
69 virtual ~_MAKE_RO(x)(); \
71 _RO_DEF_SETUP_TYPE_SPECIFICS(x) \
74 _RO_DO_ALLOW_FRIEND(x) \
79 #define _RO_BEGINCTOR(x) \
80 int _MAKE_RO(x)::mClassID = kReplicaObjectUnknownClassID; \
81 RNReplicaNet::s_RO_RegistryBlock *_MAKE_RO(x)::mBoundRegistryBlock = 0; \
82 bool _MAKE_RO(x)::mRegistered = false; \
83 int _MAKE_RO(x)::mStaticExpectedNumDataBlocks = -1; \
84 _MAKE_RO(x)::_MAKE_RO(x)() \
89 #define _RO_ENDCTOR(x) \
95 _MAKE_RO(x)::~_MAKE_RO(x)() \
103 #define _RO_DO_REPLICAOBJECT_MAKERELIABLE() \
105 virtual void _Internal_GetUpdateType(void) \
107 UpdateSetReliable(); \
113 #define _RO_DO_REPLICAOBJECT_MAKECERTAIN() \
115 virtual void _Internal_GetUpdateType(void) \
117 UpdateSetCertain(); \
123 #define _RO_DO_REPLICAOBJECT_MAKEUNRELIABLE() \
125 virtual void _Internal_GetUpdateType(void) \
127 UpdateSetUnreliable(); \
133 #define _RO_DO_REPLICAOBJECT_MAKEORDERED() \
135 virtual void _Internal_GetUpdateType(void) \
137 UpdateSetOrdered(); \
146 #define _RO_DEF_ALLOCATEFUNC(x) \
147 extern RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void); \
148 extern void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object); \
149 extern void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock); \
150 extern void _MAKE_RO_REGISTERFUNC(x)(void);
154 #define _RO_DO_ALLOCATEFUNC(x) \
155 RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void) \
157 return _MAKE_BASE(x)::AllocateForReplicaNet(); \
159 void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object) \
161 _MAKE_BASE(x)::DeleteForReplicaNet(object); \
163 void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
165 _MAKE_RO(x)::StaticSetClassID(classid,theBlock); \
167 void _MAKE_RO_REGISTERFUNC(x)(void) \
169 _MAKE_RO(x)::StaticSetRegistered(true); \
174 #define _RO_DEF_ALLOCATE(x) \
175 static _MAKE_BASE(x)* AllocateForReplicaNet(); \
176 static void DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object);
180 #define _RO_DO_ALLOCATE(x) \
181 _MAKE_BASE(x)* _MAKE_RO(x)::AllocateForReplicaNet() \
183 return new _MAKE_BASE(x); \
185 void _MAKE_RO(x)::DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object) \
192 #define _RO_DO_REGISTER(x) \
194 virtual void SetRegistered(bool flag = true) \
196 mRegistered = flag; \
198 static void StaticSetRegistered(bool flag = true) \
200 mRegistered = flag; \
202 virtual bool GetRegistered(void) \
204 return mRegistered; \
207 static bool mRegistered; \
212 #define _RO_DO_IDS(x) \
213 static void StaticSetClassID(const int class_id,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
215 mClassID = class_id; \
216 mBoundRegistryBlock = theBlock; \
218 virtual const int GetClassID(void) \
222 RNReplicaNet::s_RO_RegistryBlock *GetRegistryBlock(void) const \
224 return mBoundRegistryBlock; \
226 static int StaticGetClassID(void) \
230 static RNReplicaNet::s_RO_RegistryBlock *StaticGetRegistryBlock(void) \
232 return mBoundRegistryBlock; \
235 static int mClassID; \
236 static RNReplicaNet::s_RO_RegistryBlock *mBoundRegistryBlock; \
241 #define _RO_DO_ALLOW_PUBLIC() \
246 #define _RO_DO_MAKE_PRIVATE() \
251 #define _RO_DO_ALLOW_FRIEND(x) \
252 friend class _MAKE_BASE(x);
256 #define _RO_DO_ALLOW_FRIEND_RO(x) \
257 friend class _MAKE_RO(x);
261 #define _RO_DO_PUBLIC_RO(x) \
266 #define _RO_DO_APPROVEFAULT() \
268 virtual bool ApproveFault(void) \
276 #define _RO_DO_APPROVEMIGRATION() \
278 virtual bool ApproveMigration(void) \
287 #define _RO_DO_SETUPLOADBALANCE(x) \
289 virtual void _Internal_SetupLoadBalance(void) \
291 SetLoadBalancing(x); \
297 #define _RO_DO_SETUPLOADBALANCEDEFAULT(x) \
299 virtual void _Internal_SetupLoadBalanceDefault(void) \
301 SetLoadBalancingDefault(x); \
307 #define _RO_DO_SETUPLOADBALANCESCORE(x) \
309 virtual void _Internal_SetupLoadBalanceScore(void) \
317 #define _RO_DO_SETUPLOADBALANCESCOREDEFAULT(x) \
319 virtual void _Internal_SetupLoadBalanceScoreDefault(void) \
321 SetLoadScoreDefault(x); \
329 #define _RO_DO_SETUPPROPAGATETOSESSIONDISTANCERECALCULATIONDELAY(x) \
331 virtual void _Internal_SetupPropagateToSessionDistanceRecalculationDelay(void) \
333 SetPropagateToSessionDistanceRecalculationDelay(x); \
339 #define _RO_DO_SETUPPROPAGATEDISTANCE(x) \
341 virtual void _Internal_SetupPropagateDistance(void) \
343 SetPropagateToSessionDistance(x); \
349 #define _RO_DO_SETUPPROPAGATEDISTANCEDEFAULT(x) \
351 virtual void _Internal_SetupPropagateDistanceDefault(void) \
353 SetPropagateToSessionDistanceDefault(x); \
359 #define _RO_DO_SETUPPROPAGATEDISTANCEINCLUDE(x) \
361 virtual void _Internal_SetupPropagateDistanceInclude(void) \
363 SetPropagateToSessionDistanceInclude(x); \
369 #define _RO_DO_SETUPPROPAGATEDISTANCEINCLUDEDEFAULT(x) \
371 virtual void _Internal_SetupPropagateDistanceIncludeDefault(void) \
373 SetPropagateToSessionDistanceIncludeDefault(x); \
379 #define _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDE(x) \
381 virtual void _Internal_SetupPropagateDistanceExclude(void) \
383 SetPropagateToSessionDistanceExclude(x); \
389 #define _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDEDEFAULT(x) \
391 virtual void _Internal_SetupPropagateDistanceExcludeDefault(void) \
393 SetPropagateToSessionDistanceExcludeDefault(x); \
399 #define _RO_DO_SETUPBAND(x) \
401 virtual void _Internal_SetupBand(void) \
412 #define _RO_DEF_REGISTERDATABLOCKS(x) \
413 void RegisterDataBlocks(void);
417 #define _RO_DO_BEGINREGISTERDATABLOCKS(x) \
418 void _MAKE_RO(x)::RegisterDataBlocks(void) \
420 _MAKE_BASE(x) *basepoint = (_MAKE_BASE(x) *)this; \
421 basepoint = basepoint;
427 #ifdef REPLICANET_VISUALDEBUGGER
428 #define _RO_DO_SETDATABLOCKVARIABLENAME(x) \
429 datablock->SetVariableName(#x);
431 #define _RO_DO_SETDATABLOCKVARIABLENAME(x)
437 #define _RO_DO_DATABLOCK_MAKERELIABLE() \
438 datablock->SetReliableFlag(true);
442 #define _RO_DO_DATABLOCK_MAKECERTAIN() \
443 datablock->SetCertainFlag(true);
447 #define _RO_DO_DATABLOCK_MAKEORDERED() \
448 datablock->SetOrderedFlag(true);
452 #define _RO_DO_DATABLOCK_SETDISCARDOLDER(x) \
453 datablock->SetDiscardOlder(x);
458 #define _RO_DO_DATABLOCK_MAKEUNRELIABLE() \
459 datablock->SetReliableFlag(false); \
460 datablock->SetCertainFlag(false); \
461 datablock->SetOrderedFlag(false);
465 #define _RO_DO_DATABLOCK_MAKEAUTOMATIC() \
466 datablock->SetAutomaticUpdatesFlag(true);
470 #define _RO_DO_DATABLOCK_MAKEMANUAL() \
471 datablock->SetAutomaticUpdatesFlag(false);
475 #define _RO_DO_DATABLOCK_FORCEREFLECTIONUPDATE() \
476 datablock->SetForceReflectionUpdate(true);
481 #define _RO_DO_DATABLOCK_REFLECTIONMASTERUPDATE() \
482 datablock->SetReflectionMasterUpdate(true);
486 #define _RO_DO_DATABLOCK_SETUPDATEDELAYMINIMUM(x) \
487 datablock->SetUpdateDelayMinimum(x);
491 #define _RO_DO_DATABLOCK_SETFORCESENDMAXIMUMUPDATES(x) \
492 datablock->SetForceSendMaximumUpdates(x);
496 #define _RO_DO_DATABLOCK_SETFORCESENDTIMEDELAY(x) \
497 datablock->SetForceSendTimeDelay(x);
501 #define _RO_DO_DATABLOCK_SETBAND(x) \
502 datablock->SetBand(x);
507 #define _RO_DO_ENDREGISTERDATABLOCKS(x) \
514 #define _RO_DO_DEFBLOCK_FUNCTION_VAR(x) \
515 void *mDataBlockFunction_##x; \
516 static void x(void *classp,void *opaque_message,void *thisDataBlock);
520 #define GLOBAL_FUNCTION_CALL(x) \
526 #define ALL_REPLICAS_FUNCTION_CALL(x) \
531 #define MASTER_FUNCTION_CALL(x) \
536 #define ONLY_MASTER_FUNCTION_CALL(x) \
538 {x ;} else { Call_##x ;}\
543 #define NOMINATED_REPLICAS_FUNCTION_CALL(a,b,x) \
544 RNReplicaNet::DataBlock_Function::SetSessionIDFilter(a,b); \
549 #ifdef REPLICANET_VISUALDEBUGGER
550 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
551 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, #x );
553 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
554 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, 0 );
555 #endif // ifdef REPLICANET_VISUALDEBUGGER
557 #define _RO_DEF_DO_PREDEF(x) \
558 _RO_DEF_ALLOCATEFUNC(x); \
559 _RO_DEF_DO_PREDEF2(x)
563 #define _RO_DEF_DO_PREDEF2(x) \
564 objectfuncp = _MAKE_RO_ALLOCFUNC(x); \
565 objectfuncp_delete = _MAKE_RO_DELETEFUNC(x); \
566 _RO_DEF_DO_PREDEFREGBLOCK(x); \
567 _MAKE_RO_SETCLASSIDFUNC(x)(ro_id,theBlock); \
568 repNet->AddItem(theBlock); \
569 _MAKE_RO_REGISTERFUNC(x)(); \
573 #define _RO_DO_PREREGISTER_FUNC() \
574 static bool doneregister = false; \
575 void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet) \
577 RNReplicaNet::ReplicaNetDLLRegister thing; \
578 thing.Call(repNet); \
580 void RNReplicaNet::ReplicaNetDLLRegister::Call(RNReplicaNet::ReplicaNet *repNet) \
582 doneregister = true; \
583 RNReplicaNet::s_RO_RegistryBlock *theBlock = 0; \
584 RNReplicaNet::p_RO_Func *objectfuncp = 0; \
585 RNReplicaNet::p_RO_FuncDelete *objectfuncp_delete = 0; \
588 objectfuncp_delete = objectfuncp_delete; \
589 objectfuncp = objectfuncp; \
594 #define _RO_DO_PREREGISTER_FUNC_END() \
599 #define _RO_DEF_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER() \
601 virtual void _Internal_SetupOpaquePointer(void); \
606 #define _RO_DO_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER(x,y) \
607 void _MAKE_RO(x)::_Internal_SetupOpaquePointer(void) \
609 SetOpaquePointer((void *)((y *)((_MAKE_BASE(x) *)this))); \
616 #define _RO_DEF_SETUP_TYPE_SPECIFICS(x) \
618 static int mStaticExpectedNumDataBlocks; \
620 static void StaticSetExpectedNumDataBlocks(const int expected) {mStaticExpectedNumDataBlocks = expected;} \
621 static int StaticGetExpectedNumDataBlocks(void) { return mStaticExpectedNumDataBlocks; } \
622 virtual void SetNumExpectedDataBlocks(const int expected) { StaticSetExpectedNumDataBlocks(expected); } \
623 virtual int GetNumExpectedDataBlocks(void) { return StaticGetExpectedNumDataBlocks(); } \