diff options
author | Tor Egge <Tor.Egge@yahooinc.com> | 2022-03-30 16:48:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-30 16:48:23 +0200 |
commit | 76ef40f11cbb25e5117f9ddfcec5260bc19c13fa (patch) | |
tree | deb8861b819b180ebcf04ff3f0efe49cdd2a6365 /searchlib | |
parent | 65e62ca04dc53b7e013b95f0edd79835ebcfe499 (diff) | |
parent | e92b25e98b41bb9be33bdea1c8ed4bc1c89aec8b (diff) |
Merge pull request #21903 from vespa-engine/havardpe/atomic-document-existence
make tsan happy by using atomic operations on bits
Diffstat (limited to 'searchlib')
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvector.cpp | 10 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/common/bitvector.h | 14 |
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; |