// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CacheJournal.h" #include "Containers/Map.h" #include "HAL/CriticalSection.h" #include "Tasks/Task.h" #include #if !UE_BUILD_SHIPPING namespace StorageServer { // Cross-platform cache journal implementation, baseline for platforms where platform specific implementation is not available. class FCacheJournalSimple : public ICacheJournal { public: FCacheJournalSimple(const TCHAR* FileName, const uint64 FlushAtWriteCount); virtual ~FCacheJournalSimple() override; virtual void Flush(bool bImmediate) override; virtual void InvalidateAll() override; virtual void Invalidate(const FIoChunkId& ChunkId) override; virtual bool SetChunkInfo( const FIoChunkId& ChunkId, const TOptional& OptModTag, const TOptional& OptRawSize, const TOptional& OptRawBlockSize ) override; virtual bool TryGetChunkInfo( const FIoChunkId& ChunkId, FCacheChunkInfo& OutChunkInfo ) override; virtual bool AddEntry( const FIoChunkId& ChunkId, const FCacheEntry& Entry ) override; virtual bool TryGetEntry( const FIoChunkId& ChunkId, const uint64 ChunkOffset, const uint64 ChunkSize, FCacheEntry& OutEntry ) override; virtual void IterateChunkIds( TFunctionRef Callback ) override; virtual void IterateCacheEntriesForChunkId( const FIoChunkId& ChunkId, TFunctionRef Callback ) override; virtual void IterateCacheEntries( TFunctionRef Callback ) override; private: FCriticalSection DataLock, FlushTaskLock; FString FileName; UE::Tasks::TTask FlushTask; uint64 FlushAtWriteCount; uint64 CurrentWriteCount; std::atomic bDirty; typedef TMap, FCacheEntry> FPerChunkCacheEntries; TMap ChunkInfos; TMap ChunkCacheEntries; void FlushImmediate(); }; } #endif