Skip to content

Commit f163299

Browse files
committed
Rough draft of readWithTimeout to figure out structure
1 parent b9e468a commit f163299

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

llvm/include/llvm/Support/raw_socket_stream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class raw_socket_stream : public raw_fd_stream {
128128
/// SocketPath.
129129
static Expected<std::unique_ptr<raw_socket_stream>>
130130
createConnectedUnix(StringRef SocketPath);
131+
llvm::Error readWithTimeout(char *Ptr, size_t Size,
132+
std::chrono::milliseconds Timeout);
131133
~raw_socket_stream();
132134
};
133135

llvm/lib/Support/raw_socket_stream.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,19 +177,20 @@ Expected<ListeningSocket> ListeningSocket::createUnix(StringRef SocketPath,
177177
#endif // _WIN32
178178
}
179179

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
183184
struct pollfd FDs[2];
184185
FDs[0].events = POLLIN;
185186
#ifdef _WIN32
186187
SOCKET WinServerSock = _get_osfhandle(FD);
187188
FDs[0].fd = WinServerSock;
188189
#else
189-
FDs[0].fd = FD;
190+
FDs[0].fd = ActiveFD;
190191
#endif
191192
FDs[1].events = POLLIN;
192-
FDs[1].fd = PipeFD[0];
193+
FDs[1].fd = PipeFD;
193194

194195
// Keep track of how much time has passed in case poll is interupted by a
195196
// signal and needs to be recalled
@@ -209,7 +210,7 @@ ListeningSocket::accept(std::chrono::milliseconds Timeout) {
209210
#endif
210211
// If FD equals -1 then ListeningSocket::shutdown has been called and it is
211212
// appropriate to return operation_canceled
212-
if (FD.load() == -1)
213+
if (ActiveFD.load() == -1)
213214
return llvm::make_error<StringError>(
214215
std::make_error_code(std::errc::operation_canceled),
215216
"Accept canceled");
@@ -237,6 +238,13 @@ ListeningSocket::accept(std::chrono::milliseconds Timeout) {
237238
ElapsedTime +=
238239
std::chrono::duration_cast<std::chrono::milliseconds>(Stop - Start);
239240
}
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);
240248

241249
int AcceptFD;
242250
#ifdef _WIN32
@@ -267,8 +275,7 @@ void ListeningSocket::shutdown() {
267275
::unlink(SocketPath.c_str());
268276

269277
// 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);
272279

273280
// Ignore any write() error
274281
(void)written;
@@ -306,4 +313,13 @@ raw_socket_stream::createConnectedUnix(StringRef SocketPath) {
306313
return std::make_unique<raw_socket_stream>(*FD);
307314
}
308315

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+
309325
raw_socket_stream::~raw_socket_stream() {}

0 commit comments

Comments
 (0)