Skip to content

Commit 013b1f5

Browse files
committed
fix windows build
1 parent e1bf4d1 commit 013b1f5

File tree

1 file changed

+28
-20
lines changed

1 file changed

+28
-20
lines changed

llvm/lib/Support/raw_socket_stream.cpp

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818

1919
#include <atomic>
2020
#include <fcntl.h>
21-
#include <poll.h>
2221
#include <thread>
2322

2423
#ifndef _WIN32
2524
#include <sys/socket.h>
2625
#include <sys/un.h>
26+
#include <poll.h>
2727
#else
2828
#include "llvm/Support/Windows/WindowsSupport.h"
2929
// winsock2.h must be included before afunix.h. Briefly turn off clang-format to
@@ -140,38 +140,43 @@ ListeningSocket::createListeningUnixSocket(StringRef SocketPath,
140140
#ifdef _WIN32
141141
WSABalancer _;
142142
SOCKET Socket = socket(AF_UNIX, SOCK_STREAM, 0);
143-
if (Socket == INVALID_SOCKET) {
143+
if (Socket == INVALID_SOCKET)
144144
#else
145145
int Socket = socket(AF_UNIX, SOCK_STREAM, 0);
146146
if (Socket == -1)
147147
#endif
148148
return llvm::make_error<StringError>(getLastSocketErrorCode(),
149149
"socket create failed");
150150

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+
}
158158

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");
163163

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
165169
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");
168173

169174
#ifdef _WIN32
170-
return ListeningSocket{_open_osfhandle(Socket, 0), SocketPath, PipeFD};
175+
return ListeningSocket{_open_osfhandle(Socket, 0), SocketPath, PipeFD};
171176
#else
172177
return ListeningSocket{Socket, SocketPath, PipeFD};
173178
#endif // _WIN32
174-
}
179+
}
175180

176181
Expected<std::unique_ptr<raw_socket_stream>>
177182
ListeningSocket::accept(std::optional<std::chrono::milliseconds> Timeout) {
@@ -184,14 +189,17 @@ ListeningSocket::accept(std::optional<std::chrono::milliseconds> Timeout) {
184189
#else
185190
FDs[0].fd = FD;
186191
#endif
187-
188192
FDs[1].events = POLLIN;
189193
FDs[1].fd = PipeFD[0];
190194

191195
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
192200
int PollStatus = ::poll(FDs, 2, TimeoutCount);
193-
194201
if (PollStatus == -1)
202+
#endif
195203
return llvm::make_error<StringError>(getLastSocketErrorCode(),
196204
"poll failed");
197205
if (PollStatus == 0)

0 commit comments

Comments
 (0)