Set context to defined value OnRun

The context for the eventloop is currently not set to
anything when entering an OnRun callback. The context
are now set to some known value for simulated and real
time when entering OnRun callback.

While we are here, I noticed that the *remote* uuid was set to the local
UUID in timers.  That makes no sense, so stop doing that.

Change-Id: I2c227a7e9742b092c9079549aad341154460ff11
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/events/event_loop.cc b/aos/events/event_loop.cc
index 29e4c22..b0487d5 100644
--- a/aos/events/event_loop.cc
+++ b/aos/events/event_loop.cc
@@ -493,6 +493,19 @@
   return result;
 }
 
+void EventLoop::SetTimerContext(
+    monotonic_clock::time_point monotonic_event_time) {
+  context_.monotonic_event_time = monotonic_event_time;
+  context_.monotonic_remote_time = monotonic_clock::min_time;
+  context_.realtime_event_time = realtime_clock::min_time;
+  context_.realtime_remote_time = realtime_clock::min_time;
+  context_.queue_index = 0xffffffffu;
+  context_.size = 0u;
+  context_.data = nullptr;
+  context_.buffer_index = -1;
+  context_.source_boot_uuid = boot_uuid();
+}
+
 void WatcherState::set_timing_report(timing::Watcher *watcher) {
   CHECK_NOTNULL(watcher);
   watcher_ = watcher;
diff --git a/aos/events/event_loop.h b/aos/events/event_loop.h
index 7cb6a5a..8ef8d57 100644
--- a/aos/events/event_loop.h
+++ b/aos/events/event_loop.h
@@ -76,7 +76,7 @@
 
   // UUID of the remote node which sent this message, or this node in the case
   // of events which are local to this node.
-  UUID remote_boot_uuid = UUID::Zero();
+  UUID source_boot_uuid = UUID::Zero();
 
   // Efficiently copies the flatbuffer into a FlatbufferVector, allocating
   // memory in the process.  It is vital that T matches the type of the
@@ -154,7 +154,7 @@
   bool Send(size_t size);
   bool Send(size_t size, monotonic_clock::time_point monotonic_remote_time,
             realtime_clock::time_point realtime_remote_time,
-            uint32_t remote_queue_index, const UUID &remote_boot_uuid);
+            uint32_t remote_queue_index, const UUID &source_boot_uuid);
 
   // Sends a single block of data by copying it.
   // The remote arguments have the same meaning as in Send above.
@@ -162,7 +162,7 @@
   bool Send(const void *data, size_t size,
             monotonic_clock::time_point monotonic_remote_time,
             realtime_clock::time_point realtime_remote_time,
-            uint32_t remote_queue_index, const UUID &remote_boot_uuid);
+            uint32_t remote_queue_index, const UUID &source_boot_uuid);
 
   const Channel *channel() const { return channel_; }
 
@@ -203,12 +203,12 @@
                       monotonic_clock::time_point monotonic_remote_time,
                       realtime_clock::time_point realtime_remote_time,
                       uint32_t remote_queue_index,
-                      const UUID &remote_boot_uuid) = 0;
+                      const UUID &source_boot_uuid) = 0;
   virtual bool DoSend(size_t size,
                       monotonic_clock::time_point monotonic_remote_time,
                       realtime_clock::time_point realtime_remote_time,
                       uint32_t remote_queue_index,
-                      const UUID &remote_boot_uuid) = 0;
+                      const UUID &source_boot_uuid) = 0;
 
   EventLoop *const event_loop_;
   const Channel *const channel_;
@@ -739,6 +739,10 @@
   // If true, don't send AOS_LOG to /aos
   bool skip_logger_ = false;
 
+  // Sets context_ for a timed event which is supposed to happen at the provided
+  // time.
+  void SetTimerContext(monotonic_clock::time_point monotonic_event_time);
+
  private:
   virtual pid_t GetTid() = 0;
 
diff --git a/aos/events/event_loop_param_test.cc b/aos/events/event_loop_param_test.cc
index 2ffcb58..1460663 100644
--- a/aos/events/event_loop_param_test.cc
+++ b/aos/events/event_loop_param_test.cc
@@ -274,7 +274,7 @@
   EXPECT_EQ(fetcher.context().monotonic_remote_time, monotonic_clock::min_time);
   EXPECT_EQ(fetcher.context().realtime_event_time, realtime_clock::min_time);
   EXPECT_EQ(fetcher.context().realtime_remote_time, realtime_clock::min_time);
-  EXPECT_EQ(fetcher.context().remote_boot_uuid, UUID::Zero());
+  EXPECT_EQ(fetcher.context().source_boot_uuid, UUID::Zero());
   EXPECT_EQ(fetcher.context().queue_index, 0xffffffffu);
   EXPECT_EQ(fetcher.context().size, 0u);
   EXPECT_EQ(fetcher.context().data, nullptr);
@@ -302,7 +302,7 @@
   EXPECT_LE(fetcher.context().monotonic_event_time, monotonic_now + kEpsilon);
   EXPECT_GE(fetcher.context().realtime_event_time, realtime_now - kEpsilon);
   EXPECT_LE(fetcher.context().realtime_event_time, realtime_now + kEpsilon);
-  EXPECT_EQ(fetcher.context().remote_boot_uuid, loop2->boot_uuid());
+  EXPECT_EQ(fetcher.context().source_boot_uuid, loop2->boot_uuid());
   EXPECT_EQ(fetcher.context().queue_index, 0x0u);
   EXPECT_EQ(fetcher.context().size, 20u);
   EXPECT_NE(fetcher.context().data, nullptr);
@@ -957,7 +957,7 @@
     EXPECT_EQ(loop->context().monotonic_remote_time, monotonic_clock::min_time);
     EXPECT_EQ(loop->context().realtime_event_time, realtime_clock::min_time);
     EXPECT_EQ(loop->context().realtime_remote_time, realtime_clock::min_time);
-    EXPECT_EQ(loop->context().remote_boot_uuid, loop->boot_uuid());
+    EXPECT_EQ(loop->context().source_boot_uuid, loop->boot_uuid());
     EXPECT_EQ(loop->context().queue_index, 0xffffffffu);
     EXPECT_EQ(loop->context().size, 0u);
     EXPECT_EQ(loop->context().data, nullptr);
@@ -1252,7 +1252,7 @@
               loop1->context().monotonic_event_time);
     EXPECT_EQ(loop1->context().realtime_remote_time,
               loop1->context().realtime_event_time);
-    EXPECT_EQ(loop1->context().remote_boot_uuid, loop1->boot_uuid());
+    EXPECT_EQ(loop1->context().source_boot_uuid, loop1->boot_uuid());
 
     const aos::monotonic_clock::time_point monotonic_now =
         loop1->monotonic_now();
@@ -1300,7 +1300,7 @@
             fetcher.context().realtime_remote_time);
   EXPECT_EQ(fetcher.context().monotonic_event_time,
             fetcher.context().monotonic_remote_time);
-  EXPECT_EQ(fetcher.context().remote_boot_uuid, loop1->boot_uuid());
+  EXPECT_EQ(fetcher.context().source_boot_uuid, loop1->boot_uuid());
 
   EXPECT_TRUE(monotonic_time_offset > ::std::chrono::milliseconds(-500))
       << ": Got "
@@ -1353,7 +1353,7 @@
               loop1->context().monotonic_event_time);
     EXPECT_EQ(loop1->context().realtime_remote_time,
               loop1->context().realtime_event_time);
-    EXPECT_EQ(loop1->context().remote_boot_uuid, loop1->boot_uuid());
+    EXPECT_EQ(loop1->context().source_boot_uuid, loop1->boot_uuid());
 
     const aos::monotonic_clock::time_point monotonic_now =
         loop1->monotonic_now();
@@ -1387,7 +1387,7 @@
             fetcher.context().realtime_remote_time);
   EXPECT_EQ(fetcher.context().monotonic_event_time,
             fetcher.context().monotonic_remote_time);
-  EXPECT_EQ(fetcher.context().remote_boot_uuid, loop1->boot_uuid());
+  EXPECT_EQ(fetcher.context().source_boot_uuid, loop1->boot_uuid());
 
   EXPECT_TRUE(monotonic_time_offset > ::std::chrono::milliseconds(-500))
       << ": Got "
@@ -1445,7 +1445,7 @@
 
             EXPECT_EQ(loop1->context().monotonic_remote_time,
                       monotonic_clock::min_time);
-            EXPECT_EQ(loop1->context().remote_boot_uuid, loop1->boot_uuid());
+            EXPECT_EQ(loop1->context().source_boot_uuid, loop1->boot_uuid());
             EXPECT_EQ(loop1->context().realtime_event_time,
                       realtime_clock::min_time);
             EXPECT_EQ(loop1->context().realtime_remote_time,
@@ -1956,7 +1956,7 @@
   const aos::realtime_clock::time_point realtime_remote_time =
       aos::realtime_clock::time_point(chrono::seconds(3132));
   const uint32_t remote_queue_index = 0x254971;
-  const UUID remote_boot_uuid = UUID::Random();
+  const UUID source_boot_uuid = UUID::Random();
 
   std::unique_ptr<aos::RawSender> sender =
       loop1->MakeRawSender(configuration::GetChannel(
@@ -1969,20 +1969,20 @@
   loop2->OnRun([&]() {
     EXPECT_TRUE(sender->Send(kMessage.span().data(), kMessage.span().size(),
                              monotonic_remote_time, realtime_remote_time,
-                             remote_queue_index, remote_boot_uuid));
+                             remote_queue_index, source_boot_uuid));
   });
 
   bool happened = false;
   loop2->MakeRawWatcher(
       configuration::GetChannel(loop2->configuration(), "/test",
                                 "aos.TestMessage", "", nullptr),
-      [this, monotonic_remote_time, realtime_remote_time, remote_boot_uuid,
+      [this, monotonic_remote_time, realtime_remote_time, source_boot_uuid,
        remote_queue_index, &fetcher,
        &happened](const Context &context, const void * /*message*/) {
         happened = true;
         EXPECT_EQ(monotonic_remote_time, context.monotonic_remote_time);
         EXPECT_EQ(realtime_remote_time, context.realtime_remote_time);
-        EXPECT_EQ(remote_boot_uuid, context.remote_boot_uuid);
+        EXPECT_EQ(source_boot_uuid, context.source_boot_uuid);
         EXPECT_EQ(remote_queue_index, context.remote_queue_index);
 
         ASSERT_TRUE(fetcher->Fetch());
@@ -2212,6 +2212,35 @@
   Run();
 }
 
+// Tests that event loop's context's monotonic time is set to a value on OnRun.
+TEST_P(AbstractEventLoopTest, SetContextOnRun) {
+  auto loop = MakePrimary();
+
+  // We want to check that monotonic event time is before monotonic now
+  // called inside of callback, but after time point obtained callback.
+  aos::monotonic_clock::time_point monotonic_event_time_on_run;
+
+  loop->OnRun([&]() {
+    monotonic_event_time_on_run = loop->context().monotonic_event_time;
+    EXPECT_LE(monotonic_event_time_on_run, loop->monotonic_now());
+    EXPECT_EQ(loop->context().monotonic_remote_time, monotonic_clock::min_time);
+    EXPECT_EQ(loop->context().realtime_event_time, realtime_clock::min_time);
+    EXPECT_EQ(loop->context().realtime_remote_time, realtime_clock::min_time);
+    EXPECT_EQ(loop->context().source_boot_uuid, loop->boot_uuid());
+    EXPECT_EQ(loop->context().queue_index, 0xffffffffu);
+    EXPECT_EQ(loop->context().size, 0u);
+    EXPECT_EQ(loop->context().data, nullptr);
+    EXPECT_EQ(loop->context().buffer_index, -1);
+  });
+
+  EndEventLoop(loop.get(), ::std::chrono::milliseconds(200));
+
+  const aos::monotonic_clock::time_point before_run_time =
+      loop->monotonic_now();
+  Run();
+  EXPECT_GE(monotonic_event_time_on_run, before_run_time);
+}
+
 // Tests that watchers fail when created on the wrong node.
 TEST_P(AbstractEventLoopDeathTest, NodeWatcher) {
   EnableNodes("them");
diff --git a/aos/events/event_loop_tmpl.h b/aos/events/event_loop_tmpl.h
index e4e879f..c509170 100644
--- a/aos/events/event_loop_tmpl.h
+++ b/aos/events/event_loop_tmpl.h
@@ -182,15 +182,7 @@
   CHECK_NOTNULL(timing_.timer);
   const monotonic_clock::time_point monotonic_start_time = get_time();
 
-  event_loop_->context_.monotonic_event_time = event_time;
-  event_loop_->context_.monotonic_remote_time = monotonic_clock::min_time;
-  event_loop_->context_.realtime_remote_time =
-      event_loop_->context_.realtime_event_time = realtime_clock::min_time;
-  event_loop_->context_.queue_index = 0xffffffffu;
-  event_loop_->context_.size = 0;
-  event_loop_->context_.data = nullptr;
-  event_loop_->context_.buffer_index = -1;
-  event_loop_->context_.remote_boot_uuid = event_loop_->boot_uuid();
+  event_loop_->SetTimerContext(event_time);
 
   ftrace_.FormatMessage(
       "timer: %.*s: start now=%" PRId64 " event=%" PRId64,
@@ -228,15 +220,7 @@
   const monotonic_clock::time_point monotonic_start_time = get_time();
 
   // Update the context to hold the desired wakeup time.
-  event_loop_->context_.monotonic_event_time = phased_loop_.sleep_time();
-  event_loop_->context_.monotonic_remote_time = monotonic_clock::min_time;
-  event_loop_->context_.realtime_remote_time =
-      event_loop_->context_.realtime_event_time = realtime_clock::min_time;
-  event_loop_->context_.queue_index = 0xffffffffu;
-  event_loop_->context_.size = 0;
-  event_loop_->context_.data = nullptr;
-  event_loop_->context_.buffer_index = -1;
-  event_loop_->context_.remote_boot_uuid = event_loop_->boot_uuid();
+  event_loop_->SetTimerContext(phased_loop_.sleep_time());
 
   // Compute how many cycles elapsed
   cycles_elapsed_ += phased_loop_.Iterate(monotonic_start_time);
diff --git a/aos/events/logging/log_writer.cc b/aos/events/logging/log_writer.cc
index 6630441..abae9a1 100644
--- a/aos/events/logging/log_writer.cc
+++ b/aos/events/logging/log_writer.cc
@@ -713,7 +713,7 @@
         if (our_node_index != f.data_node_index) {
           // And update our boot UUID if the UUID has changed.
           if (node_state_[f.data_node_index].SetBootUUID(
-                  f.fetcher->context().remote_boot_uuid)) {
+                  f.fetcher->context().source_boot_uuid)) {
             MaybeWriteHeader(f.data_node_index);
           }
         }
diff --git a/aos/events/shm_event_loop.cc b/aos/events/shm_event_loop.cc
index 835210c..c70fef6 100644
--- a/aos/events/shm_event_loop.cc
+++ b/aos/events/shm_event_loop.cc
@@ -372,7 +372,7 @@
         queue_index.index(), &context_.monotonic_event_time,
         &context_.realtime_event_time, &context_.monotonic_remote_time,
         &context_.realtime_remote_time, &context_.remote_queue_index,
-        &context_.remote_boot_uuid, &context_.size, copy_buffer);
+        &context_.source_boot_uuid, &context_.size, copy_buffer);
 
     if (read_result == ipc_lib::LocklessQueueReader::Result::GOOD) {
       if (pin_data()) {
@@ -551,14 +551,14 @@
               aos::monotonic_clock::time_point monotonic_remote_time,
               aos::realtime_clock::time_point realtime_remote_time,
               uint32_t remote_queue_index,
-              const UUID &remote_boot_uuid) override {
+              const UUID &source_boot_uuid) override {
     shm_event_loop()->CheckCurrentThread();
     CHECK_LE(length, static_cast<size_t>(channel()->max_size()))
         << ": Sent too big a message on "
         << configuration::CleanedChannelToString(channel());
     CHECK(lockless_queue_sender_.Send(length, monotonic_remote_time,
                                       realtime_remote_time, remote_queue_index,
-                                      remote_boot_uuid, &monotonic_sent_time_,
+                                      source_boot_uuid, &monotonic_sent_time_,
                                       &realtime_sent_time_, &sent_queue_index_))
         << ": Somebody wrote outside the buffer of their message on channel "
         << configuration::CleanedChannelToString(channel());
@@ -572,14 +572,14 @@
               aos::monotonic_clock::time_point monotonic_remote_time,
               aos::realtime_clock::time_point realtime_remote_time,
               uint32_t remote_queue_index,
-              const UUID &remote_boot_uuid) override {
+              const UUID &source_boot_uuid) override {
     shm_event_loop()->CheckCurrentThread();
     CHECK_LE(length, static_cast<size_t>(channel()->max_size()))
         << ": Sent too big a message on "
         << configuration::CleanedChannelToString(channel());
     CHECK(lockless_queue_sender_.Send(
         reinterpret_cast<const char *>(msg), length, monotonic_remote_time,
-        realtime_remote_time, remote_queue_index, remote_boot_uuid,
+        realtime_remote_time, remote_queue_index, source_boot_uuid,
         &monotonic_sent_time_, &realtime_sent_time_, &sent_queue_index_))
         << ": Somebody wrote outside the buffer of their message on channel "
         << configuration::CleanedChannelToString(channel());
@@ -1118,6 +1118,7 @@
     }
 
     // Now that we are RT, run all the OnRun handlers.
+    SetTimerContext(monotonic_clock::now());
     for (const auto &run : on_run_) {
       run();
     }
diff --git a/aos/events/simulated_event_loop.cc b/aos/events/simulated_event_loop.cc
index 51021b6..4dc37fa 100644
--- a/aos/events/simulated_event_loop.cc
+++ b/aos/events/simulated_event_loop.cc
@@ -295,13 +295,13 @@
               aos::monotonic_clock::time_point monotonic_remote_time,
               aos::realtime_clock::time_point realtime_remote_time,
               uint32_t remote_queue_index,
-              const UUID &remote_boot_uuid) override;
+              const UUID &source_boot_uuid) override;
 
   bool DoSend(const void *msg, size_t size,
               aos::monotonic_clock::time_point monotonic_remote_time,
               aos::realtime_clock::time_point realtime_remote_time,
               uint32_t remote_queue_index,
-              const UUID &remote_boot_uuid) override;
+              const UUID &source_boot_uuid) override;
 
   int buffer_index() override {
     // First, ensure message_ is allocated.
@@ -542,6 +542,7 @@
     CHECK(!is_running()) << ": Cannot register OnRun callback while running.";
     scheduler_->ScheduleOnRun([this, on_run = std::move(on_run)]() {
       ScopedMarkRealtimeRestorer rt(priority() > 0);
+      SetTimerContext(monotonic_now());
       on_run();
     });
   }
@@ -852,7 +853,7 @@
                              monotonic_clock::time_point monotonic_remote_time,
                              realtime_clock::time_point realtime_remote_time,
                              uint32_t remote_queue_index,
-                             const UUID &remote_boot_uuid) {
+                             const UUID &source_boot_uuid) {
   // The allocations in here are due to infrastructure and don't count in the
   // no mallocs in RT code.
   ScopedNotRealtime nrt;
@@ -862,7 +863,7 @@
   message_->context.remote_queue_index = remote_queue_index;
   message_->context.realtime_event_time = event_loop_->realtime_now();
   message_->context.realtime_remote_time = realtime_remote_time;
-  message_->context.remote_boot_uuid = remote_boot_uuid;
+  message_->context.source_boot_uuid = source_boot_uuid;
   CHECK_LE(length, message_->context.size);
   message_->context.size = length;
 
@@ -882,7 +883,7 @@
                              monotonic_clock::time_point monotonic_remote_time,
                              realtime_clock::time_point realtime_remote_time,
                              uint32_t remote_queue_index,
-                             const UUID &remote_boot_uuid) {
+                             const UUID &source_boot_uuid) {
   CHECK_LE(size, this->size())
       << ": Attempting to send too big a message on "
       << configuration::CleanedChannelToString(simulated_channel_->channel());
@@ -899,7 +900,7 @@
          msg, size);
 
   return DoSend(size, monotonic_remote_time, realtime_remote_time,
-                remote_queue_index, remote_boot_uuid);
+                remote_queue_index, source_boot_uuid);
 }
 
 SimulatedTimerHandler::SimulatedTimerHandler(
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index 7191365..4cb51de 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -1492,13 +1492,13 @@
   pi1_remote_timestamp->MakeWatcher(
       "/pi2/aos", [&expected_boot_uuid,
                    &pi1_remote_timestamp](const message_bridge::Timestamp &) {
-        EXPECT_EQ(pi1_remote_timestamp->context().remote_boot_uuid,
+        EXPECT_EQ(pi1_remote_timestamp->context().source_boot_uuid,
                   expected_boot_uuid);
       });
   pi1_remote_timestamp->MakeWatcher(
       "/test",
       [&expected_boot_uuid, &pi1_remote_timestamp](const examples::Pong &) {
-        EXPECT_EQ(pi1_remote_timestamp->context().remote_boot_uuid,
+        EXPECT_EQ(pi1_remote_timestamp->context().source_boot_uuid,
                   expected_boot_uuid);
       });
   pi1_remote_timestamp->MakeWatcher(
diff --git a/aos/events/simulated_network_bridge.cc b/aos/events/simulated_network_bridge.cc
index 40b468f..11e8c56 100644
--- a/aos/events/simulated_network_bridge.cc
+++ b/aos/events/simulated_network_bridge.cc
@@ -137,7 +137,7 @@
                   fetcher_->context().monotonic_event_time,
                   fetcher_->context().realtime_event_time,
                   fetcher_->context().queue_index,
-                  fetcher_->context().remote_boot_uuid);
+                  fetcher_->context().source_boot_uuid);
 
     // And simulate message_bridge's offset recovery.
     client_status_->SampleFilter(client_index_,