UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GarbageCollectionInternalFlags.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*==============================================================================================
4 GarbageCollectionInternalFlags.h: Unreal realtime garbage collection internal flags helpers
5===============================================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
10#include "Stats/Stats.h"
12#include "UObject/Object.h"
14
15namespace UE::GC::Private
16{
17
25{
27 static EInternalObjectFlags ReachableObjectFlag;
28
30 static EInternalObjectFlags MaybeUnreachableObjectFlag;
31
32public:
33
34 FORCEINLINE static void SetUnreachable(FUObjectItem* ObjectItem)
35 {
36 ObjectItem->AtomicallySetFlag_ForGC(EInternalObjectFlags::Unreachable);
37 }
38
40 {
41 ObjectItem->AtomicallySetFlag_ForGC(ReachableObjectFlag);
42 }
43
44 FORCEINLINE static bool IsReachable_ForGC(const FUObjectItem* ObjectItem)
45 {
46 return !!(ObjectItem->GetFlagsInternal() & int32(ReachableObjectFlag));
47 }
48
50 {
51 ObjectItem->AtomicallyClearFlag_ForGC(ReachableObjectFlag);
52 ObjectItem->AtomicallySetFlag_ForGC(MaybeUnreachableObjectFlag);
53 }
54
56 {
57 ObjectItem->AtomicallyClearFlag_ForGC(MaybeUnreachableObjectFlag);
58 ObjectItem->AtomicallySetFlag_ForGC(ReachableObjectFlag);
59 }
60
61 FORCEINLINE static bool IsMaybeUnreachable_ForGC(const FUObjectItem* ObjectItem)
62 {
63 return !!(ObjectItem->GetFlagsInternal() & int32(MaybeUnreachableObjectFlag));
64 }
65
66 FORCEINLINE static bool IsMaybeUnreachable_ForGC(const UObject* Object)
67 {
69 return IsMaybeUnreachable_ForGC(ObjectItem);
70 }
71
73 {
74 return ObjectItem->AtomicallyClearFlag_ForGC(EInternalObjectFlags::Unreachable);
75 }
76
78 {
79 return ObjectItem->AtomicallySetFlag_ForGC(Flag);
80 }
81
83 {
84 return ObjectItem->AtomicallyClearFlag_ForGC(Flag);
85 }
86
88 {
89 FPlatformAtomics::InterlockedAnd(&ObjectItem->FlagsAndRefCount, ~(int64(MaybeUnreachableObjectFlag) << 32));
90 FPlatformAtomics::InterlockedOr(&ObjectItem->FlagsAndRefCount, int64(ReachableObjectFlag) << 32);
91 }
92
94 {
95 FPlatformAtomics::InterlockedAnd(&ObjectItem->FlagsAndRefCount, ~(int64(MaybeUnreachableObjectFlag | EInternalObjectFlags::ReachableInCluster) << 32));
96 FPlatformAtomics::InterlockedOr(&ObjectItem->FlagsAndRefCount, int64(ReachableObjectFlag) << 32);
97 }
98
100 {
101 const int32 FlagToClear = int32(MaybeUnreachableObjectFlag);
102 if (ObjectItem->GetFlagsInternal() & FlagToClear)
103 {
104 int64 Old = FPlatformAtomics::InterlockedAnd(&ObjectItem->FlagsAndRefCount, ~((int64)FlagToClear << 32));
105 FPlatformAtomics::InterlockedOr(&ObjectItem->FlagsAndRefCount, int64(ReachableObjectFlag) << 32);
106 return FUObjectItem::GetFlagsInternal(Old) & FlagToClear;
107 }
108 return false;
109 }
110
111 FORCEINLINE static constexpr ::size_t OffsetOfFlags_ForGC()
112 {
113 return offsetof(FUObjectItem, FlagsAndRefCount);
114 }
115
117 {
118 // It's important to lock the global UObjectArray so that the flag swap doesn't occur while a new object is being created
119 // as we set the GReachableObjectFlag on all newly created objects
121
122 Swap(ReachableObjectFlag, MaybeUnreachableObjectFlag);
123
124 // Maintain the old flag variables for backwards compatibility
126 UE::GC::GReachableObjectFlag = ReachableObjectFlag;
127 UE::GC::GMaybeUnreachableObjectFlag = MaybeUnreachableObjectFlag;
129
131 }
132
134 {
135 return ReachableObjectFlag;
136 }
137
139 {
140 return MaybeUnreachableObjectFlag;
141 }
142
144 {
145 return false;
146 }
147};
148
149} // namespace UE::GC::Private
#define FORCEINLINE
Definition AndroidPlatform.h:140
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
EInternalObjectFlags
Definition ObjectMacros.h:631
@ Unreachable
Object is not reachable on the object graph.
@ ReachableInCluster
External reference to object in cluster exists.
FUObjectArray GUObjectArray
Definition UObjectHash.cpp:55
void LockInternalArray() const
Definition UObjectArray.h:1335
UE_FORCEINLINE_HINT int32 ObjectToIndex(const class UObjectBase *Object) const
Definition UObjectArray.h:1078
void UnlockInternalArray() const
Definition UObjectArray.h:1345
UE_FORCEINLINE_HINT FUObjectItem * IndexToObjectUnsafeForGC(int32 Index)
Definition UObjectArray.h:1099
Definition GarbageCollectionInternalFlags.h:25
static FORCEINLINE void SwapReachableAndMaybeUnreachable()
Definition GarbageCollectionInternalFlags.h:116
static FORCEINLINE bool IsMaybeUnreachable_ForGC(const UObject *Object)
Definition GarbageCollectionInternalFlags.h:66
static FORCEINLINE void FastMarkAsReachableAndClearReachableInClusterInterlocked_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:93
static FORCEINLINE bool ThisThreadAtomicallyClearedRFUnreachable(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:72
static FORCEINLINE bool IsMaybeUnreachable_ForGC(const FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:61
static FORCEINLINE bool MarkAsReachableInterlocked_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:99
static FORCEINLINE bool IsReachable_ForGC(const FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:44
static FORCEINLINE void SetUnreachable(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:34
static FORCEINLINE EInternalObjectFlags GetMaybeUnreachableFlagValue_ForGC()
Definition GarbageCollectionInternalFlags.h:138
static FORCEINLINE EInternalObjectFlags GetReachableFlagValue_ForGC()
Definition GarbageCollectionInternalFlags.h:133
static FORCEINLINEconstexpr ::size_t OffsetOfFlags_ForGC()
Definition GarbageCollectionInternalFlags.h:111
static FORCEINLINE bool ThisThreadAtomicallyClearedFlag_ForGC(FUObjectItem *ObjectItem, EInternalObjectFlags Flag)
Definition GarbageCollectionInternalFlags.h:82
static FORCEINLINE void FastMarkAsReachableInterlocked_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:87
static FORCEINLINE void SetReachable_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:39
static FORCEINLINE void SetMaybeUnreachable_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:49
static FORCEINLINE bool ThisThreadAtomicallySetFlag_ForGC(FUObjectItem *ObjectItem, EInternalObjectFlags Flag)
Definition GarbageCollectionInternalFlags.h:77
static FORCEINLINE void ClearMaybeUnreachable_ForGC(FUObjectItem *ObjectItem)
Definition GarbageCollectionInternalFlags.h:55
static FORCEINLINE bool IsIncrementalGatherUnreachableSupported()
Definition GarbageCollectionInternalFlags.h:143
Definition Object.h:95
Definition GarbageCollection.cpp:624
EInternalObjectFlags GMaybeUnreachableObjectFlag
Definition GarbageCollection.cpp:618
EInternalObjectFlags GReachableObjectFlag
Definition GarbageCollection.cpp:612
Definition UObjectArray.h:50
int64 FlagsAndRefCount
Definition UObjectArray.h:63