summaryrefslogtreecommitdiffstats
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.cpp53
1 files changed, 30 insertions, 23 deletions
diff --git a/staging_vespalib/src/tests/metrics/mock_tick.cpp b/staging_vespalib/src/tests/metrics/mock_tick.cpp
index e78b7c4644f..2178b5364e9 100644
--- a/staging_vespalib/src/tests/metrics/mock_tick.cpp
+++ b/staging_vespalib/src/tests/metrics/mock_tick.cpp
@@ -3,43 +3,49 @@
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;
+ _blocked = true;
+ _blockedCond.notify_all();
+ while (_runFlag && !_provided) {
+ _providedCond.wait(locker);
+ }
+ _blocked = false;
+ if (_provided) {
+ _provided = false;
+ return _nextValue;
+ } else {
+ // killed
+ return TimeStamp(0);
}
- return TimeStamp(0);
}
void
MockTick::kill()
{
std::unique_lock<std::mutex> locker(_lock);
- _runFlag.store(false);
+ _runFlag = false;
_blockedCond.notify_all();
_providedCond.notify_all();
}
+bool
+MockTick::alive()
+{
+ std::unique_lock<std::mutex> locker(_lock);
+ return _runFlag;
+}
+
void
MockTick::provide(TimeStamp value)
{
std::unique_lock<std::mutex> locker(_lock);
_nextValue = value;
- _blocked.store(false);
- _provided.store(true);
+ _blocked = false;
+ _provided = true;
_providedCond.notify_all();
}
@@ -47,14 +53,15 @@ 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;
+ while (_runFlag && !_blocked) {
+ _blockedCond.wait(locker);
+ }
+ if (_blocked) {
+ return _prevValue;
+ } else {
+ // killed
+ return TimeStamp(0);
}
- return TimeStamp(0);
}
MockTick::MockTick()