Skip to content

Commit 4865936

Browse files
committed
Handle case were poll exists due to signal
1 parent f75daaf commit 4865936

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

llvm/lib/Support/raw_socket_stream.cpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -191,25 +191,45 @@ ListeningSocket::accept(std::optional<std::chrono::milliseconds> Timeout) {
191191
FDs[1].events = POLLIN;
192192
FDs[1].fd = PipeFD[0];
193193

194-
int TimeoutCount = Timeout.value_or(std::chrono::milliseconds(-1)).count();
194+
std::chrono::milliseconds OriginalTimeout =
195+
Timeout.value_or(std::chrono::milliseconds(-1));
196+
int RemainingTime = OriginalTimeout.count();
197+
std::chrono::milliseconds ElapsedTime = std::chrono::milliseconds(0);
198+
199+
int PollStatus = -1;
200+
while (PollStatus == -1 &&
201+
(RemainingTime == -1 || ElapsedTime < OriginalTimeout)) {
202+
if (RemainingTime != -1)
203+
RemainingTime -= ElapsedTime.count();
204+
205+
auto Start = std::chrono::steady_clock::now();
195206
#ifdef _WIN32
196-
int PollStatus = WSAPoll(FDs, 2, TimeoutCount);
197-
if (PollStatus == SOCKET_ERROR)
207+
PollStatus = WSAPoll(FDs, 2, RemainingTime);
208+
if (PollStatus == SOCKET_ERROR) {
198209
#else
199-
int PollStatus = ::poll(FDs, 2, TimeoutCount);
200-
if (PollStatus == -1)
210+
PollStatus = ::poll(FDs, 2, RemainingTime);
211+
if (PollStatus == -1) {
201212
#endif
202-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
203-
"poll failed");
204-
if (PollStatus == 0)
205-
return llvm::make_error<StringError>(
206-
std::make_error_code(std::errc::timed_out),
207-
"No client requests within timeout window");
213+
// Ignore error if caused by interupting signal
214+
std::error_code PollErrCode = getLastSocketErrorCode();
215+
if (PollErrCode != std::errc::interrupted)
216+
return llvm::make_error<StringError>(PollErrCode, "poll failed");
217+
}
208218

209-
if (FDs[0].revents & POLLNVAL)
210-
return llvm::make_error<StringError>(
211-
std::make_error_code(std::errc::bad_file_descriptor),
212-
"File descriptor closed by another thread");
219+
if (PollStatus == 0)
220+
return llvm::make_error<StringError>(
221+
std::make_error_code(std::errc::timed_out),
222+
"No client requests within timeout window");
223+
224+
if (FDs[0].revents & POLLNVAL)
225+
return llvm::make_error<StringError>(
226+
std::make_error_code(std::errc::bad_file_descriptor),
227+
"File descriptor closed by another thread");
228+
229+
auto End = std::chrono::steady_clock::now();
230+
ElapsedTime +=
231+
std::chrono::duration_cast<std::chrono::milliseconds>(End - Start);
232+
}
213233

214234
int AcceptFD;
215235
#ifdef _WIN32

0 commit comments

Comments
 (0)