UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Atomic.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "HAL/Platform.h"
6#include <atomic>
7
8#if PLATFORM_CPU_X86_FAMILY
9# include <immintrin.h>
10#endif
11
12#if !defined(TRACE_PRIVATE_THREAD_YIELD)
13# define TRACE_PRIVATE_THREAD_YIELD 0
14#endif
15
16namespace UE {
17namespace Trace {
18namespace Private {
19
21template <typename Type> Type AtomicLoadRelaxed(Type volatile* Source);
22template <typename Type> Type AtomicLoadAcquire(Type volatile* Source);
23template <typename Type> void AtomicStoreRelaxed(Type volatile* Target, Type Value);
24template <typename Type> void AtomicStoreRelease(Type volatile* Target, Type Value);
25template <typename Type> Type AtomicExchangeAcquire(Type volatile* Target, Type Value);
26template <typename Type> Type AtomicExchangeRelease(Type volatile* Target, Type Value);
27template <typename Type> bool AtomicCompareExchangeRelaxed(Type volatile* Target, Type New, Type Expected);
28template <typename Type> bool AtomicCompareExchangeAcquire(Type volatile* Target, Type New, Type Expected);
29template <typename Type> bool AtomicCompareExchangeRelease(Type volatile* Target, Type New, Type Expected);
30template <typename Type> Type AtomicAddRelaxed(Type volatile* Target, Type Value);
31template <typename Type> Type AtomicAddRelease(Type volatile* Target, Type Value);
32template <typename Type> Type AtomicAddAcquire(Type volatile* Target, Type Value);
33template <typename Type> Type AtomicSubRelaxed(Type volatile* Target, Type Value);
34template <typename Type> Type AtomicSubRelease(Type volatile* Target, Type Value);
35template <typename Type> Type AtomicSubAcquire(Type volatile* Target, Type Value);
36void PlatformYield();
37
39inline void PlatformYield()
40{
41#if TRACE_PRIVATE_THREAD_YIELD
42 extern void ThreadYield();
44#elif PLATFORM_USE_SSE2_FOR_THREAD_YIELD
45 _mm_pause();
46#elif PLATFORM_CPU_ARM_FAMILY
47# if defined(_MSC_VER) && !defined(__clang__) // MSVC
48 __yield();
49# else
51# endif
52#else
53 #error Unsupported architecture!
54#endif
55}
56
58template <typename Type>
59inline Type AtomicLoadRelaxed(Type volatile* Source)
60{
61 std::atomic<Type>* T = (std::atomic<Type>*) Source;
62 return T->load(std::memory_order_relaxed);
63}
64
66template <typename Type>
67inline Type AtomicLoadAcquire(Type volatile* Source)
68{
69 std::atomic<Type>* T = (std::atomic<Type>*) Source;
70 return T->load(std::memory_order_acquire);
71}
72
74template <typename Type>
75inline void AtomicStoreRelaxed(Type volatile* Target, Type Value)
76{
77 std::atomic<Type>* T = (std::atomic<Type>*) Target;
78 T->store(Value, std::memory_order_relaxed);
79}
80
82template <typename Type>
83inline void AtomicStoreRelease(Type volatile* Target, Type Value)
84{
85 std::atomic<Type>* T = (std::atomic<Type>*) Target;
86 T->store(Value, std::memory_order_release);
87}
88
90template <typename Type>
91inline Type AtomicExchangeAcquire(Type volatile* Target, Type Value)
92{
93 std::atomic<Type>* T = (std::atomic<Type>*) Target;
94 return T->exchange(Value, std::memory_order_acquire);
95}
96
98template <typename Type>
99inline Type AtomicExchangeRelease(Type volatile* Target, Type Value)
100{
101 std::atomic<Type>* T = (std::atomic<Type>*) Target;
102 return T->exchange(Value, std::memory_order_release);
103}
104
106template <typename Type>
107inline bool AtomicCompareExchangeRelaxed(Type volatile* Target, Type New, Type Expected)
108{
109 std::atomic<Type>* T = (std::atomic<Type>*) Target;
110 return T->compare_exchange_weak(Expected, New, std::memory_order_relaxed);
111}
112
114template <typename Type>
115inline bool AtomicCompareExchangeAcquire(Type volatile* Target, Type New, Type Expected)
116{
117 std::atomic<Type>* T = (std::atomic<Type>*) Target;
118 return T->compare_exchange_weak(Expected, New, std::memory_order_acquire);
119}
120
122template <typename Type>
123inline bool AtomicCompareExchangeRelease(Type volatile* Target, Type New, Type Expected)
124{
125 std::atomic<Type>* T = (std::atomic<Type>*) Target;
126 return T->compare_exchange_weak(Expected, New, std::memory_order_release);
127}
128
130template <typename Type>
131inline Type AtomicAddRelaxed(Type volatile* Target, Type Value)
132{
133 std::atomic<Type>* T = (std::atomic<Type>*) Target;
134 return T->fetch_add(Value, std::memory_order_relaxed);
135}
136
138template <typename Type>
139inline Type AtomicAddAcquire(Type volatile* Target, Type Value)
140{
141 std::atomic<Type>* T = (std::atomic<Type>*) Target;
142 return T->fetch_add(Value, std::memory_order_acquire);
143}
144
146template <typename Type>
147inline Type AtomicAddRelease(Type volatile* Target, Type Value)
148{
149 std::atomic<Type>* T = (std::atomic<Type>*) Target;
150 return T->fetch_add(Value, std::memory_order_release);
151}
152
154template <typename Type>
155inline Type AtomicSubRelaxed(Type volatile* Target, Type Value)
156{
157 std::atomic<Type>* T = (std::atomic<Type>*) Target;
158 return T->fetch_sub(Value, std::memory_order_relaxed);
159}
160
162template <typename Type>
163inline Type AtomicSubAcquire(Type volatile* Target, Type Value)
164{
165 std::atomic<Type>* T = (std::atomic<Type>*) Target;
166 return T->fetch_sub(Value, std::memory_order_acquire);
167}
168
170template <typename Type>
171inline Type AtomicSubRelease(Type volatile* Target, Type Value)
172{
173 std::atomic<Type>* T = (std::atomic<Type>*) Target;
174 return T->fetch_sub(Value, std::memory_order_release);
175}
176
177} // namespace Private
178} // namespace Trace
179} // namespace UE
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T * New(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:259
Definition OverriddenPropertySet.cpp:45
bool AtomicCompareExchangeAcquire(Type volatile *Target, Type New, Type Expected)
Definition Atomic.h:115
void AtomicStoreRelaxed(Type volatile *Target, Type Value)
Definition Atomic.h:75
void AtomicStoreRelease(Type volatile *Target, Type Value)
Definition Atomic.h:83
Type AtomicExchangeRelease(Type volatile *Target, Type Value)
Definition Atomic.h:99
Type AtomicAddRelaxed(Type volatile *Target, Type Value)
Definition Atomic.h:131
Type AtomicAddAcquire(Type volatile *Target, Type Value)
Definition Atomic.h:139
Type AtomicExchangeAcquire(Type volatile *Target, Type Value)
Definition Atomic.h:91
Type AtomicSubAcquire(Type volatile *Target, Type Value)
Definition Atomic.h:163
bool AtomicCompareExchangeRelaxed(Type volatile *Target, Type New, Type Expected)
Definition Atomic.h:107
Type AtomicLoadRelaxed(Type volatile *Source)
Definition Atomic.h:59
Type AtomicSubRelaxed(Type volatile *Target, Type Value)
Definition Atomic.h:155
Type AtomicLoadAcquire(Type volatile *Source)
Definition Atomic.h:67
bool AtomicCompareExchangeRelease(Type volatile *Target, Type New, Type Expected)
Definition Atomic.h:123
Type AtomicSubRelease(Type volatile *Target, Type Value)
Definition Atomic.h:171
void PlatformYield()
Definition Atomic.h:39
Type AtomicAddRelease(Type volatile *Target, Type Value)
Definition Atomic.h:147
Definition AdvancedWidgetsModule.cpp:13