UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MicrosoftAsyncIO.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5// HEADER_UNIT_SKIP - Not included directly
6
8
10
13
14#if !defined(USE_WINAPI_CREATEFILE2)
15 #define USE_WINAPI_CREATEFILE2 0
16#endif
17
32
34
36{
38 HANDLE Result = Popped ? (HANDLE)UPTRINT(Popped) : INVALID_HANDLE_VALUE;
39 if (Result == INVALID_HANDLE_VALUE)
40 {
41 Result = CreateEvent(nullptr, true, 0, nullptr);
42 check((void*)(UPTRINT)Result); //awkwardly using void* to store handles, hope we don't ever have a zero handle :)
43 }
44 return Result;
45}
46
48{
49 check(ToFree != INVALID_HANDLE_VALUE && (void*)(UPTRINT)ToFree); //awkwardly using void* to store handles, hope we don't ever have a zero handle :)
50 ResetEvent(ToFree);
52}
53
54
56{
59 int64 Offset;
60 int64 BytesToRead;
61 int64 FileSize;
62 HANDLE FileHandle;
63 EAsyncIOPriorityAndFlags PriorityAndFlags;
64 uint8* TempMemory;
65 int64 AlignedOffset;
66 int64 AlignedBytesToRead;
67 OVERLAPPED OverlappedIO;
68public:
70 : IAsyncReadRequest(CompleteCallback, false, InUserSuppliedMemory)
71 , Task(nullptr)
72 , Owner(InOwner)
73 , Offset(InOffset)
74 , BytesToRead(InBytesToRead)
75 , FileSize(InFileSize)
76 , FileHandle(InHandle)
77 , PriorityAndFlags(InPriorityAndFlags)
78 , TempMemory(nullptr)
79 {
80 FMemory::Memzero(OverlappedIO);
81 OverlappedIO.hEvent = INVALID_HANDLE_VALUE;
82 check(Offset >= 0 && BytesToRead > 0);
83 if (BytesToRead == MAX_int64)
84 {
85 BytesToRead = FileSize - Offset;
86 check(BytesToRead > 0);
87 }
88 AlignedOffset = Offset;
89 AlignedBytesToRead = BytesToRead;
90 if (CheckForPrecache())
91 {
93 }
94 else
95 {
96 AlignedOffset = AlignDown(Offset, 4096);
97 AlignedBytesToRead = Align(Offset + BytesToRead, 4096) - AlignedOffset;
98 check(AlignedOffset >= 0 && AlignedBytesToRead > 0);
99
101 if (bUserSuppliedMemory && (AlignedOffset != Offset || AlignedBytesToRead != BytesToRead))
102 {
103 static int32 NumMessages = 0;
104 if (NumMessages < 10)
105 {
106 NumMessages++;
107 UE_LOG(LogTemp, Log, TEXT("FMicrosoftReadRequest request was not aligned. This is expected with loose files, but not a pak file."));
108 }
109 else if (NumMessages == 10)
110 {
111 NumMessages++;
112 UE_LOG(LogTemp, Log, TEXT("LAST NOTIFICATION THIS RUN: FMicrosoftReadRequest request was not aligned."));
113 }
114 TempMemory = (uint8*)FMemory::Malloc(AlignedBytesToRead);
115 INC_MEMORY_STAT_BY(STAT_AsyncFileMemory, AlignedBytesToRead);
116 }
117 else if (!bMemoryHasBeenAcquired)
118 {
119 check(!Memory);
120 Memory = (uint8*)FMemory::Malloc(AlignedBytesToRead);
121 INC_MEMORY_STAT_BY(STAT_AsyncFileMemory, AlignedBytesToRead);
122 }
123 check(Memory);
124 uint32 NumRead = 0;
125
126 if (Offset + BytesToRead > FileSize || AlignedOffset < 0 || AlignedBytesToRead < 1)
127 {
128 UE_LOG(LogTemp, Fatal, TEXT("FMicrosoftReadRequest bogus request Offset = %lld BytesToRead = %lld AlignedOffset = %lld AlignedBytesToRead = %lld FileSize = %lld File = %s"), Offset, BytesToRead, AlignedOffset, AlignedBytesToRead, FileSize, GetFileNameForErrorMessagesAndPanicRetry());
129 }
130
131 {
133 LI.QuadPart = AlignedOffset;
134 OverlappedIO.Offset = LI.LowPart;
135 OverlappedIO.OffsetHigh = LI.HighPart;
136 }
137 OverlappedIO.hEvent = GetIOPooledEvent();
138 TRACE_PLATFORMFILE_BEGIN_READ(&OverlappedIO, FileHandle, AlignedOffset, AlignedBytesToRead);
139 if (!ReadFile(FileHandle, TempMemory ? TempMemory : Memory, AlignedBytesToRead, (LPDWORD)&NumRead, &OverlappedIO))
140 {
141 uint32 ErrorCode = GetLastError();
142 if (ErrorCode != ERROR_IO_PENDING)
143 {
144 UE_LOG(LogTemp, Fatal, TEXT("FMicrosoftReadRequest ReadFile Failed! Error code = %x"), ErrorCode);
145 }
146 }
147
149 Start();
150 }
151 }
152 virtual ~FMicrosoftReadRequest();
153
154 bool CheckForPrecache();
156
158 {
159
160#if 0
161 if (!HasOverlappedIoCompleted(&OverlappedIO))
162 {
163 WaitForSingleObject(OverlappedIO.hEvent, 0);
164 }
165#endif
166 check(AlignedOffset <= Offset);
167 uint32 BytesRead = 0;
168
169 bool bFailed = false;
170 FString FailedMessage;
171
172 extern bool GTriggerFailedMicrosoftRead;
173
174 if (GTriggerFailedMicrosoftRead || !GetOverlappedResult(FileHandle, &OverlappedIO, (LPDWORD)&BytesRead, TRUE))
175 {
176 TRACE_PLATFORMFILE_END_READ(&OverlappedIO, 0);
178 uint32 ErrorCode = GetLastError();
179 FailedMessage = FString::Printf(TEXT("FMicrosoftReadRequest GetOverlappedResult Code = %x Offset = %lld Size = %lld FileSize = %lld File = %s"), ErrorCode, AlignedOffset, AlignedBytesToRead, FileSize, GetFileNameForErrorMessagesAndPanicRetry());
180 bFailed = true;
181 }
182 else
183 {
185 }
186 if (!bFailed && int64(BytesRead) < BytesToRead + (Offset - AlignedOffset))
187 {
188 uint32 ErrorCode = GetLastError();
189 FailedMessage = FString::Printf(TEXT("FMicrosoftReadRequest Short Read Code = %x BytesRead = %lld Offset = %lld AlignedOffset = %lld BytesToRead = %lld Size = %lld File = %s"), ErrorCode, int64(BytesRead), Offset, AlignedOffset, BytesToRead, FileSize, GetFileNameForErrorMessagesAndPanicRetry());
190 bFailed = true;
191 }
192
193 if (bFailed)
194 {
195 UE_LOG(LogTemp, Error, TEXT("Bad read, retrying %s"), *FailedMessage);
196
197 for (int32 Try = 0; bFailed && Try < 10; Try++)
198 {
199#if USE_WINAPI_CREATEFILE2
200 DWORD Access = GENERIC_READ;
202 DWORD Create = OPEN_EXISTING;
203 CREATEFILE2_EXTENDED_PARAMETERS Params = { 0 };
204 Params.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
205 Params.dwFileAttributes = FILE_ATTRIBUTE_READONLY;
206 Params.dwFileFlags = FILE_FLAG_NO_BUFFERING;
207 Params.dwSecurityQosFlags = SECURITY_ANONYMOUS;
209#else
210 uint32 Access = GENERIC_READ;
214#endif
216 {
218 LI.QuadPart = AlignedOffset;
219 CA_SUPPRESS(6001); // warning C6001: Using uninitialized memory '*Handle'.
220 if (SetFilePointer(Handle, LI.LowPart, (PLONG)&LI.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
221 {
222 uint32 ErrorCode = GetLastError();
223 UE_LOG(LogTemp, Error, TEXT("Failed to seek for retry. %x"), ErrorCode );
224 }
225 else if (ReadFile(Handle, TempMemory ? TempMemory : Memory, AlignedBytesToRead, (LPDWORD)&BytesRead, nullptr) &&
226 !(int64(BytesRead) < BytesToRead + (Offset - AlignedOffset)))
227 {
228 bFailed = false;
229 }
230 else
231 {
232 uint32 ErrorCode = GetLastError();
233 UE_LOG(LogTemp, Error, TEXT("Failed to read for retry. %x"), ErrorCode );
234 }
236 }
237 else
238 {
239 uint32 ErrorCode = GetLastError();
240 UE_LOG(LogTemp, Error, TEXT("Failed to open handle for retry. %x"), ErrorCode );
241 }
242 if (bFailed && Try < 9)
243 {
244 FPlatformProcess::Sleep(.2f);
245 }
246 }
247 }
248 if (bFailed)
249 {
250 UE_LOG(LogTemp, Fatal, TEXT("Unable to recover from a bad read: %s"), *FailedMessage);
251 }
252
254 }
255
257 {
258 check(Memory);
259 if (TempMemory)
260 {
261 FMemory::Memcpy(Memory, TempMemory + (Offset - AlignedOffset), BytesToRead);
262 FMemory::Free(TempMemory);
263 TempMemory = nullptr;
264 DEC_MEMORY_STAT_BY(STAT_AsyncFileMemory, AlignedBytesToRead);
265 }
266 else if (AlignedOffset != Offset)
267 {
268 FMemory::Memmove(Memory, Memory + (Offset - AlignedOffset), BytesToRead);
269 }
270 SetComplete();
271 }
272
274 {
275 if (InOffset >= Offset && InOffset + InBytesToRead <= Offset + BytesToRead &&
276 this->PollCompletion() && Memory)
277 {
278 check(Memory);
279 if (!UserSuppliedMemory)
280 {
281 UserSuppliedMemory = (uint8*)FMemory::Malloc(InBytesToRead);
283 }
285 return UserSuppliedMemory;
286 }
287 return nullptr;
288 }
289
290 void Start()
291 {
293 {
294 Task->StartBackgroundTask(GIOThreadPool);
295 }
296 else
297 {
298 Task->StartSynchronousTask();
299 WaitCompletionImpl(0.0f); // might as well finish it now
300 }
301 }
302
303 virtual void WaitCompletionImpl(float TimeLimitSeconds) override
304 {
305 if (Task)
306 {
307 bool bResult;
308 if (TimeLimitSeconds <= 0.0f)
309 {
310 Task->EnsureCompletion();
311 bResult = true;
312 }
313 else
314 {
315 bResult = Task->WaitCompletionWithTimeout(TimeLimitSeconds);
316 }
317 if (bResult)
318 {
320 delete Task;
321 Task = nullptr;
322 }
323 }
324 }
325
326 virtual void CancelImpl() override
327 {
328 // no cancel support
329 }
330
331 virtual void ReleaseMemoryOwnershipImpl() override
332 {
334 }
335};
336
338{
339 ReadRequest.PerformRequest();
340}
341
343{
344public:
346 : IAsyncReadRequest(CompleteCallback, true, nullptr)
347 {
349 SetComplete();
350 }
351
352 virtual void WaitCompletionImpl(float TimeLimitSeconds) override
353 {
354 // Even though SetComplete called in the constructor and sets bCompleteAndCallbackCalled=true, we still need to implement WaitComplete as
355 // the CompleteCallback can end up starting async tasks that can overtake the constructor execution and need to wait for the constructor to finish.
356 while (!*(volatile bool*)&bCompleteAndCallbackCalled);
357 }
358
359 virtual void CancelImpl() override
360 {
361 }
362
363 virtual void ReleaseMemoryOwnershipImpl() override
364 {
365 }
366};
367
369{
370public:
372 : IAsyncReadRequest(CompleteCallback, false, nullptr)
373 {
374 SetComplete();
375 }
376
377 virtual void WaitCompletionImpl(float TimeLimitSeconds) override
378 {
379 // Even though SetComplete called in the constructor and sets bCompleteAndCallbackCalled=true, we still need to implement WaitComplete as
380 // the CompleteCallback can end up starting async tasks that can overtake the constructor execution and need to wait for the constructor to finish.
381 while (!*(volatile bool*)&bCompleteAndCallbackCalled);
382 }
383
384 virtual void CancelImpl() override
385 {
386 }
387
388 virtual void ReleaseMemoryOwnershipImpl() override
389 {
390 }
391};
392
393
395{
396public:
400private:
401 TArray<FMicrosoftReadRequest*> LiveRequests; // linear searches could be improved
402
403 FCriticalSection LiveRequestsCritical;
404 FCriticalSection HandleCacheCritical;
405public:
406
420 {
421#if DO_CHECK
422 FScopeLock Lock(&LiveRequestsCritical);
423 check(!LiveRequests.Num()); // must delete all requests before you delete the handle
424#endif
427#if PLATFORMFILETRACE_ENABLED
428 if (CloseResult)
429 {
431 }
432 else
433 {
435 }
436#else
438#endif
439 }
441 {
442 FScopeLock Lock(&LiveRequestsCritical);
443 verify(LiveRequests.Remove(Req) == 1);
444 }
446 {
447 FScopeLock Lock(&LiveRequestsCritical);
448 uint8* Result = nullptr;
449 for (FMicrosoftReadRequest* Req : LiveRequests)
450 {
451 Result = Req->GetContainedSubblock(UserSuppliedMemory, InOffset, InBytesToRead);
452 if (Result)
453 {
454 break;
455 }
456 }
457 return Result;
458 }
459 virtual IAsyncReadRequest* SizeRequest(FAsyncFileCallBack* CompleteCallback = nullptr) override
460 {
461 return new FMicrosoftSizeRequest(CompleteCallback, FileSize);
462 }
463 virtual IAsyncReadRequest* ReadRequest(int64 Offset, int64 BytesToRead, EAsyncIOPriorityAndFlags PriorityAndFlags = AIOP_Normal, FAsyncFileCallBack* CompleteCallback = nullptr, uint8* UserSuppliedMemory = nullptr) override
464 {
466 {
467 FMicrosoftReadRequest* Result = new FMicrosoftReadRequest(this, CompleteCallback, UserSuppliedMemory, Offset, BytesToRead, FileSize, FileHandle, PriorityAndFlags);
468 if (PriorityAndFlags & AIOP_FLAG_PRECACHE) // only precache requests are tracked for possible reuse
469 {
470 FScopeLock Lock(&LiveRequestsCritical);
471 LiveRequests.Add(Result);
472 }
473 return Result;
474 }
475 return new FMicrosoftFailedRequest(CompleteCallback);
476 }
477};
478
480{
481 if (Task)
482 {
483 Task->EnsureCompletion(); // if the user polls, then we might never actual sync completion of the task until now, this will almost always be done, however we need to be sure the task is clear
484 delete Task;
485 }
486 if (OverlappedIO.hEvent != INVALID_HANDLE_VALUE)
487 {
488 FreeIOPooledEvent(OverlappedIO.hEvent);
489 OverlappedIO.hEvent = INVALID_HANDLE_VALUE;
490 }
491 if (Memory)
492 {
493 // this can happen with a race on cancel, it is ok, they didn't take the memory, free it now
495 {
498 }
499 Memory = nullptr;
500 }
501 if (TempMemory)
502 {
503 DEC_MEMORY_STAT_BY(STAT_AsyncFileMemory, AlignedBytesToRead);
504 FMemory::Free(TempMemory);
505 TempMemory = nullptr;
506 }
507 if (PriorityAndFlags & AIOP_FLAG_PRECACHE) // only precache requests are tracked for possible reuse
508 {
509 Owner->RemoveRequest(this);
510 }
511 Owner = nullptr;
512}
513
515{
516 if ((PriorityAndFlags & AIOP_FLAG_PRECACHE) == 0) // only non-precache requests check for existing blocks to copy from
517 {
519 uint8* Result = Owner->GetPrecachedBlock(Memory, Offset, BytesToRead);
520 if (Result)
521 {
522 check(!bUserSuppliedMemory || Memory == Result);
523 Memory = Result;
524 return true;
525 }
526 }
527 return false;
528}
529
534
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define NULL
Definition oodle2base.h:134
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
constexpr T AlignDown(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:34
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
#define verify(expr)
Definition AssertionMacros.h:319
#define CA_SUPPRESS(WarningNumber)
Definition CoreMiscDefines.h:125
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::UPTRINT UPTRINT
An unsigned integer the same size as a pointer.
Definition Platform.h:1146
#define INC_MEMORY_STAT_BY(StatId, Amount)
Definition Stats.h:700
#define RETURN_QUICK_DECLARE_CYCLE_STAT(StatId, GroupId)
Definition Stats.h:655
#define DEC_MEMORY_STAT_BY(StatId, Amount)
Definition Stats.h:705
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
EAsyncIOPriorityAndFlags
Definition GenericPlatformFile.h:31
@ AIOP_Normal
Definition GenericPlatformFile.h:44
@ AIOP_FLAG_PRECACHE
Definition GenericPlatformFile.h:35
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
CORE_API TLockFreePointerListUnordered< void, PLATFORM_CACHE_LINE_SIZE > MicrosoftAsyncIOEventPool
Definition WindowsPlatformFile.cpp:58
HANDLE GetIOPooledEvent()
Definition MicrosoftAsyncIO.h:35
void FreeIOPooledEvent(HANDLE ToFree)
Definition MicrosoftAsyncIO.h:47
#define PRAGMA_DISABLE_UNSAFE_TYPECAST_WARNINGS
Definition MSVCPlatformCompilerPreSetup.h:81
#define PRAGMA_RESTORE_UNSAFE_TYPECAST_WARNINGS
Definition MSVCPlatformCompilerPreSetup.h:100
#define MAX_int64
Definition NumericLimits.h:26
#define TRACE_PLATFORMFILE_END_CLOSE(FileHandle)
Definition PlatformFileTrace.h:53
#define TRACE_PLATFORMFILE_END_READ(ReadHandle, SizeRead)
Definition PlatformFileTrace.h:62
#define TRACE_PLATFORMFILE_BEGIN_CLOSE(FileHandle)
Definition PlatformFileTrace.h:50
#define TRACE_PLATFORMFILE_FAIL_CLOSE(FileHandle)
Definition PlatformFileTrace.h:56
#define TRACE_PLATFORMFILE_BEGIN_READ(ReadHandle, FileHandle, Offset, Size)
Definition PlatformFileTrace.h:59
FQueuedThreadPool * GIOThreadPool
Definition ThreadingBase.cpp:50
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32 Offset
Definition VulkanMemory.cpp:4033
bool GTriggerFailedMicrosoftRead
Definition WindowsPlatformFile.cpp:59
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
void EnsureCompletion(bool bDoWorkOnThisThreadIfNotStarted=true, bool bIsLatencySensitive=false)
Definition AsyncWork.h:429
Definition AsyncWork.h:585
Definition MicrosoftAsyncIO.h:395
void RemoveRequest(FMicrosoftReadRequest *Req)
Definition MicrosoftAsyncIO.h:440
virtual IAsyncReadRequest * SizeRequest(FAsyncFileCallBack *CompleteCallback=nullptr) override
Definition MicrosoftAsyncIO.h:459
FMicrosoftAsyncReadFileHandle(HANDLE InFileHandle, const TCHAR *InFileNameForErrorMessagesAndPanicRetry)
Definition MicrosoftAsyncIO.h:407
FString FileNameForErrorMessagesAndPanicRetry
Definition MicrosoftAsyncIO.h:399
virtual IAsyncReadRequest * ReadRequest(int64 Offset, int64 BytesToRead, EAsyncIOPriorityAndFlags PriorityAndFlags=AIOP_Normal, FAsyncFileCallBack *CompleteCallback=nullptr, uint8 *UserSuppliedMemory=nullptr) override
Definition MicrosoftAsyncIO.h:463
uint8 * GetPrecachedBlock(uint8 *UserSuppliedMemory, int64 InOffset, int64 InBytesToRead)
Definition MicrosoftAsyncIO.h:445
int64 FileSize
Definition MicrosoftAsyncIO.h:398
~FMicrosoftAsyncReadFileHandle()
Definition MicrosoftAsyncIO.h:419
HANDLE FileHandle
Definition MicrosoftAsyncIO.h:397
Definition MicrosoftAsyncIO.h:369
virtual void ReleaseMemoryOwnershipImpl() override
Definition MicrosoftAsyncIO.h:388
FMicrosoftFailedRequest(FAsyncFileCallBack *CompleteCallback)
Definition MicrosoftAsyncIO.h:371
virtual void WaitCompletionImpl(float TimeLimitSeconds) override
Definition MicrosoftAsyncIO.h:377
virtual void CancelImpl() override
Definition MicrosoftAsyncIO.h:384
Definition MicrosoftAsyncIO.h:19
FMicrosoftReadRequestWorker(FMicrosoftReadRequest *InReadRequest)
Definition MicrosoftAsyncIO.h:22
void DoWork()
Definition MicrosoftAsyncIO.h:337
FORCEINLINE TStatId GetStatId() const
Definition MicrosoftAsyncIO.h:27
Definition MicrosoftAsyncIO.h:56
FMicrosoftReadRequest(FMicrosoftAsyncReadFileHandle *InOwner, FAsyncFileCallBack *CompleteCallback, uint8 *InUserSuppliedMemory, int64 InOffset, int64 InBytesToRead, int64 InFileSize, HANDLE InHandle, EAsyncIOPriorityAndFlags InPriorityAndFlags)
Definition MicrosoftAsyncIO.h:69
virtual void CancelImpl() override
Definition MicrosoftAsyncIO.h:326
virtual void ReleaseMemoryOwnershipImpl() override
Definition MicrosoftAsyncIO.h:331
virtual ~FMicrosoftReadRequest()
Definition MicrosoftAsyncIO.h:479
void Start()
Definition MicrosoftAsyncIO.h:290
void FinalizeReadAndSetComplete()
Definition MicrosoftAsyncIO.h:256
void PerformRequest()
Definition MicrosoftAsyncIO.h:157
const TCHAR * GetFileNameForErrorMessagesAndPanicRetry()
Definition MicrosoftAsyncIO.h:530
uint8 * GetContainedSubblock(uint8 *UserSuppliedMemory, int64 InOffset, int64 InBytesToRead)
Definition MicrosoftAsyncIO.h:273
virtual void WaitCompletionImpl(float TimeLimitSeconds) override
Definition MicrosoftAsyncIO.h:303
bool CheckForPrecache()
Definition MicrosoftAsyncIO.h:514
Definition MicrosoftAsyncIO.h:343
virtual void ReleaseMemoryOwnershipImpl() override
Definition MicrosoftAsyncIO.h:363
virtual void WaitCompletionImpl(float TimeLimitSeconds) override
Definition MicrosoftAsyncIO.h:352
virtual void CancelImpl() override
Definition MicrosoftAsyncIO.h:359
FMicrosoftSizeRequest(FAsyncFileCallBack *CompleteCallback, int64 InFileSize)
Definition MicrosoftAsyncIO.h:345
Definition AsyncWork.h:663
Definition ScopeLock.h:141
Definition AsyncFileHandle.h:211
Definition AsyncFileHandle.h:31
UE_FORCEINLINE_HINT bool PollCompletion()
Definition AsyncFileHandle.h:86
const bool bUserSuppliedMemory
Definition AsyncFileHandle.h:44
PTRINT Size
Definition AsyncFileHandle.h:35
uint8 * Memory
Definition AsyncFileHandle.h:36
void SetComplete()
Definition AsyncFileHandle.h:203
Definition Array.h:670
SizeType Remove(const ElementType &Item)
Definition Array.h:3091
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
void Push(T *NewItem)
Definition LockFreeList.h:849
T * Pop()
Definition LockFreeList.h:858
Definition LockFreeList.h:904
@ false
Definition radaudio_common.h:23
static CORE_API bool SupportsMultithreading()
Definition GenericPlatformProcess.cpp:656
static UE_FORCEINLINE_HINT void * Memmove(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:109
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition LightweightStats.h:416