diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2022-03-16 11:26:21 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahooinc.com> | 2022-03-16 11:26:21 +0100 |
commit | 49c6d07805bece75546026dc85bb192f29de4036 (patch) | |
tree | 66a24a351c99ea338cee462c9aaf3e26b6fb04eb /searchlib | |
parent | 7ecbb650f2754adadd5f9b71ea7f43aa8df0425a (diff) |
Add acquire_enum_entry_ref() member function to single enum attribute.
Diffstat (limited to 'searchlib')
3 files changed, 10 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.h b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.h index 4ce55902d7f..1edcec4b9dd 100644 --- a/searchlib/src/vespa/searchlib/attribute/singleenumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/singleenumattribute.h @@ -20,6 +20,7 @@ protected: using AtomicEntryRef = vespalib::datastore::AtomicEntryRef; using AtomicEntryRefVector = vespalib::RcuVectorBase<AtomicEntryRef>; using DocId = AttributeVector::DocId; + using EntryRef = vespalib::datastore::EntryRef; using EnumHandle = AttributeVector::EnumHandle; using EnumIndex = IEnumStore::Index; using EnumIndexRemapper = IEnumStore::EnumIndexRemapper; @@ -28,8 +29,12 @@ protected: public: using EnumIndexCopyVector = vespalib::Array<EnumIndex>; - IEnumStore::Index getEnumIndex(DocId docId) const { return _enumIndices[docId].load_acquire(); } - EnumHandle getE(DocId doc) const { return _enumIndices[doc].load_acquire().ref(); } +protected: + EntryRef acquire_enum_entry_ref(DocId docId) const noexcept { return _enumIndices.acquire_elem_ref(docId).load_acquire(); } + +public: + IEnumStore::Index getEnumIndex(DocId docId) const noexcept { return acquire_enum_entry_ref(docId); } + EnumHandle getE(DocId doc) const noexcept { return acquire_enum_entry_ref(doc).ref(); } protected: SingleValueEnumAttributeBase(const attribute::Config & c, GenerationHolder &genHolder, const vespalib::alloc::Alloc& initial_alloc); ~SingleValueEnumAttributeBase(); diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.h b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.h index 9ef2d680f05..0198668f4f2 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.h @@ -103,7 +103,7 @@ public: // Attribute read API //------------------------------------------------------------------------- T get(DocId doc) const override { - return this->_enumStore.get_value(this->_enumIndices[doc].load_acquire()); + return this->_enumStore.get_value(this->acquire_enum_entry_ref(doc)); } largeint_t getInt(DocId doc) const override { return static_cast<largeint_t>(get(doc)); diff --git a/searchlib/src/vespa/searchlib/attribute/singlestringattribute.h b/searchlib/src/vespa/searchlib/attribute/singlestringattribute.h index 45bb007e737..8c4bffe237e 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlestringattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/singlestringattribute.h @@ -45,7 +45,7 @@ public: //------------------------------------------------------------------------- bool isUndefined(DocId doc) const override { return get(doc)[0] == '\0'; } const char * get(DocId doc) const override { - return this->_enumStore.get_value(this->_enumIndices[doc].load_acquire()); + return this->_enumStore.get_value(this->acquire_enum_entry_ref(doc)); } std::vector<EnumHandle> findFoldedEnums(const char *value) const override { return this->_enumStore.find_folded_enums(value); @@ -95,7 +95,7 @@ public: int32_t onFind(DocId doc, int32_t elemId) const override { if ( elemId != 0) return -1; const SingleValueStringAttributeT<B> & attr(static_cast<const SingleValueStringAttributeT<B> &>(attribute())); - return isMatch(attr._enumStore.get_value(attr._enumIndices[doc].load_acquire())) ? 0 : -1; + return isMatch(attr._enumStore.get_value(attr.acquire_enum_entry_ref(doc))) ? 0 : -1; } }; |