diff options
author | Tor Egge <Tor.Egge@oath.com> | 2018-04-19 13:11:26 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@oath.com> | 2018-04-20 08:48:47 +0000 |
commit | 444798eaa387e99142af9dd2cf8fee64dec8d2cd (patch) | |
tree | c13323d6fdd3a1ba5caea39abb9bd7e68054f07c /searchlib | |
parent | 96e3c8474e8904591547f6c255764d92d748c5a0 (diff) |
Implement AttributeVector::makeReadGuard().
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributevector.cpp | 18 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/attributevector.h | 4 |
2 files changed, 18 insertions, 4 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp index e94eaa3f542..2e88587337c 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.cpp @@ -886,12 +886,24 @@ AttributeVector::getEstimatedShrinkLidSpaceGain() const return canFree; } +class AttributeVector::ReadGuard : public attribute::AttributeReadGuard +{ + GenerationHandler::Guard _generationGuard; + using EnumGuard = std::shared_lock<std::shared_timed_mutex>; + EnumGuard _enumGuard; +public: + ReadGuard(const IAttributeVector *attr, GenerationHandler::Guard &&generationGuard, std::shared_timed_mutex *enumLock) + : attribute::AttributeReadGuard(attr), + _generationGuard(std::move(generationGuard)), + _enumGuard(enumLock != nullptr ? EnumGuard(*enumLock) : EnumGuard()) + { + } +}; + std::unique_ptr<attribute::AttributeReadGuard> AttributeVector::makeReadGuard(bool stableEnumGuard) const { - (void) stableEnumGuard; - // TODO: implement - return std::unique_ptr<attribute::AttributeReadGuard>(); + return std::make_unique<ReadGuard>(this, _genHandler.takeGuard(), stableEnumGuard ? &_enumLock : nullptr); } MemoryUsage diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h index 5917972b4fe..33b499b7400 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.h +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h @@ -590,7 +590,7 @@ private: BaseName _baseFileName; Config _config; std::shared_ptr<attribute::Interlock> _interlock; - std::shared_timed_mutex _enumLock; + mutable std::shared_timed_mutex _enumLock; GenerationHandler _genHandler; GenerationHolder _genHolder; Status _status; @@ -625,6 +625,8 @@ private: */ std::shared_timed_mutex & getEnumLock() { return _enumLock; } + class ReadGuard; + friend class ComponentGuard<AttributeVector>; friend class AttributeEnumGuard; friend class AttributeValueGuard; |