16 #include <nn/pia/clone/clone_Definitions.h>
17 #include <nn/pia/clone/clone_CloneElementBase.h>
18 #include <nn/pia/common/common_OffsetList.h>
46 void Trace(uint64_t flag)
const;
60 return m_IsEventDropped;
85 uint32_t GetBufferEventWaitingStationIndexBitmap(
int index)
const;
98 ClockValue GetBufferEventClock(
int index)
const;
107 return GetTypeStatic();
109 virtual bool IsCloneSupported(
int cloneType)
const;
111 static Type GetTypeStatic()
117 CloneElementBase* pElement,
118 IDataPacker* pAckPacker,
124 uint32_t dispatchCount);
126 static uint32_t GetDataChunkHeaderSize();
129 typedef uint16_t Index;
132 enum ReceiveDataResponse
134 ReceiveDataResponse_Nothing,
135 ReceiveDataResponse_Ack,
136 ReceiveDataResponse_PreserverMigration
138 ReceiveDataResponse ReceiveData(
const void* cpData, uint32_t size,
StationIndex src,
StationIndex setter,
ClockValue clock, uint64_t registerCountAll, uint32_t destBitmap, Index index, Index eraseIndex);
140 void ReceivePreserverMigration(
StationIndex src, Index index);
146 virtual void ClearData();
154 static const uint32_t BufferSizeMin = 2;
155 static const uint32_t BufferSizeMax = 0x3fff;
158 class EventSendToken :
public CloneElementBase::ResendableSendToken
166 virtual TokenType GetTokenType()
const = 0;
170 class EventInitialToken :
public EventSendToken
173 explicit EventInitialToken(EventCloneElementBase* pElement)
174 : EventSendToken(), m_pElement(pElement)
178 virtual Type GetElementType()
const
182 virtual uint32_t GetDestBitmap()
const
186 virtual TokenType GetTokenType()
const
188 return TokenType_Initial;
190 virtual uint32_t GetChunkSize()
const;
191 virtual void WriteChunk(
void* pChunkBuffer)
const;
192 virtual CloneElementBase* GetElement()
199 return m_pElement->GetId();
202 Index GetInitialIndex()
const
204 return m_pElement->m_pEventTokenBuffer->GetNextIndex();
206 void SetDestBitmap(uint32_t destBitmap)
208 m_DestBitmap = destBitmap;
210 virtual void TraceTokenType()
216 EventCloneElementBase* m_pElement;
217 uint32_t m_DestBitmap;
221 class EventTokenBase :
public EventSendToken
228 void Init(EventCloneElementBase* pElement)
230 m_pElement = pElement;
233 virtual Type GetElementType()
const
237 virtual uint32_t GetDestBitmap()
const
241 virtual TokenType GetTokenType()
const
243 return TokenType_Event;
245 virtual uint32_t GetChunkSize()
const;
246 virtual void WriteChunk(
void* pChunkBuffer)
const;
247 virtual CloneElementBase* GetElement()
251 virtual bool IsUnicast()
const
253 #if NN_PIA_ENABLE_CLONE_BROADCAST_RESEND
260 Index GetIndex()
const
266 return m_SetterStationIndex;
270 return m_PreserverStationIndex;
276 uint64_t GetRegisterCountAll()
const
278 return m_RegisterCountAll;
281 void SetDestBitmap(uint32_t destBitmap)
283 m_DestBitmap = destBitmap;
285 void RemoveDestBmp(uint32_t bmp)
287 m_DestBitmap &= ~bmp;
293 void SetIndex(Index index)
299 m_SetterStationIndex = stationIndex;
301 void SetPreserverStationIndex(
StationIndex stationIndex)
303 m_PreserverStationIndex = stationIndex;
309 void SetRegisterCountAll(uint64_t count)
311 m_RegisterCountAll = count;
316 State_EventTokenEmpty,
318 State_EventTokenReceived,
319 State_EventTokenHandled
322 State GetState()
const
326 void SetState(State state)
333 return m_pElement->GetId();
335 virtual uint32_t GetSize()
const
337 return m_pElement->GetSize();
339 virtual void Serialize(
void* pBuffer)
const = 0;
340 virtual void Deserialize(
const void* cpBuffer) = 0;
341 Index GetEraseIndex()
const
343 return m_pElement->m_pEventTokenBuffer->GetEraseIndex();
346 void CancelSendData()
348 m_pElement->CancelSendData(
this);
352 m_pElement->AddSendData(
this);
354 virtual void TraceTokenType()
360 EventCloneElementBase* m_pElement;
361 uint32_t m_DestBitmap;
366 uint64_t m_RegisterCountAll;
371 class EventTokenBufferBase
374 explicit EventTokenBufferBase(uint32_t size);
378 void InitIndex(Index index);
379 EventTokenBase* Get(Index index);
380 EventTokenBase* AssignNext();
381 EventTokenBase* Assign(Index index);
384 Index GetHeadIndex()
const
386 return At(m_HeadIdx)->GetIndex();
392 Index GetEraseIndex()
const
396 Index GetNextIndex()
const;
399 void Complement(
StationIndex stationIndex, uint32_t destBitmap);
407 uint32_t GetBufferEventWaitingStationIndexBitmap(
int index)
const;
408 ClockValue GetBufferEventClock(
int index)
const;
411 virtual EventTokenBase* At(
int idx) = 0;
412 virtual const EventTokenBase* At(
int idx)
const = 0;
423 explicit EventCloneElementBase(EventTokenBufferBase* pEventTokenBuffer);
426 Result SetValueCore(EventTokenBase** ppTokenBase);
427 void HandleNextCore();
428 const EventTokenBase* GetHandlingEventToken()
const
430 return m_pHandlingEventToken;
437 IndexState_EventInvalid,
438 IndexState_EventInit,
439 IndexState_EventAdjust,
440 IndexState_EventValid
443 IndexState m_IndexState;
445 Index m_HandledIndex;
446 EventTokenBase* m_pHandlingEventToken;
449 EventInitialToken m_InitialToken;
450 EventTokenBufferBase* m_pEventTokenBuffer;
452 bool m_IsEventDropped;
454 static Definition<EventCloneElementBase> s_Definition;
457 template <
int TEST_ID,
typename Arg>
458 static void Test(
const EventCloneElementBase& obj, Arg* pArg = NULL);
460 NN_PIA_DISALLOW_COPY(EventCloneElementBase);