aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@yahooinc.com>2022-03-25 12:39:39 +0100
committerTor Egge <Tor.Egge@yahooinc.com>2022-03-25 12:39:39 +0100
commitbb17123aeed8aac6186ba4a2b899a1e03e365bdf (patch)
tree606f34f13953d05a53c1733299d22ed33575d7b0 /searchlib
parent17039bf9182cafc15623edea68594c548cc887dd (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.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.h13
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;
}
//-------------------------------------------------------------------------