diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2022-03-25 12:39:39 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahooinc.com> | 2022-03-25 12:39:39 +0100 |
commit | bb17123aeed8aac6186ba4a2b899a1e03e365bdf (patch) | |
tree | 606f34f13953d05a53c1733299d22ed33575d7b0 /searchlib | |
parent | 17039bf9182cafc15623edea68594c548cc887dd (diff) |
Use std::atomic_ref for updating and reading single value non-enumerated
attribute vectors with small numeric types.
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp | 2 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h | 13 |
2 files changed, 9 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp index ce232749514..368a081e020 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp @@ -214,7 +214,7 @@ bool SingleValueSmallNumericAttribute::SingleSearchContext::valid() const { retu SingleValueSmallNumericAttribute::SingleSearchContext::SingleSearchContext(std::unique_ptr<QueryTermSimple> qTerm, const SingleValueSmallNumericAttribute & toBeSearched) : NumericAttribute::Range<T>(*qTerm), - SearchContext(toBeSearched), _wordData(&toBeSearched._wordData[0]), + SearchContext(toBeSearched), _wordData(&toBeSearched._wordData.acquire_elem_ref(0)), _valueMask(toBeSearched._valueMask), _valueShiftShift(toBeSearched._valueShiftShift), _valueShiftMask(toBeSearched._valueShiftMask), diff --git a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h index 42d51b2a2c7..6c78708593a 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h +++ b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h @@ -4,6 +4,7 @@ #include "integerbase.h" #include "floatbase.h" +#include <vespa/vespalib/util/atomic.h> #include <vespa/vespalib/util/rcuvector.h> #include <limits> @@ -45,10 +46,12 @@ protected: } void set(DocId doc, T v) { - Word &word = _wordData[doc >> _wordShift]; + Word &word_ref = _wordData[doc >> _wordShift]; uint32_t valueShift = (doc & _valueShiftMask) << _valueShiftShift; + Word word = vespalib::atomic::load_ref_relaxed(word_ref); word = (word & ~(_valueMask << valueShift)) | ((v & _valueMask) << valueShift); + vespalib::atomic::store_ref_relaxed(word_ref, word); } @@ -82,7 +85,7 @@ public: if ( elemId != 0) return -1; const Word &word = _wordData[docId >> _wordShift]; uint32_t valueShift = (docId & _valueShiftMask) << _valueShiftShift; - T v = (word >> valueShift) & _valueMask; + T v = (vespalib::atomic::load_ref_relaxed(word) >> valueShift) & _valueMask; weight = 1; return match(v) ? 0 : -1; } @@ -91,7 +94,7 @@ public: if ( elemId != 0) return -1; const Word &word = _wordData[docId >> _wordShift]; uint32_t valueShift = (docId & _valueShiftMask) << _valueShiftShift; - T v = (word >> valueShift) & _valueMask; + T v = (vespalib::atomic::load_ref_relaxed(word) >> valueShift) & _valueMask; return match(v) ? 0 : -1; } @@ -125,9 +128,9 @@ public: getSearch(std::unique_ptr<QueryTermSimple> term, const attribute::SearchContextParams & params) const override; T getFast(DocId doc) const { - const Word &word = _wordData[doc >> _wordShift]; + const Word &word = _wordData.acquire_elem_ref(doc >> _wordShift); uint32_t valueShift = (doc & _valueShiftMask) << _valueShiftShift; - return (word >> valueShift) & _valueMask; + return (vespalib::atomic::load_ref_relaxed(word) >> valueShift) & _valueMask; } //------------------------------------------------------------------------- |