UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IoDispatcherFileBackend.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6
8#include "IO/IoDispatcher.h"
9#include "IO/IoStore.h"
10#include "Containers/Array.h"
11#include "Containers/Map.h"
13#include "Stats/Stats.h"
14#include "Tasks/Task.h"
15#include "HAL/Runnable.h"
16#include "Misc/AES.h"
18
20
27
29{
30public:
35 {
36 return ContainerFile.ContainerInstanceId;
37 }
39 bool DoesChunkExist(const FIoChunkId& ChunkId) const;
41 const FIoOffsetAndLength* Resolve(const FIoChunkId& ChunkId) const;
42 FFileIoStoreContainerFile* GetContainerFile() { return &ContainerFile; }
43 const FFileIoStoreContainerFile* GetContainerFile() const { return &ContainerFile; }
45 const FIoContainerId& GetContainerId() const { return ContainerId; }
46 int32 GetOrder() const { return Order; }
48 bool IsSigned() const { return EnumHasAnyFlags(ContainerFile.ContainerFlags, EIoContainerFlags::Signed); }
49 const FGuid& GetEncryptionKeyGuid() const { return ContainerFile.EncryptionKeyGuid; }
50 void SetEncryptionKey(const FAES::FAESKey& Key) { ContainerFile.EncryptionKey = Key; }
51 const FAES::FAESKey& GetEncryptionKey() const { return ContainerFile.EncryptionKey; }
54
55private:
56 const FIoOffsetAndLength* FindChunkInternal(const FIoChunkId& ChunkId) const;
57 uint64 GetTocAllocatedSize() const;
58
59 IPlatformFileIoStore& PlatformImpl;
60 FFileIoStoreStats& Stats;
61
62 struct FPerfectHashMap
63 {
64 TConstArrayView<int32> TocChunkHashSeeds;
66 TConstArrayView<FIoOffsetAndLength> TocOffsetAndLengths;
67 };
68 FPerfectHashMap PerfectHashMap;
69 TMap<FIoChunkId, FIoOffsetAndLength> TocImperfectHashMapFallback;
70 FFileIoStoreContainerFile ContainerFile;
71 FIoContainerId ContainerId;
72 // Owns the data for ArrayViews in ContainerFile and in PerfectHash map
73 FIoStoreTocResourceStorage DataContainer;
75 bool bClosed = false;
76 bool bHasPerfectHashMap = false;
77
78 static TAtomic<uint32> GlobalPartitionIndex;
79 static TAtomic<uint32> GlobalContainerInstanceId;
80};
81
105
106class FFileIoStore final
107 : public FRunnable
109{
110public:
114 void Shutdown() override;
116 const TCHAR* InTocPath,
117 int32 Order,
118 const FGuid& EncryptionKeyGuid,
119 const FAES::FAESKey& EncryptionKey,
120 UE::IoStore::ETocMountOptions Options) override;
121 virtual bool Unmount(const TCHAR* InTocPath) override;
123 void CancelIoRequest(FIoRequestImpl* Request) override;
124 void UpdatePriorityForIoRequest(FIoRequestImpl* Request) override;
125 bool DoesChunkExist(const FIoChunkId& ChunkId) const override;
126 TIoStatusOr<uint64> GetSizeForChunk(const FIoChunkId& ChunkId) const;
128 TIoStatusOr<FIoMappedRegion> OpenMapped(const FIoChunkId& ChunkId, const FIoReadOptions& Options) override;
129 const TCHAR* GetName() const override;
130 virtual void ReopenAllFileHandles() override;
131
132 virtual bool Init() override;
133 virtual uint32 Run() override;
134 virtual void Stop() override;
135
136 uint32 GetThreadId() const;
137
138private:
139
140 bool Resolve(FIoRequestImpl* Request);
141 void OnNewPendingRequestsAdded();
143 void FreeBuffer(FFileIoStoreBuffer& Buffer);
144 FFileIoStoreCompressionContext* AllocCompressionContext();
145 void FreeCompressionContext(FFileIoStoreCompressionContext* CompressionContext);
146 void ScatterBlock(FFileIoStoreCompressedBlock* CompressedBlock, bool bIsAsync);
147 void CompleteDispatcherRequest(FFileIoStoreResolvedRequest* ResolvedRequest);
148 void FinalizeCompressedBlock(FFileIoStoreCompressedBlock* CompressedBlock);
149 void StopThread();
150
151 uint64 ReadBufferSize = 0;
153 FFileIoStoreStats Stats;
154 FFileIoStoreBlockCache BlockCache;
155 FFileIoStoreBufferAllocator BufferAllocator;
156 FFileIoStoreRequestAllocator RequestAllocator;
157 FFileIoStoreRequestQueue RequestQueue;
158 FFileIoStoreRequestTracker RequestTracker;
160 FRunnableThread* Thread = nullptr;
161 bool bIsMultithreaded;
162 TAtomic<bool> bStopRequested{ false };
163 mutable FRWLock IoStoreReadersLock;
166 TSpscQueue<UE::Tasks::FTask> DecompressionTasks;
167 FFileIoStoreCompressionContext* FirstFreeCompressionContext = nullptr;
168 FFileIoStoreCompressedBlock* ReadyForDecompressionHead = nullptr;
169 FFileIoStoreCompressedBlock* ReadyForDecompressionTail = nullptr;
170 FCriticalSection DecompressedBlocksCritical;
171 FFileIoStoreCompressedBlock* FirstDecompressedBlock = nullptr;
172 FIoRequestImpl* CompletedRequestsHead = nullptr;
173 FIoRequestImpl* CompletedRequestsTail = nullptr;
174 FDelegateHandle OversubscriptionLimitReached;
175};
176
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::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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
TSharedRef< FFileIoStore > CreateIoDispatcherFileBackend()
Definition IoDispatcherFileBackend.cpp:2182
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IDelegateInstance.h:14
Definition IoDispatcherFileBackendTypes.h:563
Definition IoDispatcherFileBackendTypes.h:542
Definition IoDispatcherFileBackendTypes.h:318
Definition IoDispatcherFileBackend.h:29
TIoStatusOr< FIoContainerHeader > ReadContainerHeader(bool bReadSoftRefs) const
Definition IoDispatcherFileBackend.cpp:850
uint32 GetContainerInstanceId() const
Definition IoDispatcherFileBackend.h:34
TIoStatusOr< uint64 > GetSizeForChunk(const FIoChunkId &ChunkId) const
Definition IoDispatcherFileBackend.cpp:812
bool IsSigned() const
Definition IoDispatcherFileBackend.h:48
const FAES::FAESKey & GetEncryptionKey() const
Definition IoDispatcherFileBackend.h:51
void ReopenAllFileHandles()
Definition IoDispatcherFileBackend.cpp:962
bool DoesChunkExist(const FIoChunkId &ChunkId) const
Definition IoDispatcherFileBackend.cpp:806
void SetEncryptionKey(const FAES::FAESKey &Key)
Definition IoDispatcherFileBackend.h:50
~FFileIoStoreReader()
Definition IoDispatcherFileBackend.cpp:638
bool IsEncrypted() const
Definition IoDispatcherFileBackend.h:47
const FGuid & GetEncryptionKeyGuid() const
Definition IoDispatcherFileBackend.h:49
FIoStatus Close()
Definition IoDispatcherFileBackend.cpp:734
int32 GetOrder() const
Definition IoDispatcherFileBackend.h:46
IMappedFileHandle * GetMappedContainerFileHandle(uint64 TocOffset)
Definition IoDispatcherFileBackend.cpp:832
const FIoContainerId & GetContainerId() const
Definition IoDispatcherFileBackend.h:45
const FFileIoStoreContainerFile * GetContainerFile() const
Definition IoDispatcherFileBackend.h:43
FFileIoStoreContainerFile * GetContainerFile()
Definition IoDispatcherFileBackend.h:42
Definition IoDispatcherFileBackendTypes.h:698
Definition IoDispatcherFileBackendTypes.h:643
Definition IoDispatcherFileBackend.h:83
void RemoveRawBlock(const FFileIoStoreReadRequest *RawBlock, bool bRemoveFromCancel=false)
Definition IoDispatcherFileBackend.cpp:1038
FFileIoStoreReadRequest * FindOrAddRawBlock(FFileIoStoreBlockKey Key, bool &bOutWasAdded)
Definition IoDispatcherFileBackend.cpp:1025
FFileIoStoreCompressedBlock * FindOrAddCompressedBlock(FFileIoStoreBlockKey Key, bool &bOutWasAdded)
Definition IoDispatcherFileBackend.cpp:1012
void ReleaseIoRequestReferences(FFileIoStoreResolvedRequest &ResolvedRequest)
Definition IoDispatcherFileBackend.cpp:1192
void UpdatePriorityForIoRequest(FFileIoStoreResolvedRequest &ResolvedRequest)
Definition IoDispatcherFileBackend.cpp:1171
void RemoveCompressedBlock(const FFileIoStoreCompressedBlock *CompressedBlock, bool bRemoveFromCancel=false)
Definition IoDispatcherFileBackend.cpp:1086
void AddReadRequestsToResolvedRequest(FFileIoStoreCompressedBlock *CompressedBlock, FFileIoStoreResolvedRequest &ResolvedRequest)
Definition IoDispatcherFileBackend.cpp:1050
bool CancelIoRequest(FFileIoStoreResolvedRequest &ResolvedRequest)
Definition IoDispatcherFileBackend.cpp:1098
int64 GetLiveReadRequestsCount() const
Definition IoDispatcherFileBackend.cpp:1219
~FFileIoStoreRequestTracker()
Definition IoDispatcherFileBackend.cpp:1007
Definition IoDispatcherFileBackendTypes.h:893
Definition IoDispatcherFileBackend.h:109
uint32 GetThreadId() const
Definition IoDispatcherFileBackend.cpp:2223
bool DoesChunkExist(const FIoChunkId &ChunkId) const override
Definition IoDispatcherFileBackend.cpp:1507
TIoStatusOr< FIoMappedRegion > OpenMapped(const FIoChunkId &ChunkId, const FIoReadOptions &Options) override
Definition IoDispatcherFileBackend.cpp:1961
FIoRequestImpl * GetCompletedIoRequests() override
Definition IoDispatcherFileBackend.cpp:1735
~FFileIoStore()
Definition IoDispatcherFileBackend.cpp:1232
void UpdatePriorityForIoRequest(FIoRequestImpl *Request) override
Definition IoDispatcherFileBackend.cpp:1497
virtual uint32 Run() override
Definition IoDispatcherFileBackend.cpp:2170
void ResolveIoRequests(FIoRequestList Requests, FIoRequestList &OutUnresolved) override
Definition IoDispatcherFileBackend.cpp:1466
virtual bool Init() override
Definition IoDispatcherFileBackend.cpp:2159
virtual void Stop() override
Definition IoDispatcherFileBackend.cpp:2164
void CancelIoRequest(FIoRequestImpl *Request) override
Definition IoDispatcherFileBackend.cpp:1478
const TCHAR * GetName() const override
Definition IoDispatcherFileBackend.cpp:2010
TIoStatusOr< uint64 > GetSizeForChunk(const FIoChunkId &ChunkId) const
Definition IoDispatcherFileBackend.cpp:1520
virtual void ReopenAllFileHandles() override
Definition IoDispatcherFileBackend.cpp:2015
void Shutdown() override
Definition IoDispatcherFileBackend.cpp:1292
Definition IoChunkId.h:64
Definition IoContainerId.h:18
Definition IoDispatcher.h:165
Definition IoDispatcherBackend.h:23
Definition IoStatus.h:60
Definition RunnableThread.h:20
Definition Runnable.h:20
Definition MappedFileHandle.h:115
Definition IoDispatcherFileBackendTypes.h:931
Definition Array.h:670
Definition Atomic.h:538
Definition IoStatus.h:101
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition SpscQueue.h:18
Definition UniquePtr.h:107
Definition CriticalSection.h:14
Definition FileIoDispatcherBackend.h:25
ETocMountOptions
Definition FileIoDispatcherBackend.h:16
const int32 Order[8][8]
Definition VorbisAudioInfo.cpp:47
Definition AES.h:27
Definition IoDispatcherFileBackendTypes.h:77
Definition IoDispatcherFileBackendTypes.h:71
Definition IoDispatcherFileBackendTypes.h:109
Definition IoDispatcherFileBackend.h:22
FFileIoStoreCompressionContext * Next
Definition IoDispatcherFileBackend.h:23
uint64 UncompressedBufferSize
Definition IoDispatcherFileBackend.h:24
uint8 * UncompressedBuffer
Definition IoDispatcherFileBackend.h:25
Definition IoDispatcherFileBackendTypes.h:42
EIoContainerFlags ContainerFlags
Definition IoDispatcherFileBackendTypes.h:57
FAES::FAESKey EncryptionKey
Definition IoDispatcherFileBackendTypes.h:56
FGuid EncryptionKeyGuid
Definition IoDispatcherFileBackendTypes.h:55
uint32 ContainerInstanceId
Definition IoDispatcherFileBackendTypes.h:60
Definition IoDispatcherFileBackendTypes.h:131
Definition IoDispatcherFileBackendTypes.h:772
Definition Guid.h:109
Definition IoOffsetLength.h:12
Definition IoStore.h:180