Add set_name to event_loop.

Change-Id: I2ab1486eb8a348ceeec00ab170e2474d7fe25167
diff --git a/aos/events/raw-event-loop.h b/aos/events/raw-event-loop.h
index 6ff7179..7ab2810 100644
--- a/aos/events/raw-event-loop.h
+++ b/aos/events/raw-event-loop.h
@@ -138,6 +138,9 @@
   // Use this to run code once the thread goes into "real-time-mode",
   virtual void OnRun(::std::function<void()> on_run) = 0;
 
+  // Sets the name of the event loop.
+  virtual void set_name(const char *name) = 0;
+
   // Threadsafe.
   bool is_running() const { return is_running_.load(); }
 
diff --git a/aos/events/shm-event-loop.cc b/aos/events/shm-event-loop.cc
index 8c0f3a2..eead9f5 100644
--- a/aos/events/shm-event-loop.cc
+++ b/aos/events/shm-event-loop.cc
@@ -181,6 +181,8 @@
 
   // Runs the watcher callback on new messages.
   void Run() {
+    ::aos::SetCurrentThreadName(thread_state_->name() + ".watcher");
+
     // Signal the main thread that we are now ready.
     thread_state_->MaybeSetCurrentThreadRealtimePriority();
     {
@@ -396,12 +398,16 @@
   on_run_.push_back(::std::move(on_run));
 }
 
+void ShmEventLoop::set_name(const char *name) { thread_state_.name_ = name; }
+
 void ShmEventLoop::Run() {
   // Start all the watcher threads.
   for (::std::unique_ptr<internal::WatcherThreadState> &watcher : watchers_) {
     watcher->Start();
   }
 
+  ::aos::SetCurrentThreadName(thread_state_.name());
+
   // Now, all the threads are up.  Go RT.
   thread_state_.MaybeSetCurrentThreadRealtimePriority();
   set_is_running(true);
diff --git a/aos/events/shm-event-loop.h b/aos/events/shm-event-loop.h
index 91ca342..24cd909 100644
--- a/aos/events/shm-event-loop.h
+++ b/aos/events/shm-event-loop.h
@@ -62,6 +62,8 @@
     thread_state_.priority_ = priority;
   }
 
+  void set_name(const char *name) override;
+
  private:
   friend class internal::WatcherThreadState;
   friend class internal::TimerHandlerState;
@@ -82,6 +84,8 @@
 
     void MaybeSetCurrentThreadRealtimePriority();
 
+    const ::std::string &name() const { return name_; }
+
    private:
     friend class internal::WatcherThreadState;
     friend class internal::TimerHandlerState;
@@ -96,6 +100,9 @@
     ::std::atomic<bool> loop_running_{false};
     bool loop_finished_ = false;
     int priority_ = -1;
+
+    // Immutable after Start is called.
+    ::std::string name_;
   };
 
   // Tracks that we can't have multiple watchers or a sender and a watcher (or
diff --git a/aos/events/simulated-event-loop.cc b/aos/events/simulated-event-loop.cc
index 94cf67a..71b0c79 100644
--- a/aos/events/simulated-event-loop.cc
+++ b/aos/events/simulated-event-loop.cc
@@ -239,6 +239,8 @@
     scheduler_->Exit();
   }
 
+  void set_name(const char *name) override { name_ = name; }
+
   SimulatedQueue *GetSimulatedQueue(
       const ::std::pair<::std::string, QueueTypeInfo> &);
 
@@ -257,6 +259,8 @@
   ::std::vector<std::string> taken_;
   ::std::vector<std::unique_ptr<TimerHandler>> timers_;
   ::std::vector<std::unique_ptr<PhasedLoopHandler>> phased_loops_;
+
+  ::std::string name_;
 };
 
 EventScheduler::Token EventScheduler::Schedule(