aboutsummaryrefslogtreecommitdiffstats
path: root/staging_vespalib/src/tests/metrics/mock_tick.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'staging_vespalib/src/tests/metrics/mock_tick.cpp')
-rw-r--r--staging_vespalib/src/tests/metrics/mock_tick.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/staging_vespalib/src/tests/metrics/mock_tick.cpp b/staging_vespalib/src/tests/metrics/mock_tick.cpp
new file mode 100644
index 00000000000..e78b7c4644f
--- /dev/null
+++ b/staging_vespalib/src/tests/metrics/mock_tick.cpp
@@ -0,0 +1,71 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "mock_tick.h"
+
+namespace vespalib::metrics {
+
+const std::chrono::seconds oneSec{1};
+
+TimeStamp
+MockTick::next(TimeStamp prev)
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _prevValue = prev;
+ while (_runFlag) {
+ if (_provided) {
+ _blocked.store(false);
+ _provided.store(false);
+ return _nextValue;
+ }
+ _blocked.store(true);
+ _blockedCond.notify_all();
+ auto r = _providedCond.wait_for(locker, oneSec);
+ (void)r;
+ }
+ return TimeStamp(0);
+}
+
+void
+MockTick::kill()
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _runFlag.store(false);
+ _blockedCond.notify_all();
+ _providedCond.notify_all();
+}
+
+void
+MockTick::provide(TimeStamp value)
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ _nextValue = value;
+ _blocked.store(false);
+ _provided.store(true);
+ _providedCond.notify_all();
+}
+
+TimeStamp
+MockTick::waitUntilBlocked()
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ while (_runFlag) {
+ if (_blocked) {
+ return _prevValue;
+ }
+ auto r = _blockedCond.wait_for(locker, oneSec);
+ (void)r;
+ }
+ return TimeStamp(0);
+}
+
+MockTick::MockTick()
+ : _lock(),
+ _runFlag(true),
+ _provided(false),
+ _blocked(false),
+ _providedCond(),
+ _blockedCond(),
+ _nextValue(0.0),
+ _prevValue(0.0)
+{}
+
+} // namespace vespalib::metrics