aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2022-03-25 14:57:27 +0000
committerHåvard Pettersen <havardpe@oath.com>2022-03-30 13:42:20 +0000
commite92b25e98b41bb9be33bdea1c8ed4bc1c89aec8b (patch)
tree50594a70b4051df9efea3bf17a322ac2f9d53954 /searchlib
parent58200e0e03baf5fc712fd28313622bc8b4515dca (diff)
make tsan happy by using atomic operations on bits
... related to document existence
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.cpp10
-rw-r--r--searchlib/src/vespa/searchlib/common/bitvector.h14
2 files changed, 17 insertions, 7 deletions
diff --git a/searchlib/src/vespa/searchlib/common/bitvector.cpp b/searchlib/src/vespa/searchlib/common/bitvector.cpp
index d2e6d9027ea..7eef1e7f8f2 100644
--- a/searchlib/src/vespa/searchlib/common/bitvector.cpp
+++ b/searchlib/src/vespa/searchlib/common/bitvector.cpp
@@ -106,11 +106,13 @@ BitVector::clearIntervalNoInvalidation(Range range_in)
Index endw = wordNum(last);
if (endw > startw) {
- _words[startw++] &= startBits(range.start());
- memset(_words+startw, 0, sizeof(*_words)*(endw-startw));
- _words[endw] &= endBits(last);
+ vespalib::atomic::store_ref_relaxed(_words[startw], _words[startw] & startBits(range.start()));
+ for (Index i = startw + 1; i < endw; ++i) {
+ vespalib::atomic::store_ref_relaxed(_words[i], 0);
+ }
+ vespalib::atomic::store_ref_relaxed(_words[endw], _words[endw] & endBits(last));
} else {
- _words[startw] &= (startBits(range.start()) | endBits(last));
+ vespalib::atomic::store_ref_relaxed(_words[startw], _words[startw] & (startBits(range.start()) | endBits(last)));
}
}
diff --git a/searchlib/src/vespa/searchlib/common/bitvector.h b/searchlib/src/vespa/searchlib/common/bitvector.h
index 02f51fe8758..779e9887daf 100644
--- a/searchlib/src/vespa/searchlib/common/bitvector.h
+++ b/searchlib/src/vespa/searchlib/common/bitvector.h
@@ -5,6 +5,7 @@
#include "bitword.h"
#include <memory>
#include <vespa/vespalib/util/alloc.h>
+#include <vespa/vespalib/util/atomic.h>
#include <vespa/vespalib/util/generationholder.h>
#include <vespa/fastos/types.h>
@@ -46,6 +47,11 @@ public:
bool testBit(Index idx) const {
return ((_words[wordNum(idx)] & mask(idx)) != 0);
}
+ bool testBitSafe(Index idx) const {
+ auto my_words = vespalib::atomic::load_ref_acquire(_words);
+ auto my_word = vespalib::atomic::load_ref_acquire(my_words[wordNum(idx)]);
+ return (my_word & mask(idx)) != 0;
+ }
bool hasTrueBits() const {
return isValidCount()
? (countTrueBits() != 0)
@@ -136,10 +142,10 @@ public:
_sz = sz;
}
void setBit(Index idx) {
- _words[wordNum(idx)] |= mask(idx);
+ vespalib::atomic::store_ref_relaxed(_words[wordNum(idx)], _words[wordNum(idx)] | mask(idx));
}
void clearBit(Index idx) {
- _words[wordNum(idx)] &= ~ mask(idx);
+ vespalib::atomic::store_ref_relaxed(_words[wordNum(idx)], _words[wordNum(idx)] & ~ mask(idx));
}
void flipBit(Index idx) {
_words[wordNum(idx)] ^= mask(idx);
@@ -200,7 +206,9 @@ public:
}
void swap(BitVector & rhs) {
- std::swap(_words, rhs._words);
+ auto my_words = _words;
+ vespalib::atomic::store_ref_release(_words, rhs._words);
+ vespalib::atomic::store_ref_release(rhs._words, my_words);
std::swap(_startOffset, rhs._startOffset);
std::swap(_sz, rhs._sz);
Index tmp = rhs._numTrueBits;