summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahooinc.com>2022-02-17 10:54:20 +0100
committerGitHub <noreply@github.com>2022-02-17 10:54:20 +0100
commit8ed6b4614210da06a249bd510f14a9905590ec2f (patch)
tree835dbc7b33d9021809388fc8763cc2ba83f4d85a
parenta62caaa746d9ab5680d134ed815dac0346e54c25 (diff)
parentc692a82c08b1f530807e5910bbadc270c5537c31 (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.cpp16
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;
};
/**