Skip to content

Commit c0d5d36

Browse files
authored
[llvm][Support] Lift raw_socket_stream implementation out into own files (#75653)
Move the implementation of raw_socket_stream from raw_ostream.h/cpp to raw_socket_stream.h/cpp as requested in #73603.
1 parent 3effc19 commit c0d5d36

File tree

6 files changed

+248
-212
lines changed

6 files changed

+248
-212
lines changed

llvm/include/llvm/Support/raw_ostream.h

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "llvm/ADT/SmallVector.h"
1717
#include "llvm/ADT/StringRef.h"
1818
#include "llvm/Support/DataTypes.h"
19-
#include "llvm/Support/Threading.h"
2019
#include <cassert>
2120
#include <cstddef>
2221
#include <cstdint>
@@ -633,54 +632,6 @@ class raw_fd_stream : public raw_fd_ostream {
633632
static bool classof(const raw_ostream *OS);
634633
};
635634

636-
//===----------------------------------------------------------------------===//
637-
// Socket Streams
638-
//===----------------------------------------------------------------------===//
639-
640-
/// A raw stream for sockets reading/writing
641-
642-
class raw_socket_stream;
643-
644-
// Make sure that calls to WSAStartup and WSACleanup are balanced.
645-
#ifdef _WIN32
646-
class WSABalancer {
647-
public:
648-
WSABalancer();
649-
~WSABalancer();
650-
};
651-
#endif // _WIN32
652-
653-
class ListeningSocket {
654-
int FD;
655-
std::string SocketPath;
656-
ListeningSocket(int SocketFD, StringRef SocketPath);
657-
#ifdef _WIN32
658-
WSABalancer _;
659-
#endif // _WIN32
660-
661-
public:
662-
static Expected<ListeningSocket> createUnix(
663-
StringRef SocketPath,
664-
int MaxBacklog = llvm::hardware_concurrency().compute_thread_count());
665-
Expected<std::unique_ptr<raw_socket_stream>> accept();
666-
ListeningSocket(ListeningSocket &&LS);
667-
~ListeningSocket();
668-
};
669-
class raw_socket_stream : public raw_fd_stream {
670-
uint64_t current_pos() const override { return 0; }
671-
#ifdef _WIN32
672-
WSABalancer _;
673-
#endif // _WIN32
674-
675-
public:
676-
raw_socket_stream(int SocketFD);
677-
/// Create a \p raw_socket_stream connected to the Unix domain socket at \p
678-
/// SocketPath.
679-
static Expected<std::unique_ptr<raw_socket_stream>>
680-
createConnectedUnix(StringRef SocketPath);
681-
~raw_socket_stream();
682-
};
683-
684635
//===----------------------------------------------------------------------===//
685636
// Output Stream Adaptors
686637
//===----------------------------------------------------------------------===//
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//===-- llvm/Support/raw_socket_stream.h - Socket streams --*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file contains raw_ostream implementations for streams to communicate
10+
// via UNIX sockets
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_SUPPORT_RAW_SOCKET_STREAM_H
15+
#define LLVM_SUPPORT_RAW_SOCKET_STREAM_H
16+
17+
#include "llvm/Support/Threading.h"
18+
#include "llvm/Support/raw_ostream.h"
19+
20+
namespace llvm {
21+
22+
class raw_socket_stream;
23+
24+
// Make sure that calls to WSAStartup and WSACleanup are balanced.
25+
#ifdef _WIN32
26+
class WSABalancer {
27+
public:
28+
WSABalancer();
29+
~WSABalancer();
30+
};
31+
#endif // _WIN32
32+
33+
class ListeningSocket {
34+
int FD;
35+
std::string SocketPath;
36+
ListeningSocket(int SocketFD, StringRef SocketPath);
37+
#ifdef _WIN32
38+
WSABalancer _;
39+
#endif // _WIN32
40+
41+
public:
42+
static Expected<ListeningSocket> createUnix(
43+
StringRef SocketPath,
44+
int MaxBacklog = llvm::hardware_concurrency().compute_thread_count());
45+
Expected<std::unique_ptr<raw_socket_stream>> accept();
46+
ListeningSocket(ListeningSocket &&LS);
47+
~ListeningSocket();
48+
};
49+
class raw_socket_stream : public raw_fd_stream {
50+
uint64_t current_pos() const override { return 0; }
51+
#ifdef _WIN32
52+
WSABalancer _;
53+
#endif // _WIN32
54+
55+
public:
56+
raw_socket_stream(int SocketFD);
57+
/// Create a \p raw_socket_stream connected to the Unix domain socket at \p
58+
/// SocketPath.
59+
static Expected<std::unique_ptr<raw_socket_stream>>
60+
createConnectedUnix(StringRef SocketPath);
61+
~raw_socket_stream();
62+
};
63+
64+
} // end namespace llvm
65+
66+
#endif

llvm/lib/Support/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ add_llvm_component_library(LLVMSupport
252252
YAMLTraits.cpp
253253
raw_os_ostream.cpp
254254
raw_ostream.cpp
255+
raw_socket_stream.cpp
255256
regcomp.c
256257
regerror.c
257258
regexec.c

llvm/lib/Support/raw_ostream.cpp

Lines changed: 1 addition & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include "llvm/Support/AutoConvert.h"
1717
#include "llvm/Support/Compiler.h"
1818
#include "llvm/Support/Duration.h"
19-
#include "llvm/Support/Error.h"
2019
#include "llvm/Support/ErrorHandling.h"
2120
#include "llvm/Support/FileSystem.h"
2221
#include "llvm/Support/Format.h"
@@ -25,17 +24,11 @@
2524
#include "llvm/Support/NativeFormatting.h"
2625
#include "llvm/Support/Process.h"
2726
#include "llvm/Support/Program.h"
28-
#include "llvm/Support/Threading.h"
2927
#include <algorithm>
3028
#include <cerrno>
3129
#include <cstdio>
3230
#include <sys/stat.h>
3331

34-
#ifndef _WIN32
35-
#include <sys/socket.h>
36-
#include <sys/un.h>
37-
#endif // _WIN32
38-
3932
// <fcntl.h> may provide O_BINARY.
4033
#if defined(HAVE_FCNTL_H)
4134
# include <fcntl.h>
@@ -66,13 +59,6 @@
6659
#include "llvm/Support/ConvertUTF.h"
6760
#include "llvm/Support/Signals.h"
6861
#include "llvm/Support/Windows/WindowsSupport.h"
69-
// winsock2.h must be included before afunix.h. Briefly turn off clang-format to
70-
// avoid error.
71-
// clang-format off
72-
#include <winsock2.h>
73-
#include <afunix.h>
74-
// clang-format on
75-
#include <io.h>
7662
#endif
7763

7864
using namespace llvm;
@@ -659,7 +645,7 @@ raw_fd_ostream::raw_fd_ostream(int fd, bool shouldClose, bool unbuffered,
659645
// Check if this is a console device. This is not equivalent to isatty.
660646
IsWindowsConsole =
661647
::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
662-
#endif // _WIN32
648+
#endif
663649

664650
// Get the starting position.
665651
off_t loc = ::lseek(FD, 0, SEEK_CUR);
@@ -968,153 +954,6 @@ bool raw_fd_stream::classof(const raw_ostream *OS) {
968954
return OS->get_kind() == OStreamKind::OK_FDStream;
969955
}
970956

971-
//===----------------------------------------------------------------------===//
972-
// raw_socket_stream
973-
//===----------------------------------------------------------------------===//
974-
975-
#ifdef _WIN32
976-
WSABalancer::WSABalancer() {
977-
WSADATA WsaData;
978-
::memset(&WsaData, 0, sizeof(WsaData));
979-
if (WSAStartup(MAKEWORD(2, 2), &WsaData) != 0) {
980-
llvm::report_fatal_error("WSAStartup failed");
981-
}
982-
}
983-
984-
WSABalancer::~WSABalancer() { WSACleanup(); }
985-
986-
#endif // _WIN32
987-
988-
static std::error_code getLastSocketErrorCode() {
989-
#ifdef _WIN32
990-
return std::error_code(::WSAGetLastError(), std::system_category());
991-
#else
992-
return std::error_code(errno, std::system_category());
993-
#endif
994-
}
995-
996-
ListeningSocket::ListeningSocket(int SocketFD, StringRef SocketPath)
997-
: FD(SocketFD), SocketPath(SocketPath) {}
998-
999-
ListeningSocket::ListeningSocket(ListeningSocket &&LS)
1000-
: FD(LS.FD), SocketPath(LS.SocketPath) {
1001-
LS.FD = -1;
1002-
}
1003-
1004-
Expected<ListeningSocket> ListeningSocket::createUnix(StringRef SocketPath,
1005-
int MaxBacklog) {
1006-
1007-
#ifdef _WIN32
1008-
WSABalancer _;
1009-
SOCKET MaybeWinsocket = socket(AF_UNIX, SOCK_STREAM, 0);
1010-
if (MaybeWinsocket == INVALID_SOCKET) {
1011-
#else
1012-
int MaybeWinsocket = socket(AF_UNIX, SOCK_STREAM, 0);
1013-
if (MaybeWinsocket == -1) {
1014-
#endif
1015-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
1016-
"socket create failed");
1017-
}
1018-
1019-
struct sockaddr_un Addr;
1020-
memset(&Addr, 0, sizeof(Addr));
1021-
Addr.sun_family = AF_UNIX;
1022-
strncpy(Addr.sun_path, SocketPath.str().c_str(), sizeof(Addr.sun_path) - 1);
1023-
1024-
if (bind(MaybeWinsocket, (struct sockaddr *)&Addr, sizeof(Addr)) == -1) {
1025-
std::error_code Err = getLastSocketErrorCode();
1026-
if (Err == std::errc::address_in_use)
1027-
::close(MaybeWinsocket);
1028-
return llvm::make_error<StringError>(Err, "Bind error");
1029-
}
1030-
if (listen(MaybeWinsocket, MaxBacklog) == -1) {
1031-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
1032-
"Listen error");
1033-
}
1034-
int UnixSocket;
1035-
#ifdef _WIN32
1036-
UnixSocket = _open_osfhandle(MaybeWinsocket, 0);
1037-
#else
1038-
UnixSocket = MaybeWinsocket;
1039-
#endif // _WIN32
1040-
return ListeningSocket{UnixSocket, SocketPath};
1041-
}
1042-
1043-
Expected<std::unique_ptr<raw_socket_stream>> ListeningSocket::accept() {
1044-
int AcceptFD;
1045-
#ifdef _WIN32
1046-
SOCKET WinServerSock = _get_osfhandle(FD);
1047-
SOCKET WinAcceptSock = ::accept(WinServerSock, NULL, NULL);
1048-
AcceptFD = _open_osfhandle(WinAcceptSock, 0);
1049-
#else
1050-
AcceptFD = ::accept(FD, NULL, NULL);
1051-
#endif //_WIN32
1052-
if (AcceptFD == -1)
1053-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
1054-
"Accept failed");
1055-
return std::make_unique<raw_socket_stream>(AcceptFD);
1056-
}
1057-
1058-
ListeningSocket::~ListeningSocket() {
1059-
if (FD == -1)
1060-
return;
1061-
::close(FD);
1062-
unlink(SocketPath.c_str());
1063-
}
1064-
1065-
static Expected<int> GetSocketFD(StringRef SocketPath) {
1066-
#ifdef _WIN32
1067-
SOCKET MaybeWinsocket = socket(AF_UNIX, SOCK_STREAM, 0);
1068-
if (MaybeWinsocket == INVALID_SOCKET) {
1069-
#else
1070-
int MaybeWinsocket = socket(AF_UNIX, SOCK_STREAM, 0);
1071-
if (MaybeWinsocket == -1) {
1072-
#endif // _WIN32
1073-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
1074-
"Create socket failed");
1075-
}
1076-
1077-
struct sockaddr_un Addr;
1078-
memset(&Addr, 0, sizeof(Addr));
1079-
Addr.sun_family = AF_UNIX;
1080-
strncpy(Addr.sun_path, SocketPath.str().c_str(), sizeof(Addr.sun_path) - 1);
1081-
1082-
int status = connect(MaybeWinsocket, (struct sockaddr *)&Addr, sizeof(Addr));
1083-
if (status == -1) {
1084-
return llvm::make_error<StringError>(getLastSocketErrorCode(),
1085-
"Connect socket failed");
1086-
}
1087-
#ifdef _WIN32
1088-
return _open_osfhandle(MaybeWinsocket, 0);
1089-
#else
1090-
return MaybeWinsocket;
1091-
#endif // _WIN32
1092-
}
1093-
1094-
raw_socket_stream::raw_socket_stream(int SocketFD)
1095-
: raw_fd_stream(SocketFD, true) {}
1096-
1097-
Expected<std::unique_ptr<raw_socket_stream>>
1098-
raw_socket_stream::createConnectedUnix(StringRef SocketPath) {
1099-
#ifdef _WIN32
1100-
WSABalancer _;
1101-
#endif // _WIN32
1102-
Expected<int> FD = GetSocketFD(SocketPath);
1103-
if (!FD)
1104-
return FD.takeError();
1105-
return std::make_unique<raw_socket_stream>(*FD);
1106-
}
1107-
1108-
raw_socket_stream::~raw_socket_stream() {}
1109-
1110-
//===----------------------------------------------------------------------===//
1111-
// raw_string_ostream
1112-
//===----------------------------------------------------------------------===//
1113-
1114-
void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
1115-
OS.append(Ptr, Size);
1116-
}
1117-
1118957
//===----------------------------------------------------------------------===//
1119958
// raw_svector_ostream
1120959
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)