@@ -191,25 +191,45 @@ ListeningSocket::accept(std::optional<std::chrono::milliseconds> Timeout) {
191
191
FDs[1 ].events = POLLIN;
192
192
FDs[1 ].fd = PipeFD[0 ];
193
193
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 ();
195
206
#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) {
198
209
#else
199
- int PollStatus = ::poll (FDs, 2 , TimeoutCount );
200
- if (PollStatus == -1 )
210
+ PollStatus = ::poll (FDs, 2 , RemainingTime );
211
+ if (PollStatus == -1 ) {
201
212
#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
+ }
208
218
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
+ }
213
233
214
234
int AcceptFD;
215
235
#ifdef _WIN32
0 commit comments