4#include "Containers/Array.h"
23 friend class ::FHazardPointerCollection;
59 template<
typename,
bool>
65 double TimeOfLastCollection = .0;
73 ReclamationList.
Empty();
77 class alignas(PLATFORM_CACHE_LINE_SIZE * 2) FHazardRecord
81 template<
typename,
bool>
85 std::atomic<uintptr_t> Hazard{ FreeHazardEntry };
90 FHazardRecord() =
default;
93 FHazardRecord() =
default;
96 inline void* GetHazard()
const
98 return reinterpret_cast<void*
>(Hazard.load(std::memory_order_acquire));
105 std::atomic_thread_fence(std::memory_order_seq_cst);
106 return reinterpret_cast<void*
>(Hazard.load(std::memory_order_acquire));
112 Hazard.store(0, std::memory_order_release);
118 Hazard.store(FreeHazardEntry, std::memory_order_release);
138 static constexpr uint32 HazardChunkSize = 32;
139 struct FHazardRecordChunk
141 FHazardRecord Records[HazardChunkSize] = {};
142 std::atomic<FHazardRecordChunk*>
Next{
nullptr };
144 inline void*
operator new(
size_t Size)
146 return FMemory::Malloc(
Size, 128u);
149 inline void operator delete(
void* Ptr)
155 FHazardRecordChunk Head;
163 std::atomic_uint TotalNumHazardRecords{ HazardChunkSize };
170 template<
bool Cached>
182 template<
bool Cached>
189 static std::atomic_uint
counter{0};
190 uint32 value =
counter.fetch_add(1, std::memory_order_relaxed);
191 value = ((value >> 16) ^ value) * 0x45d9f3b;
192 value = ((value >> 16) ^ value) * 0x45d9f3b;
193 value = (value >> 16) ^ value;
198 static thread_local uint32 StartIndex = FPseudo::GetThreadId();
200 FHazardRecordChunk* p = &Head;
203 p = p->Next.load(std::memory_order_relaxed);
210 for (
uint64 idx = 0; idx < HazardChunkSize; idx++)
214 uint64 i = (StartIndex + idx) % HazardChunkSize;
215 if (p->Records[i].Hazard.compare_exchange_weak(
FreeEntry,
Nullptr, std::memory_order_relaxed))
217 checkSlow(p->Records[i].GetHazard() ==
nullptr);
218 return &p->Records[i];
221 p = p->Next.load(std::memory_order_relaxed);
243template<
typename H,
bool Cached = false>
249 std::atomic<H*>* Hazard =
nullptr;
250 FHazardPointerCollection::FHazardRecord* Record =
nullptr;
259 Other.Hazard =
nullptr;
260 Other.Record =
nullptr;
269 Hazard =
Other.Hazard;
271 Other.Hazard =
nullptr;
272 Other.Record =
nullptr;
316 }
while (
HazardPointer != Hazard->load(std::memory_order_acquire));
322 return Hazard !=
nullptr &&
Record !=
nullptr;
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
THazardPointer< H, false > MakeHazardPointer(std::atomic< H * > &InHazard, FHazardPointerCollection &Collection)
Definition HazardPointer.h:327
uint32 GetThreadId(uint64 State)
Definition Ticker.cpp:34
uint32 Size
Definition VulkanMemory.cpp:4034
Definition HazardPointer.h:58
void Delete(D *Pointer, int32 CollectLimit=-1)
Definition HazardPointer.h:230
CORE_API ~FHazardPointerCollection()
Definition HazardPointer.cpp:9
FHazardPointerCollection()
Definition HazardPointer.h:174
FHazardRecord * Acquire()
Definition HazardPointer.h:183
Definition HazardPointer.h:22
FHazardDeleter(void *InPointer)
Definition HazardPointer.h:27
FHazardDeleter(const FHazardDeleter &Other)
Definition HazardPointer.h:35
void * Pointer
Definition HazardPointer.h:26
FHazardDeleter & operator=(const FHazardDeleter &Other)
Definition HazardPointer.h:41
virtual void Delete()
Definition HazardPointer.h:29
bool operator==(const FHazardDeleter &Other) const
Definition HazardPointer.h:48
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition HazardPointer.h:245
~THazardPointer()
Definition HazardPointer.h:285
THazardPointer(THazardPointer &&Other)
Definition HazardPointer.h:253
H * Get() const
Definition HazardPointer.h:309
THazardPointer & operator=(THazardPointer &&Other)
Definition HazardPointer.h:263
void Destroy()
Definition HazardPointer.h:301
THazardPointer(std::atomic< H * > &InHazard, FHazardPointerCollection &Collection)
Definition HazardPointer.h:279
void Retire()
Definition HazardPointer.h:294
bool IsValid()
Definition HazardPointer.h:320
@ Delete
Definition PendingSpatialData.h:16
Definition HazardPointer.h:17
static uint32 AllocTlsSlot(void)
Definition AndroidPlatformTLS.h:30
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685