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;