Author: Min-Yih Hsu Date: 2026-05-26T10:28:40-07:00 New Revision: 460556ae66e45b203f49c1c43878b4e0ef6d0f49
URL: https://github.com/llvm/llvm-project/commit/460556ae66e45b203f49c1c43878b4e0ef6d0f49 DIFF: https://github.com/llvm/llvm-project/commit/460556ae66e45b203f49c1c43878b4e0ef6d0f49.diff LOG: [ORC] Shutdown the socket FD before closing it in FDSimpleRemoteEPCTransport (#196835) It is totally possible that when `FDSimpleRemoteEPCTransport::disconnect` is called, `FDSimpleRemoteEPCTransport::listenLoop` is still reading on the socket FD the former is closing. On Linux, closing a socket FD when it is being read by another thread is an undefined behavior I believe. And on modern kernels, the reading thread will not be waken up, so `listenLoop` will be blocked forever and preventing the process from exiting. This patch fixes this issue by calling `shutdown(2)` on the socket FDs before closing them. Added: Modified: llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp Removed: ################################################################################ diff --git a/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp b/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp index 08fcd1c45445c..a8bf26d7da033 100644 --- a/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.cpp @@ -20,6 +20,9 @@ #else #include <io.h> #endif +#ifndef _WIN32 +#include <sys/socket.h> +#endif namespace { @@ -115,6 +118,13 @@ void FDSimpleRemoteEPCTransport::disconnect() { Disconnected = true; bool CloseOutFD = InFD != OutFD; +#ifndef _WIN32 + // We need to shutdown the socket to wake up (and terminate) any ongoing + // blocking read on this FD. If the FD is not a socket, shutdown will just + // complain through errno (instead of crashing). + // FIXME: what about Windows? + ::shutdown(InFD, CloseOutFD ? SHUT_RD : SHUT_RDWR); +#endif // Close InFD. while (close(InFD) == -1) { if (errno == EBADF) @@ -123,6 +133,10 @@ void FDSimpleRemoteEPCTransport::disconnect() { // Close OutFD. if (CloseOutFD) { +#ifndef _WIN32 + // FIXME: what about Windows? + ::shutdown(OutFD, SHUT_WR); +#endif while (close(OutFD) == -1) { if (errno == EBADF) break; _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
