[llvm] [llvm][Support] Implement raw_socket_stream::read with optional timeout (PR #92308)
Michael Spencer via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 3 14:07:35 PDT 2024
================
@@ -177,43 +178,51 @@ Expected<ListeningSocket> ListeningSocket::createUnix(StringRef SocketPath,
#endif // _WIN32
}
-Expected<std::unique_ptr<raw_socket_stream>>
-ListeningSocket::accept(std::chrono::milliseconds Timeout) {
-
- struct pollfd FDs[2];
- FDs[0].events = POLLIN;
+// If a file descriptor being monitored by poll is closed by another thread, the
+// result is unspecified. In the case poll does not unblock and return when
+// ActiveFD is closed you can provide another file descriptor via CancelFD that
+// when written to will cause poll to return. Typically CancelFD is the read end
+// of a unidirectional pipe.
+static llvm::Error manageTimeout(std::chrono::milliseconds Timeout,
+ std::function<int()> getActiveFD,
+ std::optional<int> CancelFD = std::nullopt) {
+ struct pollfd FD[2];
+ FD[0].events = POLLIN;
#ifdef _WIN32
- SOCKET WinServerSock = _get_osfhandle(FD);
- FDs[0].fd = WinServerSock;
+ SOCKET WinServerSock = _get_osfhandle(getActiveFD());
+ FD[0].fd = WinServerSock;
#else
- FDs[0].fd = FD;
+ FD[0].fd = getActiveFD();
#endif
- FDs[1].events = POLLIN;
- FDs[1].fd = PipeFD[0];
+ uint8_t FDCount = 1;
+ if (CancelFD.has_value()) {
+ FD[1].events = POLLIN;
+ FD[1].fd = CancelFD.value();
+ FDCount++;
+ }
- // Keep track of how much time has passed in case poll is interupted by a
- // signal and needs to be recalled
+ // Keep track of how much time has passed in case ::poll or WSAPoll are
+ // interupted by a signal and need to be recalled
int RemainingTime = Timeout.count();
std::chrono::milliseconds ElapsedTime = std::chrono::milliseconds(0);
int PollStatus = -1;
while (PollStatus == -1 && (Timeout.count() == -1 || ElapsedTime < Timeout)) {
if (Timeout.count() != -1)
RemainingTime -= ElapsedTime.count();
----------------
Bigcheese wrote:
This over counts ElapsedTime because it includes previous loop iterations.
https://github.com/llvm/llvm-project/pull/92308
More information about the llvm-commits
mailing list