diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-20 23:33:53 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-20 23:34:52 +0000 |
commit | 0b3446970f950af908ac2867909a4a46d3eb583d (patch) | |
tree | ed43f8acd77d1ec17dc12b3f3b3b4efdd03e9675 /config/src | |
parent | 5dbe5a6374a88a783dd64395fb0f7827b3e568c2 (diff) |
Prefer cond.wait_for over sleep_for when you can be interrupted.
Diffstat (limited to 'config/src')
-rw-r--r-- | config/src/vespa/config/subscription/configsubscriptionset.cpp | 16 | ||||
-rw-r--r-- | config/src/vespa/config/subscription/configsubscriptionset.h | 3 |
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 |