Require a name when making a simulated event loop

We need application names for both timing reports and for maps.  So,
lets require the names everywhere.

Change-Id: I82bf63e2500d0552bc0bb01380f67c5328e9b201
diff --git a/aos/actions/action_test.cc b/aos/actions/action_test.cc
index aa0e6d2..fa1a347 100644
--- a/aos/actions/action_test.cc
+++ b/aos/actions/action_test.cc
@@ -102,9 +102,9 @@
       : configuration_(
             configuration::ReadConfig("aos/actions/action_test_config.json")),
         event_loop_factory_(&configuration_.message()),
-        actor1_event_loop_(event_loop_factory_.MakeEventLoop()),
-        actor2_event_loop_(event_loop_factory_.MakeEventLoop()),
-        test_event_loop_(event_loop_factory_.MakeEventLoop()) {
+        actor1_event_loop_(event_loop_factory_.MakeEventLoop("actor1")),
+        actor2_event_loop_(event_loop_factory_.MakeEventLoop("actor2")),
+        test_event_loop_(event_loop_factory_.MakeEventLoop("test")) {
     ::aos::testing::EnableTestLogging();
   }
 
@@ -132,7 +132,7 @@
 // cancel message.
 TEST_F(ActionTest, StartWithOldGoal) {
   ::std::unique_ptr<::aos::EventLoop> test2_event_loop =
-      event_loop_factory_.MakeEventLoop();
+      event_loop_factory_.MakeEventLoop("test2");
   ::aos::Sender<TestActionGoal> goal_sender =
       test2_event_loop->MakeSender<TestActionGoal>("/test_action");
   ::aos::Fetcher<Status> status_fetcher =
diff --git a/aos/controls/control_loop_test.h b/aos/controls/control_loop_test.h
index 6a8e975..a0a844f 100644
--- a/aos/controls/control_loop_test.h
+++ b/aos/controls/control_loop_test.h
@@ -2,6 +2,7 @@
 #define AOS_CONTROLS_CONTROL_LOOP_TEST_H_
 
 #include <chrono>
+#include <string_view>
 
 #include "gtest/gtest.h"
 
@@ -40,7 +41,7 @@
       : configuration_(std::move(configuration)),
         event_loop_factory_(&configuration_.message()),
         dt_(dt),
-        robot_status_event_loop_(MakeEventLoop()) {
+        robot_status_event_loop_(MakeEventLoop("robot_status")) {
     testing::EnableTestLogging();
     robot_state_sender_ =
         robot_status_event_loop_->MakeSender<::aos::RobotState>("/aos");
@@ -88,8 +89,8 @@
     battery_voltage_ = battery_voltage;
   }
 
-  ::std::unique_ptr<::aos::EventLoop> MakeEventLoop() {
-    return event_loop_factory_.MakeEventLoop();
+  ::std::unique_ptr<::aos::EventLoop> MakeEventLoop(std::string_view name) {
+    return event_loop_factory_.MakeEventLoop(name);
   }
 
   void RunFor(monotonic_clock::duration duration) {
diff --git a/aos/events/event_loop_param_test.h b/aos/events/event_loop_param_test.h
index fb08ac3..8a8f33a 100644
--- a/aos/events/event_loop_param_test.h
+++ b/aos/events/event_loop_param_test.h
@@ -1,6 +1,7 @@
 #ifndef _AOS_EVENTS_EVENT_LOOP_PARAM_TEST_H_
 #define _AOS_EVENTS_EVENT_LOOP_PARAM_TEST_H_
 
+#include <string_view>
 #include <vector>
 
 #include "aos/events/event_loop.h"
@@ -35,10 +36,10 @@
   virtual ~EventLoopTestFactory() {}
 
   // Makes a connected event loop.
-  virtual std::unique_ptr<EventLoop> Make() = 0;
+  virtual std::unique_ptr<EventLoop> Make(std::string_view name) = 0;
   // Makes a primary event loop.  This is the one the tests will try to use for
   // anything blocking.
-  virtual std::unique_ptr<EventLoop> MakePrimary() = 0;
+  virtual std::unique_ptr<EventLoop> MakePrimary(std::string_view name) = 0;
 
   // Runs the loops until they quit.
   virtual void Run() = 0;
@@ -60,8 +61,19 @@
  public:
   AbstractEventLoopTestBase() { factory_.reset(GetParam()()); }
 
-  ::std::unique_ptr<EventLoop> Make() { return factory_->Make(); }
-  ::std::unique_ptr<EventLoop> MakePrimary() { return factory_->MakePrimary(); }
+  ::std::unique_ptr<EventLoop> Make(std::string_view name = "") {
+    std::string name_copy(name);
+    if (name == "") {
+      name_copy = "loop";
+      name_copy += std::to_string(event_loop_count_);
+    }
+    ++event_loop_count_;
+    return factory_->Make(name_copy);
+  }
+  ::std::unique_ptr<EventLoop> MakePrimary(std::string_view name = "primary") {
+    ++event_loop_count_;
+    return factory_->MakePrimary(name);
+  }
 
   void Run() { return factory_->Run(); }
 
@@ -83,6 +95,8 @@
   // TestWithParam<T>.
  private:
   ::std::unique_ptr<EventLoopTestFactory> factory_;
+
+  int event_loop_count_ = 0;
 };
 
 typedef AbstractEventLoopTestBase AbstractEventLoopDeathTest;
diff --git a/aos/events/logger_test.cc b/aos/events/logger_test.cc
index 71c640d..e0dd7de 100644
--- a/aos/events/logger_test.cc
+++ b/aos/events/logger_test.cc
@@ -19,9 +19,9 @@
       : config_(
             aos::configuration::ReadConfig("aos/events/pingpong_config.json")),
         event_loop_factory_(&config_.message()),
-        ping_event_loop_(event_loop_factory_.MakeEventLoop()),
+        ping_event_loop_(event_loop_factory_.MakeEventLoop("ping")),
         ping_(ping_event_loop_.get()),
-        pong_event_loop_(event_loop_factory_.MakeEventLoop()),
+        pong_event_loop_(event_loop_factory_.MakeEventLoop("pong")),
         pong_(pong_event_loop_.get()) {}
 
   // Config and factory.
@@ -50,7 +50,7 @@
   {
     DetachedBufferWriter writer(logfile);
     std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop();
+        event_loop_factory_.MakeEventLoop("logger");
 
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
@@ -69,7 +69,7 @@
   // knows about the factory.
   SimulatedEventLoopFactory log_reader_factory(reader.configuration());
   std::unique_ptr<EventLoop> reader_event_loop =
-      log_reader_factory.MakeEventLoop();
+      log_reader_factory.MakeEventLoop("log_reader");
 
   reader.Register(reader_event_loop.get());
 
@@ -80,7 +80,7 @@
                                     log_reader.realtime_start_time());
                                     */
   std::unique_ptr<EventLoop> test_event_loop =
-      log_reader_factory.MakeEventLoop();
+      log_reader_factory.MakeEventLoop("log_reader");
 
   int ping_count = 10;
   int pong_count = 10;
diff --git a/aos/events/pingpong_test.cc b/aos/events/pingpong_test.cc
index 0bc1f88..fca1867 100644
--- a/aos/events/pingpong_test.cc
+++ b/aos/events/pingpong_test.cc
@@ -16,9 +16,9 @@
       : config_(aos::configuration::ReadConfig(
             "aos/events/pingpong_config.json")),
         event_loop_factory_(&config_.message()),
-        ping_event_loop_(event_loop_factory_.MakeEventLoop()),
+        ping_event_loop_(event_loop_factory_.MakeEventLoop("ping")),
         ping_(ping_event_loop_.get()),
-        pong_event_loop_(event_loop_factory_.MakeEventLoop()),
+        pong_event_loop_(event_loop_factory_.MakeEventLoop("pong")),
         pong_(pong_event_loop_.get()) {}
 
   // Config and factory.
@@ -50,7 +50,7 @@
 // Tests that the number of pong messages matches the number of ping messages.
 TEST_F(PingPongTest, AlwaysReplies) {
   std::unique_ptr<EventLoop> test_event_loop =
-      event_loop_factory_.MakeEventLoop();
+      event_loop_factory_.MakeEventLoop("test");
 
   int ping_count = 0;
   int pong_count = 0;
diff --git a/aos/events/shm_event_loop_test.cc b/aos/events/shm_event_loop_test.cc
index 16ac08c..ba0b80d 100644
--- a/aos/events/shm_event_loop_test.cc
+++ b/aos/events/shm_event_loop_test.cc
@@ -1,5 +1,7 @@
 #include "aos/events/shm_event_loop.h"
 
+#include <string_view>
+
 #include "aos/events/event_loop_param_test.h"
 #include "glog/logging.h"
 #include "gtest/gtest.h"
@@ -30,15 +32,18 @@
     unlink((FLAGS_shm_base + "/test2/aos.TestMessage.v0").c_str());
   }
 
-  ::std::unique_ptr<EventLoop> Make() override {
-    return ::std::unique_ptr<EventLoop>(new ShmEventLoop(configuration()));
+  ::std::unique_ptr<EventLoop> Make(std::string_view name) override {
+    ::std::unique_ptr<EventLoop> loop(new ShmEventLoop(configuration()));
+    loop->set_name(name);
+    return loop;
   }
 
-  ::std::unique_ptr<EventLoop> MakePrimary() override {
+  ::std::unique_ptr<EventLoop> MakePrimary(std::string_view name) override {
     ::std::unique_ptr<ShmEventLoop> loop =
         ::std::unique_ptr<ShmEventLoop>(new ShmEventLoop(configuration()));
     primary_event_loop_ = loop.get();
-    return ::std::move(loop);
+    loop->set_name(name);
+    return std::move(loop);
   }
 
   void Run() override { CHECK_NOTNULL(primary_event_loop_)->Run(); }
@@ -77,8 +82,8 @@
 // involved and it's easy to miss one.
 TEST(ShmEventLoopTest, AllHandlersAreRealtime) {
   ShmEventLoopTestFactory factory;
-  auto loop = factory.MakePrimary();
-  auto loop2 = factory.Make();
+  auto loop = factory.MakePrimary("primary");
+  auto loop2 = factory.Make("loop2");
 
   loop->SetRuntimeRealtimePriority(1);
 
@@ -121,7 +126,7 @@
 // running at the right offset.
 TEST(ShmEventLoopTest, DelayedPhasedLoop) {
   ShmEventLoopTestFactory factory;
-  auto loop1 = factory.MakePrimary();
+  auto loop1 = factory.MakePrimary("primary");
 
   ::std::vector<::aos::monotonic_clock::time_point> times;
 
diff --git a/aos/events/simulated_event_loop.cc b/aos/events/simulated_event_loop.cc
index 3f6abd3..4819141 100644
--- a/aos/events/simulated_event_loop.cc
+++ b/aos/events/simulated_event_loop.cc
@@ -2,6 +2,7 @@
 
 #include <algorithm>
 #include <deque>
+#include <string_view>
 
 #include "absl/container/btree_map.h"
 #include "absl/container/btree_set.h"
@@ -60,7 +61,7 @@
 
   size_t max_size() const { return channel_.message().max_size(); }
 
-  const absl::string_view name() const {
+  const std::string_view name() const {
     return channel_.message().name()->string_view();
   }
 
@@ -510,9 +511,12 @@
     : configuration_(configuration) {}
 SimulatedEventLoopFactory::~SimulatedEventLoopFactory() {}
 
-::std::unique_ptr<EventLoop> SimulatedEventLoopFactory::MakeEventLoop() {
-  return ::std::unique_ptr<EventLoop>(new SimulatedEventLoop(
+::std::unique_ptr<EventLoop> SimulatedEventLoopFactory::MakeEventLoop(
+    std::string_view name) {
+  ::std::unique_ptr<EventLoop> result(new SimulatedEventLoop(
       &scheduler_, &channels_, configuration_, &raw_event_loops_));
+  result->set_name(name);
+  return result;
 }
 
 void SimulatedEventLoopFactory::RunFor(monotonic_clock::duration duration) {
diff --git a/aos/events/simulated_event_loop.h b/aos/events/simulated_event_loop.h
index 485ab68..0550204 100644
--- a/aos/events/simulated_event_loop.h
+++ b/aos/events/simulated_event_loop.h
@@ -4,6 +4,7 @@
 #include <algorithm>
 #include <map>
 #include <memory>
+#include <string_view>
 #include <unordered_set>
 #include <utility>
 #include <vector>
@@ -53,7 +54,7 @@
   SimulatedEventLoopFactory(const Configuration *configuration);
   ~SimulatedEventLoopFactory();
 
-  ::std::unique_ptr<EventLoop> MakeEventLoop();
+  ::std::unique_ptr<EventLoop> MakeEventLoop(std::string_view name);
 
   // Starts executing the event loops unconditionally.
   void Run();
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index 356c25b..b2eb634 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -1,5 +1,7 @@
 #include "aos/events/simulated_event_loop.h"
 
+#include <string_view>
+
 #include "aos/events/event_loop_param_test.h"
 #include "gtest/gtest.h"
 
@@ -12,11 +14,11 @@
  public:
   SimulatedEventLoopTestFactory() : event_loop_factory_(configuration()) {}
 
-  ::std::unique_ptr<EventLoop> Make() override {
-    return event_loop_factory_.MakeEventLoop();
+  ::std::unique_ptr<EventLoop> Make(std::string_view name) override {
+    return event_loop_factory_.MakeEventLoop(name);
   }
-  ::std::unique_ptr<EventLoop> MakePrimary() override {
-    return event_loop_factory_.MakeEventLoop();
+  ::std::unique_ptr<EventLoop> MakePrimary(std::string_view name) override {
+    return event_loop_factory_.MakeEventLoop(name);
   }
 
   void Run() override { event_loop_factory_.Run(); }
@@ -73,7 +75,7 @@
 TEST(SimulatedEventLoopTest, RunForNoHandlers) {
   SimulatedEventLoopFactory simulated_event_loop_factory(nullptr);
   ::std::unique_ptr<EventLoop> event_loop =
-      simulated_event_loop_factory.MakeEventLoop();
+      simulated_event_loop_factory.MakeEventLoop("loop");
 
   simulated_event_loop_factory.RunFor(chrono::seconds(1));
 
@@ -88,7 +90,7 @@
 TEST(SimulatedEventLoopTest, RunForTimerHandler) {
   SimulatedEventLoopFactory simulated_event_loop_factory(nullptr);
   ::std::unique_ptr<EventLoop> event_loop =
-      simulated_event_loop_factory.MakeEventLoop();
+      simulated_event_loop_factory.MakeEventLoop("loop");
 
   int counter = 0;
   auto timer = event_loop->AddTimer([&counter]() { ++counter; });
diff --git a/frc971/codelab/basic_test.cc b/frc971/codelab/basic_test.cc
index 487a09b..ad526b7 100644
--- a/frc971/codelab/basic_test.cc
+++ b/frc971/codelab/basic_test.cc
@@ -111,13 +111,13 @@
             "  ]\n"
             "}\n",
             chrono::microseconds(5050)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         goal_sender_(test_event_loop_->MakeSender<Goal>("/codelab")),
 
-        basic_event_loop_(MakeEventLoop()),
+        basic_event_loop_(MakeEventLoop("basic")),
         basic_(basic_event_loop_.get(), "/codelab"),
 
-        basic_simulation_event_loop_(MakeEventLoop()),
+        basic_simulation_event_loop_(MakeEventLoop("simulation")),
         basic_simulation_(basic_simulation_event_loop_.get(), dt()) {
     set_team_id(control_loops::testing::kTeamNumber);
   }
diff --git a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
index a46defd..b2a533e 100644
--- a/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
+++ b/frc971/control_loops/drivetrain/drivetrain_lib_test.cc
@@ -36,7 +36,7 @@
             aos::configuration::ReadConfig(
                 "frc971/control_loops/drivetrain/config.json"),
             GetTestDrivetrainConfig().dt),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         drivetrain_goal_sender_(
             test_event_loop_->MakeSender<Goal>("/drivetrain")),
         drivetrain_goal_fetcher_(
@@ -47,11 +47,11 @@
             test_event_loop_->MakeFetcher<Output>("/drivetrain")),
         localizer_control_sender_(
             test_event_loop_->MakeSender<LocalizerControl>("/drivetrain")),
-        drivetrain_event_loop_(MakeEventLoop()),
+        drivetrain_event_loop_(MakeEventLoop("drivetrain")),
         dt_config_(GetTestDrivetrainConfig()),
         localizer_(drivetrain_event_loop_.get(), dt_config_),
         drivetrain_(dt_config_, drivetrain_event_loop_.get(), &localizer_),
-        drivetrain_plant_event_loop_(MakeEventLoop()),
+        drivetrain_plant_event_loop_(MakeEventLoop("drivetrain_plant")),
         drivetrain_plant_(drivetrain_plant_event_loop_.get(), dt_config_) {
     set_battery_voltage(12.0);
   }
diff --git a/frc971/control_loops/static_zeroing_single_dof_profiled_subsystem_test.cc b/frc971/control_loops/static_zeroing_single_dof_profiled_subsystem_test.cc
index 46e9c76..ffea935 100644
--- a/frc971/control_loops/static_zeroing_single_dof_profiled_subsystem_test.cc
+++ b/frc971/control_loops/static_zeroing_single_dof_profiled_subsystem_test.cc
@@ -374,15 +374,15 @@
             "  ]\n"
             "}\n",
             chrono::microseconds(5050)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         subsystem_goal_sender_(test_event_loop_->MakeSender<GoalType>("/loop")),
         subsystem_goal_fetcher_(
             test_event_loop_->MakeFetcher<GoalType>("/loop")),
         subsystem_status_fetcher_(
             test_event_loop_->MakeFetcher<StatusType>("/loop")),
-        subsystem_event_loop_(MakeEventLoop()),
+        subsystem_event_loop_(MakeEventLoop("subsystem")),
         subsystem_(subsystem_event_loop_.get(), "/loop"),
-        subsystem_plant_event_loop_(MakeEventLoop()),
+        subsystem_plant_event_loop_(MakeEventLoop("plant")),
         subsystem_plant_(subsystem_plant_event_loop_.get(), dt()) {}
 
   void VerifyNearGoal() {
diff --git a/frc971/wpilib/loop_output_handler_test.cc b/frc971/wpilib/loop_output_handler_test.cc
index d7ef8cd..f1d403c 100644
--- a/frc971/wpilib/loop_output_handler_test.cc
+++ b/frc971/wpilib/loop_output_handler_test.cc
@@ -36,8 +36,9 @@
                     "}\n",
                     aos::Configuration::MiniReflectTypeTable())))),
         event_loop_factory_(&configuration_.message()),
-        loop_output_hander_event_loop_(event_loop_factory_.MakeEventLoop()),
-        test_event_loop_(event_loop_factory_.MakeEventLoop()) {
+        loop_output_hander_event_loop_(
+            event_loop_factory_.MakeEventLoop("output")),
+        test_event_loop_(event_loop_factory_.MakeEventLoop("test")) {
     ::aos::testing::EnableTestLogging();
   }
 
diff --git a/y2014/control_loops/claw/claw_lib_test.cc b/y2014/control_loops/claw/claw_lib_test.cc
index 55e186e..1d89518 100644
--- a/y2014/control_loops/claw/claw_lib_test.cc
+++ b/y2014/control_loops/claw/claw_lib_test.cc
@@ -292,12 +292,12 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2014/config.json"),
             chrono::microseconds(5000)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         claw_goal_sender_(test_event_loop_->MakeSender<Goal>("/claw")),
         claw_goal_fetcher_(test_event_loop_->MakeFetcher<Goal>("/claw")),
-        claw_event_loop_(MakeEventLoop()),
+        claw_event_loop_(MakeEventLoop("claw")),
         claw_motor_(claw_event_loop_.get()),
-        claw_plant_event_loop_(MakeEventLoop()),
+        claw_plant_event_loop_(MakeEventLoop("plant")),
         claw_motor_plant_(claw_plant_event_loop_.get(), dt(), 0.4, 0.2),
         min_separation_(constants::GetValues().claw.claw_min_separation) {}
 
diff --git a/y2014/control_loops/shooter/shooter_lib_test.cc b/y2014/control_loops/shooter/shooter_lib_test.cc
index ad24cf9..7512d6b 100644
--- a/y2014/control_loops/shooter/shooter_lib_test.cc
+++ b/y2014/control_loops/shooter/shooter_lib_test.cc
@@ -334,12 +334,12 @@
             aos::configuration::ReadConfig("y2014/config.json"),
             // TODO(austin): I think this runs at 5 ms in real life.
             chrono::microseconds(5000)),
-        test_event_loop_(this->MakeEventLoop()),
+        test_event_loop_(this->MakeEventLoop("test")),
         shooter_goal_fetcher_(test_event_loop_->MakeFetcher<Goal>("/shooter")),
         shooter_goal_sender_(test_event_loop_->MakeSender<Goal>("/shooter")),
-        shooter_event_loop_(this->MakeEventLoop()),
+        shooter_event_loop_(this->MakeEventLoop("shooter")),
         shooter_motor_(shooter_event_loop_.get()),
-        shooter_plant_event_loop_(this->MakeEventLoop()),
+        shooter_plant_event_loop_(this->MakeEventLoop("plant")),
         shooter_motor_plant_(shooter_plant_event_loop_.get(), this->dt(), 0.2) {
   }
 
diff --git a/y2016/control_loops/shooter/shooter_lib_test.cc b/y2016/control_loops/shooter/shooter_lib_test.cc
index b432049..6b3e2d6 100644
--- a/y2016/control_loops/shooter/shooter_lib_test.cc
+++ b/y2016/control_loops/shooter/shooter_lib_test.cc
@@ -122,16 +122,16 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2016/config.json"),
             chrono::microseconds(5000)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         shooter_goal_fetcher_(test_event_loop_->MakeFetcher<Goal>("/shooter")),
         shooter_goal_sender_(test_event_loop_->MakeSender<Goal>("/shooter")),
         shooter_status_fetcher_(
             test_event_loop_->MakeFetcher<Status>("/shooter")),
         shooter_output_fetcher_(
             test_event_loop_->MakeFetcher<Output>("/shooter")),
-        shooter_event_loop_(MakeEventLoop()),
+        shooter_event_loop_(MakeEventLoop("shooter")),
         shooter_(shooter_event_loop_.get()),
-        shooter_plant_event_loop_(MakeEventLoop()),
+        shooter_plant_event_loop_(MakeEventLoop("plant")),
         shooter_plant_(shooter_plant_event_loop_.get(), dt()) {
     set_team_id(kTeamNumber);
   }
diff --git a/y2016/control_loops/superstructure/superstructure_lib_test.cc b/y2016/control_loops/superstructure/superstructure_lib_test.cc
index d530cb3..24bc187 100644
--- a/y2016/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2016/control_loops/superstructure/superstructure_lib_test.cc
@@ -356,16 +356,16 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2016/config.json"),
             chrono::microseconds(5000)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         superstructure_goal_fetcher_(
             test_event_loop_->MakeFetcher<Goal>("/superstructure")),
         superstructure_goal_sender_(
             test_event_loop_->MakeSender<Goal>("/superstructure")),
         superstructure_status_fetcher_(
             test_event_loop_->MakeFetcher<Status>("/superstructure")),
-        superstructure_event_loop_(MakeEventLoop()),
+        superstructure_event_loop_(MakeEventLoop("superstructure")),
         superstructure_(superstructure_event_loop_.get()),
-        superstructure_plant_event_loop_(MakeEventLoop()),
+        superstructure_plant_event_loop_(MakeEventLoop("plant")),
         superstructure_plant_(superstructure_plant_event_loop_.get(), dt()) {}
 
   void VerifyNearGoal() {
diff --git a/y2017/control_loops/superstructure/superstructure_lib_test.cc b/y2017/control_loops/superstructure/superstructure_lib_test.cc
index 5298687..2722024 100644
--- a/y2017/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2017/control_loops/superstructure/superstructure_lib_test.cc
@@ -523,7 +523,7 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2017/config.json"),
             chrono::microseconds(5050)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         superstructure_goal_fetcher_(
             test_event_loop_->MakeFetcher<Goal>("/superstructure")),
         superstructure_goal_sender_(
@@ -534,9 +534,9 @@
             test_event_loop_->MakeFetcher<Output>("/superstructure")),
         superstructure_position_fetcher_(
             test_event_loop_->MakeFetcher<Position>("/superstructure")),
-        superstructure_event_loop_(MakeEventLoop()),
+        superstructure_event_loop_(MakeEventLoop("superstructure")),
         superstructure_(superstructure_event_loop_.get()),
-        superstructure_plant_event_loop_(MakeEventLoop()),
+        superstructure_plant_event_loop_(MakeEventLoop("plant")),
         superstructure_plant_(superstructure_plant_event_loop_.get(), dt()) {
     set_team_id(::frc971::control_loops::testing::kTeamNumber);
   }
diff --git a/y2017/control_loops/superstructure/vision_time_adjuster_test.cc b/y2017/control_loops/superstructure/vision_time_adjuster_test.cc
index 7e9d82d..9a58049 100644
--- a/y2017/control_loops/superstructure/vision_time_adjuster_test.cc
+++ b/y2017/control_loops/superstructure/vision_time_adjuster_test.cc
@@ -20,7 +20,7 @@
       : ::testing::Test(),
         configuration_(aos::configuration::ReadConfig("y2017/config.json")),
         event_loop_factory_(&configuration_.message()),
-        simulation_event_loop_(event_loop_factory_.MakeEventLoop()),
+        simulation_event_loop_(event_loop_factory_.MakeEventLoop("drivetrain")),
         drivetrain_status_sender_(
             simulation_event_loop_
                 ->MakeSender<::frc971::control_loops::drivetrain::Status>(
@@ -28,7 +28,8 @@
         vision_status_sender_(
             simulation_event_loop_->MakeSender<::y2017::vision::VisionStatus>(
                 "/vision")),
-        vision_time_adjuster_event_loop_(event_loop_factory_.MakeEventLoop()),
+        vision_time_adjuster_event_loop_(
+            event_loop_factory_.MakeEventLoop("vision_time_adjuster")),
         vision_status_fetcher_(
             vision_time_adjuster_event_loop_
                 ->MakeFetcher<::y2017::vision::VisionStatus>("/vision")),
diff --git a/y2018/control_loops/superstructure/superstructure_lib_test.cc b/y2018/control_loops/superstructure/superstructure_lib_test.cc
index 988655f..a087356 100644
--- a/y2018/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2018/control_loops/superstructure/superstructure_lib_test.cc
@@ -318,7 +318,7 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2018/config.json"),
             ::std::chrono::microseconds(5050)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         superstructure_goal_fetcher_(
             test_event_loop_->MakeFetcher<superstructure::Goal>(
                 "/superstructure")),
@@ -331,9 +331,9 @@
         superstructure_output_fetcher_(
             test_event_loop_->MakeFetcher<superstructure::Output>(
                 "/superstructure")),
-        superstructure_event_loop_(MakeEventLoop()),
+        superstructure_event_loop_(MakeEventLoop("superstructure")),
         superstructure_(superstructure_event_loop_.get(), "/superstructure"),
-        superstructure_plant_event_loop_(MakeEventLoop()),
+        superstructure_plant_event_loop_(MakeEventLoop("plant")),
         superstructure_plant_(superstructure_plant_event_loop_.get()) {
     set_team_id(::frc971::control_loops::testing::kTeamNumber);
   }
diff --git a/y2019/control_loops/drivetrain/localized_drivetrain_test.cc b/y2019/control_loops/drivetrain/localized_drivetrain_test.cc
index 06d2f24..b8674bc 100644
--- a/y2019/control_loops/drivetrain/localized_drivetrain_test.cc
+++ b/y2019/control_loops/drivetrain/localized_drivetrain_test.cc
@@ -47,22 +47,20 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2019/config.json"),
             GetTest2019DrivetrainConfig().dt),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         drivetrain_goal_sender_(
             test_event_loop_->MakeSender<Goal>("/drivetrain")),
         drivetrain_goal_fetcher_(
             test_event_loop_->MakeFetcher<Goal>("/drivetrain")),
         localizer_control_sender_(
             test_event_loop_->MakeSender<LocalizerControl>("/drivetrain")),
-
-        drivetrain_event_loop_(MakeEventLoop()),
+        drivetrain_event_loop_(MakeEventLoop("drivetrain")),
         dt_config_(GetTest2019DrivetrainConfig()),
         camera_sender_(
             test_event_loop_->MakeSender<CameraFrame>("/drivetrain")),
         localizer_(drivetrain_event_loop_.get(), dt_config_),
         drivetrain_(dt_config_, drivetrain_event_loop_.get(), &localizer_),
-
-        drivetrain_plant_event_loop_(MakeEventLoop()),
+        drivetrain_plant_event_loop_(MakeEventLoop("plant")),
         drivetrain_plant_(drivetrain_plant_event_loop_.get(), dt_config_),
         cameras_(MakeCameras(&robot_pose_)),
         last_frame_(monotonic_now()) {
diff --git a/y2019/control_loops/drivetrain/target_selector_test.cc b/y2019/control_loops/drivetrain/target_selector_test.cc
index 2e9028f..90ca830 100644
--- a/y2019/control_loops/drivetrain/target_selector_test.cc
+++ b/y2019/control_loops/drivetrain/target_selector_test.cc
@@ -39,8 +39,8 @@
   TargetSelectorParamTest()
       : configuration_(aos::configuration::ReadConfig("y2019/config.json")),
         event_loop_factory_(&configuration_.message()),
-        event_loop_(this->event_loop_factory_.MakeEventLoop()),
-        test_event_loop_(this->event_loop_factory_.MakeEventLoop()),
+        event_loop_(this->event_loop_factory_.MakeEventLoop("drivetrain")),
+        test_event_loop_(this->event_loop_factory_.MakeEventLoop("test")),
         target_selector_hint_sender_(
             test_event_loop_->MakeSender<
                 ::y2019::control_loops::drivetrain::TargetSelectorHint>(
diff --git a/y2019/control_loops/superstructure/superstructure_lib_test.cc b/y2019/control_loops/superstructure/superstructure_lib_test.cc
index 7af8ffd..f0e1a70 100644
--- a/y2019/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2019/control_loops/superstructure/superstructure_lib_test.cc
@@ -405,7 +405,7 @@
       : ::aos::testing::ControlLoopTest(
             aos::configuration::ReadConfig("y2019/config.json"),
             chrono::microseconds(5050)),
-        test_event_loop_(MakeEventLoop()),
+        test_event_loop_(MakeEventLoop("test")),
         superstructure_goal_fetcher_(
             test_event_loop_->MakeFetcher<Goal>("/superstructure")),
         superstructure_goal_sender_(
@@ -416,9 +416,9 @@
             test_event_loop_->MakeFetcher<Output>("/superstructure")),
         superstructure_position_fetcher_(
             test_event_loop_->MakeFetcher<Position>("/superstructure")),
-        superstructure_event_loop_(MakeEventLoop()),
+        superstructure_event_loop_(MakeEventLoop("superstructure")),
         superstructure_(superstructure_event_loop_.get()),
-        superstructure_plant_event_loop_(MakeEventLoop()),
+        superstructure_plant_event_loop_(MakeEventLoop("plant")),
         superstructure_plant_(superstructure_plant_event_loop_.get(), dt()) {
     set_team_id(::frc971::control_loops::testing::kTeamNumber);
   }