7#if USING_INSTRUMENTATION
18namespace UE::Sanitizer::RaceDetector {
20 using namespace UE::Instrumentation;
37 return FPlatformAtomics::InterlockedCompareExchange((
volatile int32*)&
Lock,
UINT32_MAX, 0) == 0;
42 while (!TryWriteLock())
71 FPlatformAtomics::InterlockedDecrement((
volatile int32*)&
Lock);
76 while (!TryReadLock())
86 template<
typename MutexType>
107 template<
typename MutexType>
108 class TWriteScopeLock
134 template<
typename MutexType>
222 memset(Locations, 0,
sizeof(Locations));
237 void* Locations[256] = {};
263 return TEXT(
"Write");
265 return TEXT(
"AtomicRead");
267 return TEXT(
"AtomicWrite");
269 return TEXT(
"AtomicReadWrite");
271 return TEXT(
"Unknown");
275 return EnumHasAnyFlags(AccessType, EMemoryAccessType::ACCESS_TYPE_READ);
279 return EnumHasAnyFlags(AccessType, EMemoryAccessType::ACCESS_TYPE_WRITE);
283 return EnumHasAnyFlags(AccessType, EMemoryAccessType::ACCESS_TYPE_ATOMIC);
427 TWriteScopeLock Scope(
Lock);
437 Head = Tail =
nullptr;
480 TWriteScopeLock Scope(
Lock);
486 Head->Prev =
nullptr;
491 Recycle->Next =
Spare;
494 Spare->StartClock = 0;
497 Spare->LastUsed = 0.0;
541 Platform::AsymmetricThreadFenceLight();
563 TReadScopeLock Scope(
Lock);
566 Platform::AsymmetricThreadFenceHeavy();
586 case EHistoryEntryType::FunctionEntry:
590 case EHistoryEntryType::MemoryAccess:
602 case EHistoryEntryType::FunctionExit:
692 "FHistoryChunk::Buffer should be big enough to accomodate initial callstack with plenty of space left"
722 CORE_API extern FContext* GetThreadContext();
732 GetThreadContext()->WinInstrumentationDepth--;
744 FPlatformAtomics::InterlockedIncrement(&ObjectCount);
745 return FInstrumentationSafeWinAllocator::Alloc(
Size);
750 FPlatformAtomics::InterlockedDecrement(&ObjectCount);
751 FInstrumentationSafeWinAllocator::Free(Ptr);
754 template <
typename AtomicOpType>
757 TWriteScopeLock Scope(
Lock);
762 template <
typename AtomicOpType>
765 TWriteScopeLock Scope(
Lock);
770 template <
typename AtomicOpType>
778 TWriteScopeLock Scope(
Lock);
783 template <
typename AtomicOpType,
typename ActualAccessCallbackType>
786 using namespace UE::Instrumentation;
843 checkf(
false,
TEXT(
"Unexpected memory order"));
879 static volatile int64 ObjectCount;
889 FPlatformAtomics::InterlockedIncrement(&ObjectCount);
902 FPlatformAtomics::InterlockedDecrement(&ObjectCount);
921 if (FPlatformAtomics::InterlockedCompareExchangePointer((
void**)&
SyncObjects[
Index], SyncObject,
nullptr) !=
nullptr)
935 return FPlatformAtomics::InterlockedIncrement(&RefCount);
953 static volatile int64 ObjectCount;
955 volatile int32 RefCount = 1;
991 Other.Bank =
nullptr;
992 Other.Object =
nullptr;
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define INSTRUMENTATION_FUNCTION_ATTRIBUTES
Definition Defines.h:5
FRWScopeLockType
Definition ScopeRWLock.h:137
@ SLT_ReadOnly
Definition ScopeRWLock.h:138
@ SLT_Write
Definition ScopeRWLock.h:139
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
ElementType Pop(EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:1196
Definition RefCounting.h:355
int32 GetObjectCount(const OBJECT_ARRAY &Objects)
Definition BoundingVolumeUtilities.h:417
Type
Definition PawnAction_Move.h:11
UE::FRecursiveMutex Mutex
Definition MeshPaintVirtualTexture.cpp:164
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
TRWSpinLock< uint32 > FRWSpinLock
Definition RWSpinLock.h:79
const int32 Order[8][8]
Definition VorbisAudioInfo.cpp:47
U16 Index
Definition radfft.cpp:71
Definition AndroidPlatformTime.h:18
static double Seconds()
Definition AndroidPlatformTime.h:20