@@ -177,19 +177,20 @@ Expected<ListeningSocket> ListeningSocket::createUnix(StringRef SocketPath,
177
177
#endif // _WIN32
178
178
}
179
179
180
- Expected<std::unique_ptr<raw_socket_stream>>
181
- ListeningSocket::accept (std::chrono::milliseconds Timeout) {
182
-
180
+ static llvm::Error manageTimeout (const std::chrono::milliseconds Timeout,
181
+ const std::atomic<int > &ActiveFD,
182
+ const int PipeFD) {
183
+ // Populate array of file descriptors that ::poll will monitor
183
184
struct pollfd FDs[2 ];
184
185
FDs[0 ].events = POLLIN;
185
186
#ifdef _WIN32
186
187
SOCKET WinServerSock = _get_osfhandle (FD);
187
188
FDs[0 ].fd = WinServerSock;
188
189
#else
189
- FDs[0 ].fd = FD ;
190
+ FDs[0 ].fd = ActiveFD ;
190
191
#endif
191
192
FDs[1 ].events = POLLIN;
192
- FDs[1 ].fd = PipeFD[ 0 ] ;
193
+ FDs[1 ].fd = PipeFD;
193
194
194
195
// Keep track of how much time has passed in case poll is interupted by a
195
196
// signal and needs to be recalled
@@ -209,7 +210,7 @@ ListeningSocket::accept(std::chrono::milliseconds Timeout) {
209
210
#endif
210
211
// If FD equals -1 then ListeningSocket::shutdown has been called and it is
211
212
// appropriate to return operation_canceled
212
- if (FD .load () == -1 )
213
+ if (ActiveFD .load () == -1 )
213
214
return llvm::make_error<StringError>(
214
215
std::make_error_code (std::errc::operation_canceled),
215
216
" Accept canceled" );
@@ -237,6 +238,13 @@ ListeningSocket::accept(std::chrono::milliseconds Timeout) {
237
238
ElapsedTime +=
238
239
std::chrono::duration_cast<std::chrono::milliseconds>(Stop - Start);
239
240
}
241
+ return llvm::Error::success ();
242
+ }
243
+
244
+ Expected<std::unique_ptr<raw_socket_stream>>
245
+ ListeningSocket::accept (std::chrono::milliseconds Timeout) {
246
+ if (llvm::Error TimeoutErr = manageTimeout (Timeout, FD, PipeFD[0 ]))
247
+ return std::move (TimeoutErr);
240
248
241
249
int AcceptFD;
242
250
#ifdef _WIN32
@@ -267,8 +275,7 @@ void ListeningSocket::shutdown() {
267
275
::unlink (SocketPath.c_str());
268
276
269
277
// Ensure ::poll returns if shutdown is called by a seperate thread
270
- char Byte = ' A' ;
271
- ssize_t written = ::write (PipeFD[1 ], &Byte, 1 );
278
+ ssize_t written = ::write (PipeFD[1 ], " ." , 1 );
272
279
273
280
// Ignore any write() error
274
281
(void )written;
@@ -306,4 +313,13 @@ raw_socket_stream::createConnectedUnix(StringRef SocketPath) {
306
313
return std::make_unique<raw_socket_stream>(*FD);
307
314
}
308
315
316
+ llvm::Error
317
+ raw_socket_stream::readWithTimeout (char *Ptr, size_t Size,
318
+ std::chrono::milliseconds Timeout) {
319
+ // FIXME: add pipe and remove test value of 10
320
+ if (llvm::Error TimeoutErr = manageTimeout (Timeout, get_fd (), 10 ))
321
+ return std::move (TimeoutErr);
322
+ ssize_t Ret = this ->read (Ptr, Size);
323
+ }
324
+
309
325
raw_socket_stream::~raw_socket_stream () {}
0 commit comments