Internal change

PiperOrigin-RevId: 559200578
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 1467671..386feb4 100644
--- a/quiche/quic/core/io/quic_all_event_loops_test.cc
+++ b/quiche/quic/core/io/quic_all_event_loops_test.cc
@@ -61,9 +61,9 @@
 class QuicEventLoopFactoryTest
     : public QuicTestWithParam<QuicEventLoopFactory*> {
  public:
-  QuicEventLoopFactoryTest()
-      : loop_(GetParam()->Create(&clock_)),
-        factory_(loop_->CreateAlarmFactory()) {
+  void SetUp() override {
+    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;
@@ -74,7 +74,11 @@
     SetNonBlocking(write_fd_);
   }
 
-  ~QuicEventLoopFactoryTest() {
+  void TearDown() override {
+    factory_.reset();
+    loop_.reset();
+    // Epoll-based event loop automatically removes registered FDs from the
+    // Epoll set, which should happen before these FDs are closed.
     close(read_fd_);
     close(write_fd_);
   }
@@ -280,10 +284,6 @@
 TEST_P(QuicEventLoopFactoryTest, ReadWriteSocket) {
   int sockets[2];
   ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets), 0);
-  auto close_sockets = absl::MakeCleanup([&]() {
-    close(sockets[0]);
-    close(sockets[1]);
-  });
   SetNonBlocking(sockets[0]);
   SetNonBlocking(sockets[1]);
 
@@ -319,6 +319,10 @@
   EXPECT_CALL(listener,
               OnSocketEvent(_, sockets[0], HasFlagSet(kSocketEventWritable)));
   loop_->RunEventLoopOnce(QuicTime::Delta::FromMilliseconds(4));
+
+  EXPECT_TRUE(loop_->UnregisterSocket(sockets[0]));
+  close(sockets[0]);
+  close(sockets[1]);
 }
 
 TEST_P(QuicEventLoopFactoryTest, AlarmInFuture) {
diff --git a/quiche/quic/tools/quic_server.cc b/quiche/quic/tools/quic_server.cc
index 63e9aca..91c6055 100644
--- a/quiche/quic/tools/quic_server.cc
+++ b/quiche/quic/tools/quic_server.cc
@@ -97,6 +97,11 @@
 }
 
 QuicServer::~QuicServer() {
+  if (event_loop_ != nullptr) {
+    if (!event_loop_->UnregisterSocket(fd_)) {
+      QUIC_LOG(ERROR) << "Failed to unregister socket: " << fd_;
+    }
+  }
   (void)socket_api::Close(fd_);
   fd_ = kInvalidSocketFd;