Use exchange instead of CAS to gain ownership of the linked list of new trace events.

#rb johan.berg
#rnx

[CL 15872372 by Martin Ridgers in ue5-main branch]
This commit is contained in:
Martin Ridgers
2021-03-31 04:24:02 -04:00
parent 4c5985ddb2
commit 5313a089ed
@@ -40,18 +40,12 @@ const FEventNode* FEventNode::FIter::GetNext()
////////////////////////////////////////////////////////////////////////////////
FEventNode::FIter FEventNode::ReadNew()
{
FEventNode* EventList = AtomicLoadRelaxed(&GNewEventList);
FEventNode* EventList = AtomicExchangeAcquire(&GNewEventList, (FEventNode*)nullptr);
if (EventList == nullptr)
{
return {};
}
while (!AtomicCompareExchangeAcquire(&GNewEventList, (FEventNode*)nullptr, EventList))
{
PlatformYield();
EventList = AtomicLoadRelaxed(&GNewEventList);
}
if (GEventListHead == nullptr)
{
GEventListHead = EventList;
@@ -187,15 +181,7 @@ void FEventNode::OnConnect()
return;
}
for (;; PlatformYield())
{
FEventNode* Node = AtomicLoadRelaxed(&GNewEventList);
if (AtomicCompareExchangeRelaxed(&GNewEventList, GEventListHead, Node))
{
GEventListTail->Next = Node;
break;
}
}
GEventListTail->Next = AtomicExchangeAcquire(&GNewEventList, GEventListHead);
GEventListHead = GEventListTail = nullptr;
}