Switch GetAlarmFactory() to CreateAlarmFactory() in QuicEventLoop

QuicDispatcher takes the ownership of the factory passed into it, meaning we
can't just have a single factory object per event loop.

PiperOrigin-RevId: 459561376
diff --git a/quiche/quic/bindings/quic_libevent.cc b/quiche/quic/bindings/quic_libevent.cc
index 083236d..668f441 100644
--- a/quiche/quic/bindings/quic_libevent.cc
+++ b/quiche/quic/bindings/quic_libevent.cc
@@ -65,8 +65,7 @@
 LibeventQuicEventLoop::LibeventQuicEventLoop(event_base* base, QuicClock* clock)
     : base_(base),
       edge_triggered_(event_base_get_features(base) & EV_FEATURE_ET),
-      clock_(clock),
-      alarm_factory_(this) {
+      clock_(clock) {
   QUICHE_CHECK_LE(sizeof(event), event_get_struct_event_size())
       << "libevent ABI mismatch: sizeof(event) is bigger than the one QUICHE "
          "has been compiled with";
diff --git a/quiche/quic/bindings/quic_libevent.h b/quiche/quic/bindings/quic_libevent.h
index 1f46e71..5eabb45 100644
--- a/quiche/quic/bindings/quic_libevent.h
+++ b/quiche/quic/bindings/quic_libevent.h
@@ -26,7 +26,9 @@
 
   // QuicEventLoop implementation.
   bool SupportsEdgeTriggered() const override { return edge_triggered_; }
-  QuicAlarmFactory* GetAlarmFactory() override { return &alarm_factory_; }
+  std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() override {
+    return std::make_unique<AlarmFactory>(this);
+  }
   bool RegisterSocket(QuicUdpSocketFd fd, QuicSocketEventMask events,
                       QuicSocketEventListener* listener) override;
   bool UnregisterSocket(QuicUdpSocketFd fd) override;
@@ -85,7 +87,6 @@
   QuicClock* clock_;
 
   RegistrationMap registration_map_;
-  AlarmFactory alarm_factory_;
 };
 
 // RAII-style wrapper around event_base.
diff --git a/quiche/quic/bindings/quic_libevent_test.cc b/quiche/quic/bindings/quic_libevent_test.cc
index 20dcbad..e6f2427 100644
--- a/quiche/quic/bindings/quic_libevent_test.cc
+++ b/quiche/quic/bindings/quic_libevent_test.cc
@@ -49,8 +49,10 @@
   auto event_loop_owned = QuicLibeventEventLoopFactory::Get()->Create(clock);
   LibeventQuicEventLoop* event_loop =
       static_cast<LibeventQuicEventLoop*>(event_loop_owned.get());
-  std::unique_ptr<QuicAlarm> timeout_alarm = absl::WrapUnique(
-      event_loop->GetAlarmFactory()->CreateAlarm(new FailureAlarmDelegate()));
+  std::unique_ptr<QuicAlarmFactory> alarm_factory =
+      event_loop->CreateAlarmFactory();
+  std::unique_ptr<QuicAlarm> timeout_alarm =
+      absl::WrapUnique(alarm_factory->CreateAlarm(new FailureAlarmDelegate()));
 
   const QuicTime kTimeoutAt = clock->Now() + QuicTime::Delta::FromSeconds(10);
   timeout_alarm->Set(kTimeoutAt);
diff --git a/quiche/quic/core/io/quic_all_event_loops_test.cc b/quiche/quic/core/io/quic_all_event_loops_test.cc
index c9e4dab..841717f 100644
--- a/quiche/quic/core/io/quic_all_event_loops_test.cc
+++ b/quiche/quic/core/io/quic_all_event_loops_test.cc
@@ -62,7 +62,8 @@
     : public QuicTestWithParam<QuicEventLoopFactory*> {
  public:
   QuicEventLoopFactoryTest()
-      : loop_(GetParam()->Create(&clock_)), factory_(loop_->GetAlarmFactory()) {
+      : loop_(GetParam()->Create(&clock_)),
+        factory_(loop_->CreateAlarmFactory()) {
     int fds[2];
     int result = ::pipe(fds);
     QUICHE_CHECK(result >= 0) << "Failed to create a pipe, errno: " << errno;
@@ -96,7 +97,7 @@
  protected:
   QuicDefaultClock clock_;
   std::unique_ptr<QuicEventLoop> loop_;
-  QuicAlarmFactory* factory_;
+  std::unique_ptr<QuicAlarmFactory> factory_;
   int read_fd_;
   int write_fd_;
 };
diff --git a/quiche/quic/core/io/quic_event_loop.h b/quiche/quic/core/io/quic_event_loop.h
index be82ac7..1b09562 100644
--- a/quiche/quic/core/io/quic_event_loop.h
+++ b/quiche/quic/core/io/quic_event_loop.h
@@ -73,8 +73,8 @@
   virtual void RunEventLoopOnce(QuicTime::Delta default_timeout) = 0;
 
   // Returns an alarm factory that allows alarms to be scheduled on this event
-  // loop.  The factory is owned by the event loop.
-  virtual QuicAlarmFactory* GetAlarmFactory() = 0;
+  // loop.
+  virtual std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() = 0;
 };
 
 // A factory object for the event loop. Every implementation is expected to have
diff --git a/quiche/quic/core/io/quic_poll_event_loop.cc b/quiche/quic/core/io/quic_poll_event_loop.cc
index f7a9794..286dd65 100644
--- a/quiche/quic/core/io/quic_poll_event_loop.cc
+++ b/quiche/quic/core/io/quic_poll_event_loop.cc
@@ -36,8 +36,7 @@
 
 }  // namespace
 
-QuicPollEventLoop::QuicPollEventLoop(QuicClock* clock)
-    : clock_(clock), alarm_factory_(this) {}
+QuicPollEventLoop::QuicPollEventLoop(QuicClock* clock) : clock_(clock) {}
 
 bool QuicPollEventLoop::RegisterSocket(QuicUdpSocketFd fd,
                                        QuicSocketEventMask events,
@@ -258,8 +257,8 @@
   current_schedule_handle_.reset();
 }
 
-QuicAlarmFactory* QuicPollEventLoop::GetAlarmFactory() {
-  return &alarm_factory_;
+std::unique_ptr<QuicAlarmFactory> QuicPollEventLoop::CreateAlarmFactory() {
+  return std::make_unique<AlarmFactory>(this);
 }
 
 }  // namespace quic
diff --git a/quiche/quic/core/io/quic_poll_event_loop.h b/quiche/quic/core/io/quic_poll_event_loop.h
index f99f220..4e19ff9 100644
--- a/quiche/quic/core/io/quic_poll_event_loop.h
+++ b/quiche/quic/core/io/quic_poll_event_loop.h
@@ -50,7 +50,7 @@
   ABSL_MUST_USE_RESULT bool ArtificiallyNotifyEvent(
       QuicUdpSocketFd fd, QuicSocketEventMask events) override;
   void RunEventLoopOnce(QuicTime::Delta default_timeout) override;
-  QuicAlarmFactory* GetAlarmFactory() override;
+  std::unique_ptr<QuicAlarmFactory> CreateAlarmFactory() override;
 
  protected:
   // Allows poll(2) calls to be mocked out in unit tests.
@@ -143,7 +143,6 @@
   const QuicClock* clock_;
   RegistrationMap registrations_;
   AlarmList alarms_;
-  AlarmFactory alarm_factory_;
   bool has_artificial_events_pending_ = false;
 };
 
diff --git a/quiche/quic/core/io/quic_poll_event_loop_test.cc b/quiche/quic/core/io/quic_poll_event_loop_test.cc
index d8ad01f..f0e9557 100644
--- a/quiche/quic/core/io/quic_poll_event_loop_test.cc
+++ b/quiche/quic/core/io/quic_poll_event_loop_test.cc
@@ -86,7 +86,8 @@
 
 class QuicPollEventLoopTest : public QuicTest {
  public:
-  QuicPollEventLoopTest() : loop_(&clock_), factory_(loop_.GetAlarmFactory()) {
+  QuicPollEventLoopTest()
+      : loop_(&clock_), factory_(loop_.CreateAlarmFactory()) {
     int fds[2];
     int result = ::pipe(fds);
     QUICHE_CHECK(result >= 0) << "Failed to create a pipe, errno: " << errno;
@@ -123,7 +124,7 @@
  protected:
   MockClock clock_;
   QuicPollEventLoopForTest loop_;
-  QuicAlarmFactory* factory_;
+  std::unique_ptr<QuicAlarmFactory> factory_;
   int read_fd_;
   int write_fd_;
 };