summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-12-20 23:33:53 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2022-12-20 23:34:52 +0000
commit0b3446970f950af908ac2867909a4a46d3eb583d (patch)
treeed43f8acd77d1ec17dc12b3f3b3b4efdd03e9675 /config
parent5dbe5a6374a88a783dd64395fb0f7827b3e568c2 (diff)
Prefer cond.wait_for over sleep_for when you can be interrupted.
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