diff options
Diffstat (limited to 'metrics')
-rw-r--r-- | metrics/src/vespa/metrics/CMakeLists.txt | 1 | ||||
-rw-r--r-- | metrics/src/vespa/metrics/metricmanager.cpp | 4 | ||||
-rw-r--r-- | metrics/src/vespa/metrics/metricmanager.h | 2 | ||||
-rw-r--r-- | metrics/src/vespa/metrics/updatehook.cpp | 18 | ||||
-rw-r--r-- | metrics/src/vespa/metrics/updatehook.h | 19 |
5 files changed, 37 insertions, 7 deletions
diff --git a/metrics/src/vespa/metrics/CMakeLists.txt b/metrics/src/vespa/metrics/CMakeLists.txt index 6bb39191791..13a3f09449e 100644 --- a/metrics/src/vespa/metrics/CMakeLists.txt +++ b/metrics/src/vespa/metrics/CMakeLists.txt @@ -15,6 +15,7 @@ vespa_add_library(metrics state_api_adapter.cpp summetric.cpp textwriter.cpp + updatehook.cpp valuemetric.cpp valuemetricvalues.cpp xmlwriter.cpp diff --git a/metrics/src/vespa/metrics/metricmanager.cpp b/metrics/src/vespa/metrics/metricmanager.cpp index 51149cf67c3..6447e12a0d2 100644 --- a/metrics/src/vespa/metrics/metricmanager.cpp +++ b/metrics/src/vespa/metrics/metricmanager.cpp @@ -20,7 +20,7 @@ LOG_SETUP(".metrics.manager"); namespace metrics { -typedef MetricsmanagerConfig Config; +using Config = MetricsmanagerConfig; MetricManager::ConsumerSpec::ConsumerSpec() = default; MetricManager::ConsumerSpec::~ConsumerSpec() = default; @@ -32,7 +32,7 @@ MetricManager::Timer::getTime() const { void MetricManager::assertMetricLockLocked(const MetricLockGuard& g) const { - if ((g.mutex() != &_waiter) || !g.owns_lock()) { + if (g.owns(_waiter)) { throw vespalib::IllegalArgumentException("Given lock does not lock the metric lock.", VESPA_STRLOC); } } diff --git a/metrics/src/vespa/metrics/metricmanager.h b/metrics/src/vespa/metrics/metricmanager.h index feedf2c1515..f5ad5c5eea3 100644 --- a/metrics/src/vespa/metrics/metricmanager.h +++ b/metrics/src/vespa/metrics/metricmanager.h @@ -60,8 +60,6 @@ template class vespalib::hash_set<metrics::Metric::String>; namespace metrics { -using MetricLockGuard = UpdateHook::MetricLockGuard; - class MetricManager : private document::Runnable { public: diff --git a/metrics/src/vespa/metrics/updatehook.cpp b/metrics/src/vespa/metrics/updatehook.cpp new file mode 100644 index 00000000000..99051e8df64 --- /dev/null +++ b/metrics/src/vespa/metrics/updatehook.cpp @@ -0,0 +1,18 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "updatehook.h" + +namespace metrics { + +MetricLockGuard::MetricLockGuard(std::mutex & mutex) + : _guard(mutex) +{} + +bool +MetricLockGuard::owns(const std::mutex & mutex) const { + return (_guard.mutex() == &mutex) && !_guard.owns_lock(); +} + +MetricLockGuard::~MetricLockGuard() = default; + +} diff --git a/metrics/src/vespa/metrics/updatehook.h b/metrics/src/vespa/metrics/updatehook.h index 65f34c65664..0a0f218d61a 100644 --- a/metrics/src/vespa/metrics/updatehook.h +++ b/metrics/src/vespa/metrics/updatehook.h @@ -5,6 +5,21 @@ namespace metrics { +class MetricLockGuard { +public: + MetricLockGuard(std::mutex & mutex); + MetricLockGuard(const MetricLockGuard &) = delete; + MetricLockGuard & operator =(const MetricLockGuard &) = delete; + MetricLockGuard(MetricLockGuard &&) = default; + MetricLockGuard & operator =(MetricLockGuard &&) = default; + ~MetricLockGuard(); + + bool owns(const std::mutex &) const; + operator std::unique_lock<std::mutex> & () { return _guard; } +private: + std::unique_lock<std::mutex> _guard; +}; + class MetricManager; class UpdateHook { @@ -14,9 +29,7 @@ class UpdateHook { friend class MetricManager; public: - using UP = std::unique_ptr<UpdateHook>; - using MetricLockGuard = std::unique_lock<std::mutex>; - + using MetricLockGuard = metrics::MetricLockGuard; UpdateHook(const char* name) : _name(name), _nextCall(0), _period(0) {} virtual ~UpdateHook() = default; virtual void updateMetrics(const MetricLockGuard & guard) = 0; |