diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-05 07:49:45 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-03-05 07:49:45 +0000 |
commit | 17ff40f0ee5b35d76e6e3ed0318e1de6d9a3d162 (patch) | |
tree | 11ae04687239f83832404f3d1722b4be95472d5e /searchlib | |
parent | e9f3757b93d24584b6cadee146fdfa58a1e9b626 (diff) |
Remove default constructors and simplify.
Use atomic pointer to get proper memory visibility.
Diffstat (limited to 'searchlib')
6 files changed, 27 insertions, 57 deletions
diff --git a/searchlib/src/vespa/searchlib/query/query_term_simple.cpp b/searchlib/src/vespa/searchlib/query/query_term_simple.cpp index d1f616622ff..2c5e977928c 100644 --- a/searchlib/src/vespa/searchlib/query/query_term_simple.cpp +++ b/searchlib/src/vespa/searchlib/query/query_term_simple.cpp @@ -189,17 +189,6 @@ bool QueryTermSimple::getAsDoubleTerm(double & lower, double & upper) const return getAsNumericTerm(lower, upper, DoubleDecoder()); } -QueryTermSimple::QueryTermSimple() - : _rangeLimit(0), - _maxPerGroup(0), - _diversityCutoffGroups(std::numeric_limits<uint32_t>::max()), - _type(Type::WORD), - _diversityCutoffStrict(false), - _valid(true), - _term(), - _diversityAttribute() -{ } - QueryTermSimple::~QueryTermSimple() = default; namespace { diff --git a/searchlib/src/vespa/searchlib/query/query_term_simple.h b/searchlib/src/vespa/searchlib/query/query_term_simple.h index 0ee97f9d43c..93b19212926 100644 --- a/searchlib/src/vespa/searchlib/query/query_term_simple.h +++ b/searchlib/src/vespa/searchlib/query/query_term_simple.h @@ -34,11 +34,10 @@ public: bool isEqual() const { return low == high; } }; - QueryTermSimple(const QueryTermSimple &) = default; - QueryTermSimple & operator = (const QueryTermSimple &) = default; - QueryTermSimple(QueryTermSimple &&) = default; - QueryTermSimple & operator = (QueryTermSimple &&) = default; - QueryTermSimple(); + QueryTermSimple(const QueryTermSimple &) = delete; + QueryTermSimple & operator = (const QueryTermSimple &) = delete; + QueryTermSimple(QueryTermSimple &&) = delete; + QueryTermSimple & operator = (QueryTermSimple &&) = delete; QueryTermSimple(const string & term_, Type type); virtual ~QueryTermSimple(); /** diff --git a/searchlib/src/vespa/searchlib/query/query_term_ucs4.cpp b/searchlib/src/vespa/searchlib/query/query_term_ucs4.cpp index 7729c7ede36..be0398e1a50 100644 --- a/searchlib/src/vespa/searchlib/query/query_term_ucs4.cpp +++ b/searchlib/src/vespa/searchlib/query/query_term_ucs4.cpp @@ -11,22 +11,17 @@ namespace { std::mutex _globalMutex; } -ucs4_t QueryTermUCS4::ZERO_TERM(0); - -QueryTermUCS4::QueryTermUCS4() : - QueryTermSimple(), - _termUCS4(), - _cachedTermLen(0), - _filled(true) -{ } - -QueryTermUCS4::~QueryTermUCS4() = default; +QueryTermUCS4::~QueryTermUCS4() { + ucs4_t * ucs4 = _termUCS4.load(std::memory_order_relaxed); + if (ucs4 != nullptr) { + delete [] ucs4; + } +} QueryTermUCS4::QueryTermUCS4(const string & termS, Type type) : QueryTermSimple(termS, type), - _termUCS4(), - _cachedTermLen(0), - _filled(false) + _termUCS4(nullptr), + _cachedTermLen(0) { vespalib::Utf8Reader r(termS); while (r.hasMore()) { @@ -36,7 +31,7 @@ QueryTermUCS4::QueryTermUCS4(const string & termS, Type type) : } } -void +const ucs4_t * QueryTermUCS4::fillUCS4() { /* * Double checked locking...... @@ -44,15 +39,17 @@ QueryTermUCS4::fillUCS4() { * you do not really need most of the time. That matters when qps is very high and query is wide, and hits are few. */ std::lock_guard guard(_globalMutex); - if (_filled) return; - _termUCS4.reset(new ucs4_t[_cachedTermLen + 1]); + ucs4_t * ucs4 = _termUCS4.load(std::memory_order_relaxed); + if (ucs4 != nullptr) return ucs4; + ucs4 = new ucs4_t[_cachedTermLen + 1]; vespalib::Utf8Reader r(getTermString()); uint32_t i(0); while (r.hasMore()) { - _termUCS4.get()[i++] = r.getChar(); + ucs4[i++] = r.getChar(); } - _termUCS4.get()[_cachedTermLen] = 0; - _filled = true; + ucs4[_cachedTermLen] = 0; + _termUCS4.store(ucs4); + return ucs4; } void diff --git a/searchlib/src/vespa/searchlib/query/query_term_ucs4.h b/searchlib/src/vespa/searchlib/query/query_term_ucs4.h index c6e5c885155..00ac59d729e 100644 --- a/searchlib/src/vespa/searchlib/query/query_term_ucs4.h +++ b/searchlib/src/vespa/searchlib/query/query_term_ucs4.h @@ -17,25 +17,22 @@ public: QueryTermUCS4 & operator = (const QueryTermUCS4 &) = delete; QueryTermUCS4(QueryTermUCS4 &&) = delete; QueryTermUCS4 & operator = (QueryTermUCS4 &&) = delete; - QueryTermUCS4(); QueryTermUCS4(const string & term_, Type type); - ~QueryTermUCS4(); + ~QueryTermUCS4() override; uint32_t getTermLen() const { return _cachedTermLen; } uint32_t term(const char * & t) const { t = getTerm(); return _cachedTermLen; } void visitMembers(vespalib::ObjectVisitor &visitor) const override; uint32_t term(const ucs4_t * & t) { - if (!_filled.load(std::memory_order_relaxed)) { - fillUCS4(); + t = _termUCS4.load(std::memory_order_relaxed); + if (t == nullptr) { + t = fillUCS4(); } - t = (_termUCS4) ? _termUCS4.get() : &ZERO_TERM; return _cachedTermLen; } private: - void fillUCS4(); - static ucs4_t ZERO_TERM; - std::unique_ptr<ucs4_t[]> _termUCS4; - uint32_t _cachedTermLen; - std::atomic<bool> _filled; + const ucs4_t * fillUCS4(); + std::atomic<ucs4_t *> _termUCS4; + uint32_t _cachedTermLen; }; } diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp index c2da476e61e..69250d84cab 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp @@ -40,17 +40,6 @@ static CharInfo _G_charTable; namespace search::streaming { -QueryTerm::QueryTerm() : - QueryTermUCS4(), - _index(), - _encoding(), - _result(), - _hitList(), - _weight(100), - _uniqueId(0), - _fieldInfo() -{ } - QueryTerm::~QueryTerm() = default; void diff --git a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h index 3eb95209b58..134945e36d6 100644 --- a/searchlib/src/vespa/searchlib/query/streaming/queryterm.h +++ b/searchlib/src/vespa/searchlib/query/streaming/queryterm.h @@ -53,7 +53,6 @@ public: uint32_t _hitCount; uint32_t _fieldLength; }; - QueryTerm(); QueryTerm(std::unique_ptr<QueryNodeResultBase> resultBase, const string & term, const string & index, Type type); QueryTerm(const QueryTerm &) = delete; QueryTerm & operator = (const QueryTerm &) = delete; |