aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/src/vespa/config/subscription/configsubscriptionset.cpp16
-rw-r--r--config/src/vespa/config/subscription/configsubscriptionset.h3
2 files changed, 14 insertions, 5 deletions
diff --git a/config/src/vespa/config/subscription/configsubscriptionset.cpp b/config/src/vespa/config/subscription/configsubscriptionset.cpp
index 48e2bdc2615..4f7bf64f603 100644
--- a/config/src/vespa/config/subscription/configsubscriptionset.cpp
+++ b/config/src/vespa/config/subscription/configsubscriptionset.cpp
@@ -6,7 +6,6 @@
#include <vespa/config/common/misc.h>
#include <vespa/config/common/iconfigmanager.h>
#include <vespa/config/common/iconfigcontext.h>
-#include <thread>
#include <vespa/log/log.h>
LOG_SETUP(".config.subscription.configsubscriptionset");
@@ -23,7 +22,9 @@ ConfigSubscriptionSet::ConfigSubscriptionSet(std::shared_ptr<IConfigContext> con
_mgr(_context->getManagerInstance()),
_currentGeneration(-1),
_subscriptionList(),
- _state(OPEN)
+ _state(OPEN),
+ _lock(),
+ _cond()
{ }
ConfigSubscriptionSet::~ConfigSubscriptionSet()
@@ -81,8 +82,9 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange)
inSync = generationsInSync && (_subscriptionList.size() == numGenerationChanged) && (ignoreChange || numChanged > 0);
lastGeneration = generation;
now = steady_clock::now();
- if (!inSync && (now < deadline)) {
- std::this_thread::sleep_for(std::min(_maxNapTime, deadline - now));
+ std::unique_lock guard(_lock);
+ if (!inSync && (now < deadline) && !isClosed()) {
+ _cond.wait_for(guard, std::min(_maxNapTime, deadline - now));
} else {
break;
}
@@ -109,7 +111,11 @@ ConfigSubscriptionSet::acquireSnapshot(duration timeout, bool ignoreChange)
void
ConfigSubscriptionSet::close()
{
- _state = CLOSED;
+ {
+ std::lock_guard guard(_lock);
+ _state = CLOSED;
+ _cond.notify_all();
+ }
for (const auto & subscription : _subscriptionList) {
_mgr.unsubscribe(*subscription);
subscription->close();
diff --git a/config/src/vespa/config/subscription/configsubscriptionset.h b/config/src/vespa/config/subscription/configsubscriptionset.h
index 8daf7ae91ea..e4a47a9a1cc 100644
--- a/config/src/vespa/config/subscription/configsubscriptionset.h
+++ b/config/src/vespa/config/subscription/configsubscriptionset.h
@@ -7,6 +7,7 @@
#include <atomic>
#include <memory>
#include <vector>
+#include <condition_variable>
namespace config {
@@ -72,6 +73,8 @@ private:
std::atomic<int64_t> _currentGeneration; // Holds the current config generation.
SubscriptionList _subscriptionList; // List of current subscriptions.
std::atomic<SubscriberState> _state; // Current state of this subscriber.
+ std::mutex _lock;
+ std::condition_variable _cond;
};
} // namespace config