Make monotonic_now a required parameter to PhasedLoop
This prepares us much better for mocking out time as part of the event
loop conversion.
Change-Id: I57560b97b265ddd41fe7a4e9f74d7b1324d15955
diff --git a/aos/actions/actor.h b/aos/actions/actor.h
index 57a2ecb..53b7040 100644
--- a/aos/actions/actor.h
+++ b/aos/actions/actor.h
@@ -53,6 +53,7 @@
// succeeded.
bool WaitOrCancel(monotonic_clock::duration duration) {
::aos::time::PhasedLoop phased_loop(::aos::controls::kLoopFrequency,
+ event_loop_->monotonic_now(),
::std::chrono::milliseconds(5) / 2);
return !WaitUntil(
[&phased_loop]() {
@@ -92,6 +93,8 @@
// Set to true when we should stop ASAP.
bool abort_ = false;
+ ::aos::EventLoop *event_loop() { return event_loop_; }
+
private:
// Checks if an action was initially running when the thread started.
bool CheckInitialRunning();
diff --git a/aos/util/phased_loop.h b/aos/util/phased_loop.h
index 1c1aef1..7aa51d2 100644
--- a/aos/util/phased_loop.h
+++ b/aos/util/phased_loop.h
@@ -19,12 +19,13 @@
// offset must be >= chrono::seconds(0) and < interval.
PhasedLoop(
const monotonic_clock::duration interval,
+ const monotonic_clock::time_point monotonic_now,
const monotonic_clock::duration offset = monotonic_clock::duration(0))
: interval_(interval), offset_(offset), last_time_(offset) {
CHECK_GE(offset, monotonic_clock::duration(0));
CHECK_GT(interval, monotonic_clock::duration(0));
CHECK_LT(offset, interval);
- Reset();
+ Reset(monotonic_now);
}
// Updates the offset and interval.
@@ -52,8 +53,7 @@
// Resets the count of skipped iterations.
// Iterate(monotonic_now) will return 1 and set sleep_time() to something
// within interval of monotonic_now.
- void Reset(const monotonic_clock::time_point monotonic_now =
- monotonic_clock::now()) {
+ void Reset(const monotonic_clock::time_point monotonic_now) {
Iterate(monotonic_now - interval_);
}
diff --git a/aos/util/phased_loop_test.cc b/aos/util/phased_loop_test.cc
index 2a52b90..4f07bcc 100644
--- a/aos/util/phased_loop_test.cc
+++ b/aos/util/phased_loop_test.cc
@@ -23,7 +23,8 @@
TEST_F(PhasedLoopTest, Reset) {
{
- PhasedLoop loop(milliseconds(100), milliseconds(0));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+ milliseconds(0));
loop.Reset(monotonic_clock::epoch());
EXPECT_EQ(InMs(0), loop.sleep_time());
@@ -46,14 +47,16 @@
EXPECT_EQ(InMs(200), loop.sleep_time());
}
{
- PhasedLoop loop(milliseconds(100), milliseconds(1));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+ milliseconds(1));
loop.Reset(monotonic_clock::epoch());
EXPECT_EQ(InMs(-99), loop.sleep_time());
EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
EXPECT_EQ(InMs(1), loop.sleep_time());
}
{
- PhasedLoop loop(milliseconds(100), milliseconds(99));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+ milliseconds(99));
loop.Reset(monotonic_clock::epoch());
EXPECT_EQ(InMs(-1), loop.sleep_time());
@@ -79,7 +82,8 @@
TEST_F(PhasedLoopTest, Iterate) {
{
- PhasedLoop loop(milliseconds(100), milliseconds(99));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+ milliseconds(99));
loop.Reset(monotonic_clock::epoch());
EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
EXPECT_EQ(InMs(99), loop.sleep_time());
@@ -99,7 +103,8 @@
EXPECT_EQ(InMs(699), loop.sleep_time());
}
{
- PhasedLoop loop(milliseconds(100), milliseconds(1));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(),
+ milliseconds(1));
loop.Reset(monotonic_clock::epoch());
EXPECT_EQ(1, loop.Iterate(monotonic_clock::epoch()));
EXPECT_EQ(InMs(1), loop.sleep_time());
@@ -124,7 +129,7 @@
// This seems like a rare case at first, but starting from zero needs to
// work, which means negatives should too.
TEST_F(PhasedLoopTest, CrossingZero) {
- PhasedLoop loop(milliseconds(100), milliseconds(1));
+ PhasedLoop loop(milliseconds(100), monotonic_clock::epoch(), milliseconds(1));
loop.Reset(InMs(-1000));
EXPECT_EQ(InMs(-1099), loop.sleep_time());
EXPECT_EQ(9, loop.Iterate(InMs(-250)));
@@ -152,7 +157,8 @@
// Tests OffsetFromIntervalAndTime for various edge conditions.
TEST_F(PhasedLoopTest, OffsetFromIntervalAndTimeTest) {
- PhasedLoop loop(milliseconds(1000), milliseconds(300));
+ PhasedLoop loop(milliseconds(1000), monotonic_clock::epoch(),
+ milliseconds(300));
EXPECT_EQ(milliseconds(1),
loop.OffsetFromIntervalAndTime(milliseconds(1000), InMs(1001)));
@@ -175,14 +181,18 @@
// Tests that passing invalid values to the constructor dies correctly.
TEST_F(PhasedLoopDeathTest, InvalidValues) {
- EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(2)),
- ".*offset<interval.*");
- EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(1)),
- ".*offset<interval.*");
- EXPECT_DEATH(PhasedLoop(milliseconds(1), milliseconds(-1)),
- ".*offset>=monotonic_clock::duration\\(0\\).*");
- EXPECT_DEATH(PhasedLoop(milliseconds(0), milliseconds(0)),
- ".*interval>monotonic_clock::duration\\(0\\).*");
+ EXPECT_DEATH(
+ PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(2)),
+ ".*offset<interval.*");
+ EXPECT_DEATH(
+ PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(1)),
+ ".*offset<interval.*");
+ EXPECT_DEATH(
+ PhasedLoop(milliseconds(1), monotonic_clock::epoch(), milliseconds(-1)),
+ ".*offset>=monotonic_clock::duration\\(0\\).*");
+ EXPECT_DEATH(
+ PhasedLoop(milliseconds(0), monotonic_clock::epoch(), milliseconds(0)),
+ ".*interval>monotonic_clock::duration\\(0\\).*");
}
} // namespace testing