diff --git a/Source/Core/DiscIO/Blob.h b/Source/Core/DiscIO/Blob.h index 841a827b97..3551c31d44 100644 --- a/Source/Core/DiscIO/Blob.h +++ b/Source/Core/DiscIO/Blob.h @@ -97,6 +97,9 @@ public: return false; } + // Returns true only for CachedBlobReader. + virtual bool IsCached() const { return false; } + protected: BlobReader() {} }; diff --git a/Source/Core/DiscIO/CachedBlob.cpp b/Source/Core/DiscIO/CachedBlob.cpp index 98ed8ba31f..f1bbf055ee 100644 --- a/Source/Core/DiscIO/CachedBlob.cpp +++ b/Source/Core/DiscIO/CachedBlob.cpp @@ -219,6 +219,8 @@ public: return m_cache_filler->Read(offset, size, out_ptr) || m_reader->Read(offset, size, out_ptr); } + bool IsCached() const override { return true; } + private: // A shared object does the cache filling for sensible CopyReader behavior. const std::shared_ptr m_cache_filler; @@ -228,11 +230,17 @@ private: std::unique_ptr CreateCachedBlobReader(std::unique_ptr reader) { + if (reader->IsCached()) // This is already CachedBlobReader. + return reader; + return std::make_unique(std::move(reader), false); } std::unique_ptr CreateScrubbingCachedBlobReader(std::unique_ptr reader) { + if (reader->IsCached()) // This reader is already a CachedBlobReader. + return reader; + return std::make_unique(std::move(reader), true); }