18
18
19
19
#include < atomic>
20
20
#include < fcntl.h>
21
- #include < poll.h>
22
21
#include < thread>
23
22
24
23
#ifndef _WIN32
25
24
#include < sys/socket.h>
26
25
#include < sys/un.h>
26
+ #include < poll.h>
27
27
#else
28
28
#include " llvm/Support/Windows/WindowsSupport.h"
29
29
// winsock2.h must be included before afunix.h. Briefly turn off clang-format to
@@ -140,38 +140,43 @@ ListeningSocket::createListeningUnixSocket(StringRef SocketPath,
140
140
#ifdef _WIN32
141
141
WSABalancer _;
142
142
SOCKET Socket = socket (AF_UNIX, SOCK_STREAM, 0 );
143
- if (Socket == INVALID_SOCKET) {
143
+ if (Socket == INVALID_SOCKET)
144
144
#else
145
145
int Socket = socket (AF_UNIX, SOCK_STREAM, 0 );
146
146
if (Socket == -1 )
147
147
#endif
148
148
return llvm::make_error<StringError>(getLastSocketErrorCode (),
149
149
" socket create failed" );
150
150
151
- struct sockaddr_un Addr = setSocketAddr (SocketPath);
152
- if (::bind (Socket, (struct sockaddr *)&Addr, sizeof (Addr)) == -1 ) {
153
- // Grab error code from call to ::bind before calling ::close
154
- std::error_code EC = getLastSocketErrorCode ();
155
- ::close (Socket);
156
- return llvm::make_error<StringError>(EC, " Bind error" );
157
- }
151
+ struct sockaddr_un Addr = setSocketAddr (SocketPath);
152
+ if (::bind (Socket, (struct sockaddr *)&Addr, sizeof (Addr)) == -1 ) {
153
+ // Grab error code from call to ::bind before calling ::close
154
+ std::error_code EC = getLastSocketErrorCode ();
155
+ ::close (Socket);
156
+ return llvm::make_error<StringError>(EC, " Bind error" );
157
+ }
158
158
159
- // Mark socket as passive so incoming connections can be accepted
160
- if (::listen (Socket, MaxBacklog) == -1 )
161
- return llvm::make_error<StringError>(getLastSocketErrorCode (),
162
- " Listen error" );
159
+ // Mark socket as passive so incoming connections can be accepted
160
+ if (::listen (Socket, MaxBacklog) == -1 )
161
+ return llvm::make_error<StringError>(getLastSocketErrorCode (),
162
+ " Listen error" );
163
163
164
- int PipeFD[2 ];
164
+ int PipeFD[2 ];
165
+ #ifdef _WIN32
166
+ // Reserve 1 byte for the pipe and use default textmode
167
+ if (::_pipe (PipeFD, 1 , 0 ) == -1 )
168
+ #else
165
169
if (::pipe (PipeFD) == -1 )
166
- return llvm::make_error<StringError>(getLastSocketErrorCode (),
167
- " pipe failed" );
170
+ #endif // _WIN32
171
+ return llvm::make_error<StringError>(getLastSocketErrorCode (),
172
+ " pipe failed" );
168
173
169
174
#ifdef _WIN32
170
- return ListeningSocket{_open_osfhandle (Socket, 0 ), SocketPath, PipeFD};
175
+ return ListeningSocket{_open_osfhandle (Socket, 0 ), SocketPath, PipeFD};
171
176
#else
172
177
return ListeningSocket{Socket, SocketPath, PipeFD};
173
178
#endif // _WIN32
174
- }
179
+ }
175
180
176
181
Expected<std::unique_ptr<raw_socket_stream>>
177
182
ListeningSocket::accept (std::optional<std::chrono::milliseconds> Timeout) {
@@ -184,14 +189,17 @@ ListeningSocket::accept(std::optional<std::chrono::milliseconds> Timeout) {
184
189
#else
185
190
FDs[0 ].fd = FD;
186
191
#endif
187
-
188
192
FDs[1 ].events = POLLIN;
189
193
FDs[1 ].fd = PipeFD[0 ];
190
194
191
195
int TimeoutCount = Timeout.value_or (std::chrono::milliseconds (-1 )).count ();
196
+ #ifdef _WIN32
197
+ int PollStatus = WSAPoll (FDs, 2 , TimeoutCount);
198
+ if (PollStatus == SOCKET_ERROR)
199
+ #else
192
200
int PollStatus = ::poll (FDs, 2 , TimeoutCount);
193
-
194
201
if (PollStatus == -1 )
202
+ #endif
195
203
return llvm::make_error<StringError>(getLastSocketErrorCode (),
196
204
" poll failed" );
197
205
if (PollStatus == 0 )
0 commit comments