From 6476e55aab6be73bdacb34eef4c80a5195b2d02c Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Sat, 11 Mar 2023 23:44:48 +0100 Subject: [PATCH] COMMON: Allow memcaching archive to bypass caching part and return a stream It's useful for patchers if they can easily create a stream in some cases but not others. --- common/archive.cpp | 10 ++++++++-- common/archive.h | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/common/archive.cpp b/common/archive.cpp index 48f754d7337..62b7e277b9e 100644 --- a/common/archive.cpp +++ b/common/archive.cpp @@ -107,7 +107,10 @@ SeekableReadStream *MemcachingCaseInsensitiveArchive::createReadStreamForMember( String translated = translatePath(path); bool isNew = false; if (!_cache.contains(translated)) { - _cache[translated] = readContentsForPath(translated); + SharedArchiveContents readResult = readContentsForPath(translated); + if (readResult._bypass) + return readResult._bypass; + _cache[translated] = readResult; isNew = true; } @@ -121,7 +124,10 @@ SeekableReadStream *MemcachingCaseInsensitiveArchive::createReadStreamForMember( // Check whether the entry is still valid as WeakPtr might have expired. if (!entry->makeStrong()) { // If it's expired, recreate the entry. - _cache[translated] = readContentsForPath(translated); + SharedArchiveContents readResult = readContentsForPath(translated); + if (readResult._bypass) + return readResult._bypass; + _cache[translated] = readResult; entry = &_cache[translated]; isNew = true; } diff --git a/common/archive.h b/common/archive.h index 089d0b7a218..462ac4ec279 100644 --- a/common/archive.h +++ b/common/archive.h @@ -169,10 +169,15 @@ class SharedArchiveContents { public: SharedArchiveContents(byte *contents, uint32 contentSize) : _strongRef(contents, ArrayDeleter()), _weakRef(_strongRef), - _contentSize(contentSize), _missingFile(false) {} - SharedArchiveContents() : _strongRef(nullptr), _weakRef(nullptr), _contentSize(0), _missingFile(true) {} + _contentSize(contentSize), _missingFile(false), _bypass(nullptr) {} + SharedArchiveContents() : _strongRef(nullptr), _weakRef(nullptr), _contentSize(0), _missingFile(true), _bypass(nullptr) {} + static SharedArchiveContents bypass(SeekableReadStream *stream) { + return SharedArchiveContents(stream); + } private: + SharedArchiveContents(SeekableReadStream *stream) : _strongRef(nullptr), _weakRef(nullptr), _contentSize(0), _missingFile(false), _bypass(stream) {} + bool isFileMissing() const { return _missingFile; } SharedPtr getContents() const { return _strongRef; } uint32 getSize() const { return _contentSize; } @@ -197,6 +202,7 @@ private: WeakPtr _weakRef; uint32 _contentSize; bool _missingFile; + SeekableReadStream *_bypass; friend class MemcachingCaseInsensitiveArchive; };