summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@oath.com>2018-04-19 13:11:26 +0000
committerTor Egge <Tor.Egge@oath.com>2018-04-20 08:48:47 +0000
commit444798eaa387e99142af9dd2cf8fee64dec8d2cd (patch)
treec13323d6fdd3a1ba5caea39abb9bd7e68054f07c /searchlib
parent96e3c8474e8904591547f6c255764d92d748c5a0 (diff)
Implement AttributeVector::makeReadGuard().
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.cpp18
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attributevector.h4
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;