UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RemoteExecutor.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
8#include "UObject/Class.h"
9#include "Async/Async.h"
10
12
14{
16 explicit constexpr FRemoteTransactionId(uint32 InId)
17 : Id(InId)
18 {
19 }
20
22 {
23 return FRemoteTransactionId();
24 }
25
26 bool operator==(const FRemoteTransactionId& Rhs) const { return Id == Rhs.Id; }
27 bool operator!=(const FRemoteTransactionId& Rhs) const { return Id != Rhs.Id; }
28
30 {
31 return Id;
32 }
33 bool IsValid() const
34 {
35 return Id != 0;
36 }
37 FString ToString() const
38 {
39 return FString::FromInt(Id);
40 }
42 {
43 Id = Other.Id;
44 }
45
47
48private:
49 uint32 Id = 0;
50};
51
53{
54 // the data is packed in a uint64 to allow passing by value in a register
55 // [63:32] : FRemoteServerId RootServerId
56 // [31:24] : uint8 WorkDepth
57 // [23:0] : FRemoteTransactionId RootWorkTransactionId
58 //
59 // this allows comparison of priority to be a single uint64 compare-less-than
60 //
61 // the WorkDepth is stored subtracted from 0xFF so that less-than means higher priority
62 // 0xFF is the root depth
63 // 0xFE is one deeper
64 //
66 static_assert(sizeof(FRemoteServerId) == 4);
67 static_assert(sizeof(FRemoteTransactionId) == 4);
68
70 uint32 GetWorkDepth() const { return (PackedData >> 24) & 0xFFu; }
72
73 bool IsValid() const { return GetRootServerId().IsValid(); }
74
76
77 // creates a copy of this priority with the WorkDepth decreased by 1
79
80 COREUOBJECT_API FString ToString() const;
81};
82
88
90{
91protected:
93
94public:
95
97 virtual ~FRemoteSubsystemBase() = default;
98
99 int32 GetRequestCount() const { return Requests.Num(); }
100
101 // implemented in FRemoteSubsystem<>
103 virtual void DestroyRequest(FRemoteTransactionId RequestId) = 0;
104 virtual void SetActiveRequest(FRemoteTransactionId RequestId) = 0;
105 virtual void ClearActiveRequest() = 0;
106
107 // for subsystem implementor to override:
108 virtual const TCHAR* NameForDebug() = 0;
109 virtual void BeginRequest() = 0;
110 virtual void TickSubsystem() = 0;
111 virtual void TickRequest() = 0;
112 virtual void TickAbortedRequest() = 0;
113 virtual bool AreDependenciesSatisfied() const = 0;
115 virtual void ExecuteMultiServerCommit() = 0;
116 virtual void AbortMultiServerCommit() = 0;
117 virtual void CommitMultiServerCommit() = 0;
118
119 virtual void EndRequest(bool bTransactionCommitted) = 0;
120};
121
122template<typename RequestType>
124{
125public:
126 RequestType* ActiveRequest = nullptr;
127
128 RequestType* GetRequestByIndex(int32 RequestIndex) const
129 {
130 const TTuple<FRemoteTransactionId, void*> RequestData = Requests[RequestIndex];
131 return static_cast<RequestType*>(RequestData.Get<1>());
132 }
133
134 RequestType* TryGetRequest(FRemoteTransactionId RequestId) const
135 {
136 for (int32 RequestIndex = 0; RequestIndex < Requests.Num(); RequestIndex++)
137 {
138 const TTuple<FRemoteTransactionId, void*>& RequestData = Requests[RequestIndex];
139 if (RequestData.Get<0>() == RequestId)
140 return static_cast<RequestType*>(RequestData.Get<1>());
141 }
142
143 return nullptr;
144 }
145
147 {
148 int32 Result = INDEX_NONE;
149
150 for (int32 RequestIndex = 0; RequestIndex < Requests.Num(); RequestIndex++)
151 {
152 const TTuple<FRemoteTransactionId, void*>& RequestData = Requests[RequestIndex];
153 if (RequestData.Get<0>() == RequestId)
154 {
155 Result = RequestIndex;
156 break;
157 }
158 }
159
160 return Result;
161 }
162
164 {
165 RequestType* Request = new RequestType{};
166 Request->RequestId = RequestId;
167 Request->Priority = Priority;
169 return Request;
170 }
171
173 {
174 int32 RequestIndex = TryGetRequestIndex(RequestId);
175 check(RequestIndex != INDEX_NONE);
176 RequestType* Request = GetRequestByIndex(RequestIndex);
178 delete Request;
179 }
180
182 {
183 ActiveRequest = TryGetRequest(RequestId);
185 }
186
188 {
189 ActiveRequest = nullptr;
190 }
191};
192
193namespace UE::RemoteExecutor
194{
203
206
209
212
215
218
221
223 extern COREUOBJECT_API TDelegate<void(const FString& /*Text*/)> OnRegionEndDelegate;
224
226
227 COREUOBJECT_API void ExecuteTransactional(FName WorkName, const TFunctionRef<void(void)>& Work);
229 COREUOBJECT_API void EnqueueWorkWithExplicitPriority(FName WorkName, FRemoteWorkPriority WorkPriority, bool bIsTransactional, const TFunction<void(void)>& Work);
230 COREUOBJECT_API void EnqueueWork(FName WorkName, bool bIsTransactional, const TFunction<void(void)>& Work);
232
236
238
244
247
252
254}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
const bool
Definition NetworkReplayStreaming.h:178
COREUOBJECT_API bool IsHigherPriority(FRemoteWorkPriority Lhs, FRemoteWorkPriority Rhs)
Definition RemoteExecutor.cpp:1025
COREUOBJECT_API bool IsEqualPriority(FRemoteWorkPriority Lhs, FRemoteWorkPriority Rhs)
Definition RemoteExecutor.cpp:1030
COREUOBJECT_API bool operator==(FRemoteWorkPriority Lhs, FRemoteWorkPriority Rhs)
Definition RemoteExecutor.cpp:1041
COREUOBJECT_API FArchive & operator<<(FArchive &Ar, FRemoteWorkPriority &Priority)
Definition RemoteExecutor.cpp:1046
COREUOBJECT_API bool IsHigherOrEqualPriority(FRemoteWorkPriority Lhs, FRemoteWorkPriority Rhs)
Definition RemoteExecutor.cpp:1036
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition NameTypes.h:617
Definition RemoteExecutor.h:90
virtual bool AreDependenciesSatisfied() const =0
virtual void ClearActiveRequest()=0
FRemoteSubsystemBase()=default
virtual void AbortMultiServerCommit()=0
virtual void TickAbortedRequest()=0
virtual void EndRequest(bool bTransactionCommitted)=0
virtual void DestroyRequest(FRemoteTransactionId RequestId)=0
virtual const TCHAR * NameForDebug()=0
virtual void SetActiveRequest(FRemoteTransactionId RequestId)=0
virtual void * CreateRequest(FRemoteTransactionId RequestId, FRemoteWorkPriority Priority)=0
virtual void BeginRequest()=0
virtual void CommitMultiServerCommit()=0
virtual ~FRemoteSubsystemBase()=default
virtual void BeginMultiServerCommit(TArray< FRemoteServerId > &OutMultiServerCommitRemoteServers)=0
TArray< TTuple< FRemoteTransactionId, void * > > Requests
Definition RemoteExecutor.h:92
int32 GetRequestCount() const
Definition RemoteExecutor.h:99
virtual void TickRequest()=0
virtual void ExecuteMultiServerCommit()=0
virtual void TickSubsystem()=0
Definition RemoteExecutor.h:124
void DestroyRequest(FRemoteTransactionId RequestId) final
Definition RemoteExecutor.h:172
void SetActiveRequest(FRemoteTransactionId RequestId) final
Definition RemoteExecutor.h:181
RequestType * ActiveRequest
Definition RemoteExecutor.h:126
void ClearActiveRequest() final
Definition RemoteExecutor.h:187
void * CreateRequest(FRemoteTransactionId RequestId, FRemoteWorkPriority Priority) final
Definition RemoteExecutor.h:163
RequestType * TryGetRequest(FRemoteTransactionId RequestId) const
Definition RemoteExecutor.h:134
RequestType * GetRequestByIndex(int32 RequestIndex) const
Definition RemoteExecutor.h:128
int32 TryGetRequestIndex(FRemoteTransactionId RequestId) const
Definition RemoteExecutor.h:146
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void RemoveAt(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2083
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition DelegateSignatureImpl.inl:310
Definition AssetRegistryState.h:50
Definition AndroidPlatformMisc.h:14
Definition DelegateSignatureImpl.inl:1029
Definition RemoteExecutor.cpp:22
void AbandonRemoteMultiServerCommit(FRemoteServerId ServerId, FRemoteTransactionId RequestId)
Definition RemoteExecutor.cpp:859
TDelegate< void(FRemoteTransactionId, FRemoteWorkPriority, const TArray< FRemoteServerId > &)> BeginMultiServerCommitDelegate
Definition RemoteExecutor.cpp:24
TMulticastDelegate< void(FRemoteTransactionId, uint32, const FString &)> OnTransactionAbortedDelegate
Definition RemoteExecutor.cpp:35
COREUOBJECT_API void GlobalServerSync(FName SyncName)
COREUOBJECT_API void GlobalServerSyncAndRecomputeObjectOwners(FName SyncName)
void EnqueueWork(FName WorkName, bool bIsTransactional, const TFunction< void(void)> &InWork)
Definition RemoteExecutor.cpp:980
TDelegate< void(FRemoteTransactionId, FRemoteServerId)> AbortRemoteMultiServerCommitDelegate
Definition RemoteExecutor.cpp:29
TMulticastDelegate< void(FRemoteTransactionId, FName)> OnTransactionQueuedDelegate
Definition RemoteExecutor.cpp:32
TMulticastDelegate< void(FRemoteTransactionId)> OnTransactionReleasedDelegate
Definition RemoteExecutor.cpp:36
void ExecuteTransactionalWithExplicitPriority(FName WorkName, FRemoteWorkPriority WorkPriority, const TFunctionRef< void(void)> &Work)
Definition RemoteExecutor.cpp:956
void EnqueueWorkWithExplicitPriority(FName WorkName, FRemoteWorkPriority WorkPriority, bool bIsTransactional, const TFunction< void(void)> &InWork)
Definition RemoteExecutor.cpp:971
TDelegate< TOptional< TTuple< FName, FRemoteWorkPriority, bool, TFunction< void(void)> > >(void)> FetchNextDeferredRPCDelegate
Definition RemoteExecutor.cpp:30
void EndRemoteMultiServerCommit(FRemoteServerId ServerId, FRemoteTransactionId RequestId)
Definition RemoteExecutor.cpp:840
void ReadyMultiServerCommitResponse(FRemoteServerId ServerId, FRemoteTransactionId RequestId)
Definition RemoteExecutor.cpp:898
void EnqueueRemoteMultiServerCommitAction(FRemoteServerId ServerId, FRemoteTransactionId RequestId, const TFunction< void()> &Action)
Definition RemoteExecutor.cpp:878
COREUOBJECT_API void GlobalServerSyncAndReturnBorrowedObjects(FName SyncName)
TDelegate< void(FRemoteTransactionId, const TArray< FRemoteServerId > &)> AbandonMultiServerCommitDelegate
Definition RemoteExecutor.cpp:26
TDelegate< void()> TickNetworkDelegate
Definition RemoteExecutor.cpp:23
TDelegate< void(const FString &)> OnRegionEndDelegate
Definition RemoteExecutor.cpp:39
TDelegate< void(FName)> OnRegionBeginDelegate
Definition RemoteExecutor.cpp:38
void AbortTransactionAndAbandonWork(FStringView Description)
Definition RemoteExecutor.cpp:704
TDelegate< void(FRemoteTransactionId, const TArray< FRemoteServerId > &)> EndMultiServerCommitDelegate
Definition RemoteExecutor.cpp:27
void RegisterRemoteSubsystem(FRemoteSubsystemBase *Subsystem)
Definition RemoteExecutor.cpp:674
TMulticastDelegate< void(FRemoteTransactionId, uint32)> OnTransactionCompletedDelegate
Definition RemoteExecutor.cpp:34
void BeginRemoteMultiServerCommit(FRemoteServerId ServerId, FRemoteTransactionId RequestId, FRemoteWorkPriority RequestPriority)
Definition RemoteExecutor.cpp:728
void ReadyRemoteMultiServerCommit(FRemoteServerId ServerId, FRemoteTransactionId RequestId)
Definition RemoteExecutor.cpp:925
void RollbackTransactionRequiresDependencies(FStringView Description)
Definition RemoteExecutor.cpp:692
void TransactionRequiresMultiServerCommit(FStringView Description)
Definition RemoteExecutor.cpp:717
void ExecuteTransactional(FName WorkName, const TFunctionRef< void(void)> &Work)
Definition RemoteExecutor.cpp:965
TDelegate< void(FRemoteTransactionId, FRemoteServerId)> ReadyRemoteMultiServerCommitDelegate
Definition RemoteExecutor.cpp:28
TDelegate< void(FRemoteTransactionId, const TArray< FRemoteServerId > &)> ReadyMultiServerCommitDelegate
Definition RemoteExecutor.cpp:25
void ExecutePendingWork()
Definition RemoteExecutor.cpp:948
void AbortTransactionRequiresDependencies(FStringView Description)
Definition RemoteExecutor.cpp:679
TMulticastDelegate< void(FRemoteTransactionId, FName)> OnTransactionStartingDelegate
Definition RemoteExecutor.cpp:33
void AbortMultiServerCommit(FRemoteServerId ServerId, FRemoteTransactionId RequestId)
Definition RemoteExecutor.cpp:911
FRemoteWorkPriority CreateRootWorkPriority()
Definition RemoteExecutor.cpp:942
Definition RemoteObjectTypes.h:49
static COREUOBJECT_API FRemoteServerId FromIdNumber(uint32 InNumber)
Definition RemoteObject.cpp:1116
bool IsValid() const
Definition RemoteObjectTypes.h:83
Definition RemoteExecutor.h:14
FRemoteTransactionId()=default
void operator=(FRemoteTransactionId Other)
Definition RemoteExecutor.h:41
static FRemoteTransactionId Invalid()
Definition RemoteExecutor.h:21
uint32 GetIdNumber() const
Definition RemoteExecutor.h:29
bool operator==(const FRemoteTransactionId &Rhs) const
Definition RemoteExecutor.h:26
bool IsValid() const
Definition RemoteExecutor.h:33
constexpr FRemoteTransactionId(uint32 InId)
Definition RemoteExecutor.h:16
bool operator!=(const FRemoteTransactionId &Rhs) const
Definition RemoteExecutor.h:27
FString ToString() const
Definition RemoteExecutor.h:37
friend COREUOBJECT_API FArchive & operator<<(FArchive &Ar, FRemoteTransactionId &Id)
Definition RemoteExecutor.cpp:49
Definition RemoteExecutor.h:53
COREUOBJECT_API FString ToString() const
Definition RemoteExecutor.cpp:989
COREUOBJECT_API FRemoteWorkPriority CreateDependentWorkPriority() const
Definition RemoteExecutor.cpp:1012
uint64 PackedData
Definition RemoteExecutor.h:65
bool IsValid() const
Definition RemoteExecutor.h:73
static COREUOBJECT_API FRemoteWorkPriority CreateRootWorkPriority(FRemoteServerId ServerId, FRemoteTransactionId TransactionId)
Definition RemoteExecutor.cpp:997
uint32 GetWorkDepth() const
Definition RemoteExecutor.h:70
FRemoteServerId GetRootServerId() const
Definition RemoteExecutor.h:69
FRemoteTransactionId GetRootWorkTransactionId() const
Definition RemoteExecutor.h:71
Definition Optional.h:131
Definition Tuple.h:652