From 26825b586517f2dd947ff5db4208746ac8185fb0 Mon Sep 17 00:00:00 2001 From: stasoid Date: Mon, 10 Feb 2025 11:33:11 +0500 Subject: [PATCH] LibCore: Properly shutdown a socket on Windows It fixes a bug in which ImageDecoder and RequestServer do not exit because their connections don't close. This makes the shutdown behavior match the Linux version, which receives FD_READ | FD_HANGUP on socket close, and TransportSocket::read_as_much_as_possible_without_blocking calls schedule_shutdown when read from a socket returns 0 bytes. On Windows, we have to explicitly call WIN32 shutdown to receive notification FD_CLOSE. --- Libraries/LibCore/EventLoopImplementationWindows.cpp | 2 +- Libraries/LibCore/SocketWindows.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Libraries/LibCore/EventLoopImplementationWindows.cpp b/Libraries/LibCore/EventLoopImplementationWindows.cpp index b10cb88e39b..0eefd516081 100644 --- a/Libraries/LibCore/EventLoopImplementationWindows.cpp +++ b/Libraries/LibCore/EventLoopImplementationWindows.cpp @@ -150,7 +150,7 @@ static int notifier_type_to_network_event(NotificationType type) { switch (type) { case NotificationType::Read: - return FD_READ; + return FD_READ | FD_CLOSE; case NotificationType::Write: return FD_WRITE; default: diff --git a/Libraries/LibCore/SocketWindows.cpp b/Libraries/LibCore/SocketWindows.cpp index 084a5a549dd..793d65b2612 100644 --- a/Libraries/LibCore/SocketWindows.cpp +++ b/Libraries/LibCore/SocketWindows.cpp @@ -122,6 +122,8 @@ void PosixSocketHelper::close() if (m_notifier) m_notifier->set_enabled(false); + // shutdown is required for another end to receive FD_CLOSE + shutdown(m_fd, SD_BOTH); MUST(System::close(m_fd)); m_fd = -1; }