@@ -204,31 +204,34 @@ ListeningSocket::accept(std::chrono::milliseconds Timeout) {
204
204
auto Start = std::chrono::steady_clock::now ();
205
205
#ifdef _WIN32
206
206
PollStatus = WSAPoll (FDs, 2 , RemainingTime);
207
- if (PollStatus == SOCKET_ERROR) {
208
207
#else
209
208
PollStatus = ::poll (FDs, 2 , RemainingTime);
209
+ #endif
210
+ // If FD equals -1 then ListeningSocket::shutdown has been called and it is
211
+ // appropriate to return operation_canceled
212
+ if (FD.load () == -1 )
213
+ return llvm::make_error<StringError>(
214
+ std::make_error_code (std::errc::operation_canceled),
215
+ " Accept canceled" );
216
+
217
+ #if _WIN32
218
+ if (PollStatus == SOCKET_ERROR) {
219
+ #else
210
220
if (PollStatus == -1 ) {
211
221
#endif
212
- // Ignore error if caused by interupting signal
213
222
std::error_code PollErrCode = getLastSocketErrorCode ();
223
+ // Ignore EINTR (signal occured before any request event) and retry
214
224
if (PollErrCode != std::errc::interrupted)
215
225
return llvm::make_error<StringError>(PollErrCode, " FD poll failed" );
216
226
}
217
-
218
227
if (PollStatus == 0 )
219
228
return llvm::make_error<StringError>(
220
229
std::make_error_code (std::errc::timed_out),
221
230
" No client requests within timeout window" );
222
231
223
232
if (FDs[0 ].revents & POLLNVAL)
224
233
return llvm::make_error<StringError>(
225
- std::make_error_code (std::errc::bad_file_descriptor),
226
- " File descriptor closed by another thread" );
227
-
228
- if (FDs[1 ].revents & POLLIN)
229
- return llvm::make_error<StringError>(
230
- std::make_error_code (std::errc::operation_canceled),
231
- " Accept canceled" );
234
+ std::make_error_code (std::errc::bad_file_descriptor));
232
235
233
236
auto Stop = std::chrono::steady_clock::now ();
234
237
ElapsedTime +=
0 commit comments