diff options
author | Geir Storli <geirst@yahooinc.com> | 2022-02-17 10:54:20 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-17 10:54:20 +0100 |
commit | 8ed6b4614210da06a249bd510f14a9905590ec2f (patch) | |
tree | 835dbc7b33d9021809388fc8763cc2ba83f4d85a | |
parent | a62caaa746d9ab5680d134ed815dac0346e54c25 (diff) | |
parent | c692a82c08b1f530807e5910bbadc270c5537c31 (diff) |
Merge pull request #21239 from vespa-engine/toregge/detect-dangling-shared-operation-throttler-tokens-when-using-no-limits-operation-throttler
Detect dangling shared operation throttler token when using no limits…
-rw-r--r-- | vespalib/src/vespa/vespalib/util/shared_operation_throttler.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/vespalib/src/vespa/vespalib/util/shared_operation_throttler.cpp b/vespalib/src/vespa/vespalib/util/shared_operation_throttler.cpp index 1df5f85bb6b..f5a1c117cc8 100644 --- a/vespalib/src/vespa/vespalib/util/shared_operation_throttler.cpp +++ b/vespalib/src/vespa/vespalib/util/shared_operation_throttler.cpp @@ -1,5 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "shared_operation_throttler.h" +#include <atomic> #include <condition_variable> #include <cassert> #include <functional> @@ -11,21 +12,32 @@ namespace { class NoLimitsOperationThrottler final : public SharedOperationThrottler { public: - ~NoLimitsOperationThrottler() override = default; + NoLimitsOperationThrottler() + : SharedOperationThrottler(), + _refs(0u) + { + } + ~NoLimitsOperationThrottler() override { + assert(_refs.load(std::memory_order_acquire) == 0u); + } Token blocking_acquire_one() noexcept override { + ++_refs; return Token(this, TokenCtorTag{}); } Token blocking_acquire_one(vespalib::duration) noexcept override { + ++_refs; return Token(this, TokenCtorTag{}); } Token try_acquire_one() noexcept override { + ++_refs; return Token(this, TokenCtorTag{}); } uint32_t current_window_size() const noexcept override { return 0; } uint32_t waiting_threads() const noexcept override { return 0; } void reconfigure_dynamic_throttling(const DynamicThrottleParams&) noexcept override { /* no-op */ } private: - void release_one() noexcept override { /* no-op */ } + void release_one() noexcept override { --_refs; } + std::atomic<uint32_t> _refs; }; /** |