EM_Task/CoreUObject/Private/UObject/GarbageCollectionVerification.h

91 lines
2.2 KiB
C
Raw Permalink Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
GarbageCollectionVerification.h: Unreal realtime garbage collection helpers
=============================================================================*/
#pragma once
#include "CoreMinimal.h"
#include "Stats/Stats.h"
#include "UObject/GarbageCollection.h" // Needed for UE_WITH_GC definition
#include "UObject/UObjectGlobals.h"
#include "UObject/Class.h"
// UE_BUILD_SHIPPING has GShouldVerifyGCAssumptions=false by default
#define VERIFY_DISREGARD_GC_ASSUMPTIONS !(UE_BUILD_SHIPPING || UE_BUILD_TEST || !UE_WITH_GC)
#if VERIFY_DISREGARD_GC_ASSUMPTIONS
/** Verifies Disregard for GC assumptions */
void VerifyGCAssumptions();
/** Verifies GC Cluster assumptions */
void VerifyClustersAssumptions();
#endif // VERIFY_DISREGARD_GC_ASSUMPTIONS
#define PROFILE_GCConditionalBeginDestroy 0
#define PROFILE_GCConditionalBeginDestroyByClass 0
#if PROFILE_GCConditionalBeginDestroy
struct FCBDTime
{
double TotalTime;
int32 Items;
FCBDTime()
: TotalTime(0.0), Items(0)
{
}
bool operator<(const FCBDTime& Other) const
{
return TotalTime > Other.TotalTime;
}
};
extern TMap<FName, FCBDTime> CBDTimings;
extern TMap<UObject*, FName> CBDNameLookup;
struct FScopedCBDProfile
{
FName Obj;
double StartTime;
FORCEINLINE FScopedCBDProfile(UObject* InObj)
: StartTime(FPlatformTime::Seconds())
{
CBDNameLookup.Add(InObj, InObj->GetFName());
#if PROFILE_GCConditionalBeginDestroyByClass
UObject* Outermost = ((UObject*)InObj->GetClass());
#else
UObject* Outermost = ((UObject*)InObj->GetOutermost());
#endif
Obj = Outermost->GetFName();
if (Obj == NAME_None)
{
Obj = CBDNameLookup.FindRef(Outermost);
}
}
FORCEINLINE ~FScopedCBDProfile()
{
double ThisTime = FPlatformTime::Seconds() - StartTime;
FCBDTime& Rec = CBDTimings.FindOrAdd(Obj);
Rec.Items++;
Rec.TotalTime += ThisTime;
}
static void DumpProfile();
};
#else
struct FScopedCBDProfile
{
FORCEINLINE FScopedCBDProfile(UObject*)
{
}
FORCEINLINE static void DumpProfile()
{
}
};
#endif