summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-03-05 07:49:45 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-03-05 07:49:45 +0000
commit17ff40f0ee5b35d76e6e3ed0318e1de6d9a3d162 (patch)
tree11ae04687239f83832404f3d1722b4be95472d5e /searchlib
parente9f3757b93d24584b6cadee146fdfa58a1e9b626 (diff)
Remove default constructors and simplify.
Use atomic pointer to get proper memory visibility.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/query/query_term_simple.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/query/query_term_simple.h9
-rw-r--r--searchlib/src/vespa/searchlib/query/query_term_ucs4.cpp35
-rw-r--r--searchlib/src/vespa/searchlib/query/query_term_ucs4.h17
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/queryterm.cpp11
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/queryterm.h1
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;