summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-08-30 11:07:02 +0200
committerGitHub <noreply@github.com>2021-08-30 11:07:02 +0200
commit11e7a365a7f6e63b109f24f3f81ff4aaee9bad72 (patch)
tree0c1fd7dc3f59d1da59d20d0bd56360820634f19f
parent1a506104aec23f261142bb36fbf8b67eee75122f (diff)
parentb268af77c44525562444494ed91df7e18a4a7a4f (diff)
Merge pull request #18893 from vespa-engine/balder/lock-on-write-atomic-on-read
As doSeek is called alot more frequent than doUnpack just use locking…
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h18
1 files changed, 10 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h
index b7bdffd31c1..821dc67fe64 100644
--- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h
+++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h
@@ -2,9 +2,10 @@
#pragma once
+#include <vespa/vespalib/util/priority_queue.h>
#include <mutex>
#include <limits>
-#include <vespa/vespalib/util/priority_queue.h>
+#include <atomic>
namespace search::queryeval {
@@ -15,7 +16,7 @@ class NearestNeighborDistanceHeap {
private:
std::mutex _lock;
size_t _size;
- double _distance_threshold;
+ std::atomic<double> _distance_threshold;
vespalib::PriorityQueue<double, std::greater<double>> _priQ;
public:
explicit NearestNeighborDistanceHeap(size_t maxSize)
@@ -25,14 +26,10 @@ public:
_priQ.reserve(maxSize);
}
void set_distance_threshold(double distance_threshold) {
- _distance_threshold = distance_threshold;
+ _distance_threshold.store(distance_threshold, std::memory_order_relaxed);
}
double distanceLimit() {
- std::lock_guard<std::mutex> guard(_lock);
- if (_priQ.size() < _size) {
- return _distance_threshold;
- }
- return _priQ.front();
+ return _distance_threshold.load(std::memory_order_relaxed);
}
void used(double distance) {
std::lock_guard<std::mutex> guard(_lock);
@@ -42,6 +39,11 @@ public:
_priQ.front() = distance;
_priQ.adjust();
}
+ if (_priQ.size() >= _size) {
+ if (_distance_threshold.load(std::memory_order_relaxed) > _priQ.front()) {
+ _distance_threshold.store(_priQ.front(), std::memory_order_relaxed);
+ }
+ }
}
};