summaryrefslogtreecommitdiff
path: root/src/mongo/util/clock_source_mock.cpp
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@mongodb.com>2016-06-16 13:51:03 -0400
committerAndy Schwerin <schwerin@mongodb.com>2016-07-13 17:37:01 -0400
commit3f8990345ec18fe2f0316859231c2424e4355b95 (patch)
tree64f276053cfdd7cd7f96ad40081fa9c6a11ebdb6 /src/mongo/util/clock_source_mock.cpp
parent9e7a9892b0c47c6bd9a7393ff4e378feac65db48 (diff)
downloadmongo-3f8990345ec18fe2f0316859231c2424e4355b95.tar.gz
SERVER-21004 Add setAlarm capability and virtualization flag to ClockSourceMock.
Diffstat (limited to 'src/mongo/util/clock_source_mock.cpp')
-rw-r--r--src/mongo/util/clock_source_mock.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/mongo/util/clock_source_mock.cpp b/src/mongo/util/clock_source_mock.cpp
index f2257bf2604..66879ca5438 100644
--- a/src/mongo/util/clock_source_mock.cpp
+++ b/src/mongo/util/clock_source_mock.cpp
@@ -29,7 +29,8 @@
#include "mongo/platform/basic.h"
#include "mongo/util/clock_source_mock.h"
-#include "mongo/util/time_support.h"
+
+#include <algorithm>
namespace mongo {
@@ -38,14 +39,46 @@ Milliseconds ClockSourceMock::getPrecision() {
}
Date_t ClockSourceMock::now() {
+ stdx::lock_guard<stdx::mutex> lk(_mutex);
return _now;
}
void ClockSourceMock::advance(Milliseconds ms) {
+ stdx::unique_lock<stdx::mutex> lk(_mutex);
_now += ms;
+ _processAlarms(std::move(lk));
}
void ClockSourceMock::reset(Date_t newNow) {
+ stdx::unique_lock<stdx::mutex> lk(_mutex);
_now = newNow;
+ _processAlarms(std::move(lk));
+}
+
+Status ClockSourceMock::setAlarm(Date_t when, stdx::function<void()> action) {
+ stdx::unique_lock<stdx::mutex> lk(_mutex);
+ if (when <= _now) {
+ lk.unlock();
+ action();
+ return Status::OK();
+ }
+ _alarms.emplace_back(std::make_pair(when, std::move(action)));
+ return Status::OK();
}
+
+void ClockSourceMock::_processAlarms(stdx::unique_lock<stdx::mutex> lk) {
+ using std::swap;
+ invariant(lk.owns_lock());
+ std::vector<Alarm> readyAlarms;
+ std::vector<Alarm>::iterator iter;
+ auto alarmIsNotExpired = [&](const Alarm& alarm) { return alarm.first > _now; };
+ auto expiredAlarmsBegin = std::partition(_alarms.begin(), _alarms.end(), alarmIsNotExpired);
+ std::move(expiredAlarmsBegin, _alarms.end(), std::back_inserter(readyAlarms));
+ _alarms.erase(expiredAlarmsBegin, _alarms.end());
+ lk.unlock();
+ for (const auto& alarm : readyAlarms) {
+ alarm.second();
+ }
+}
+
} // namespace mongo