From b7c3ffd0fbddc187d2607f4c963aa74f1e4ed88f Mon Sep 17 00:00:00 2001 From: _Redstone_c_ Date: Sat, 7 Jan 2023 11:10:19 +0800 Subject: [PATCH] perf(templates): optimize the performance of TAtomic::FetchFn() --- Redcraft.Utility/Source/Public/Templates/Atomic.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Redcraft.Utility/Source/Public/Templates/Atomic.h b/Redcraft.Utility/Source/Public/Templates/Atomic.h index 7a833bc..85384cb 100644 --- a/Redcraft.Utility/Source/Public/Templates/Atomic.h +++ b/Redcraft.Utility/Source/Public/Templates/Atomic.h @@ -151,7 +151,8 @@ public: FORCEINLINE ValueType FetchFn(F&& Func, EMemoryOrder Order = EMemoryOrder::SequentiallyConsistent) { ValueType Temp(Load(EMemoryOrder::Relaxed)); - while (!CompareExchange(Temp, InvokeResult(Forward(Func), Temp), Order)); + // We do a weak read here because we require a loop. + while (!CompareExchange(Temp, InvokeResult(Forward(Func), Temp), Order, true)); return Temp; } @@ -160,7 +161,8 @@ public: FORCEINLINE ValueType FetchFn(F&& Func, EMemoryOrder Order = EMemoryOrder::SequentiallyConsistent) volatile { ValueType Temp(Load(EMemoryOrder::Relaxed)); - while (!CompareExchange(Temp, InvokeResult(Forward(Func), Temp), Order)); + // We do a weak read here because we require a loop. + while (!CompareExchange(Temp, InvokeResult(Forward(Func), Temp), Order, true)); return Temp; }