1 //===-- ConnectionFileDescriptorPosix.h -------------------------*- 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 #ifndef LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 10 #define LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 11 12 #include <atomic> 13 #include <memory> 14 #include <mutex> 15 16 #include "lldb/lldb-forward.h" 17 18 #include "lldb/Host/Pipe.h" 19 #include "lldb/Host/Socket.h" 20 #include "lldb/Utility/Connection.h" 21 #include "lldb/Utility/IOObject.h" 22 23 namespace lldb_private { 24 25 class Status; 26 class Socket; 27 class SocketAddress; 28 29 class ConnectionFileDescriptor : public Connection { 30 public: 31 typedef llvm::function_ref<void(llvm::StringRef local_socket_id)> 32 socket_id_callback_type; 33 34 ConnectionFileDescriptor(); 35 36 ConnectionFileDescriptor(int fd, bool owns_fd); 37 38 ConnectionFileDescriptor(Socket *socket); 39 40 ~ConnectionFileDescriptor() override; 41 42 bool IsConnected() const override; 43 44 lldb::ConnectionStatus Connect(llvm::StringRef url, 45 Status *error_ptr) override; 46 47 lldb::ConnectionStatus Connect(llvm::StringRef url, 48 socket_id_callback_type socket_id_callback, 49 Status *error_ptr); 50 51 lldb::ConnectionStatus Disconnect(Status *error_ptr) override; 52 53 size_t Read(void *dst, size_t dst_len, const Timeout<std::micro> &timeout, 54 lldb::ConnectionStatus &status, Status *error_ptr) override; 55 56 size_t Write(const void *src, size_t src_len, lldb::ConnectionStatus &status, 57 Status *error_ptr) override; 58 59 std::string GetURI() override; 60 61 lldb::ConnectionStatus BytesAvailable(const Timeout<std::micro> &timeout, 62 Status *error_ptr); 63 64 bool InterruptRead() override; 65 66 lldb::IOObjectSP GetReadObject() override { return m_io_sp; } 67 68 protected: 69 void OpenCommandPipe(); 70 71 void CloseCommandPipe(); 72 73 lldb::ConnectionStatus 74 AcceptSocket(Socket::SocketProtocol socket_protocol, 75 llvm::StringRef socket_name, 76 llvm::function_ref<void(Socket &)> post_listen_callback, 77 Status *error_ptr); 78 79 lldb::ConnectionStatus ConnectSocket(Socket::SocketProtocol socket_protocol, 80 llvm::StringRef socket_name, 81 Status *error_ptr); 82 83 lldb::ConnectionStatus AcceptTCP(llvm::StringRef host_and_port, 84 socket_id_callback_type socket_id_callback, 85 Status *error_ptr); 86 87 lldb::ConnectionStatus ConnectTCP(llvm::StringRef host_and_port, 88 socket_id_callback_type socket_id_callback, 89 Status *error_ptr); 90 91 lldb::ConnectionStatus ConnectUDP(llvm::StringRef args, 92 socket_id_callback_type socket_id_callback, 93 Status *error_ptr); 94 95 lldb::ConnectionStatus 96 ConnectNamedSocket(llvm::StringRef socket_name, 97 socket_id_callback_type socket_id_callback, 98 Status *error_ptr); 99 100 lldb::ConnectionStatus 101 AcceptNamedSocket(llvm::StringRef socket_name, 102 socket_id_callback_type socket_id_callback, 103 Status *error_ptr); 104 105 lldb::ConnectionStatus 106 AcceptAbstractSocket(llvm::StringRef socket_name, 107 socket_id_callback_type socket_id_callback, 108 Status *error_ptr); 109 110 lldb::ConnectionStatus 111 ConnectAbstractSocket(llvm::StringRef socket_name, 112 socket_id_callback_type socket_id_callback, 113 Status *error_ptr); 114 115 lldb::ConnectionStatus ConnectFD(llvm::StringRef args, 116 socket_id_callback_type socket_id_callback, 117 Status *error_ptr); 118 119 lldb::ConnectionStatus ConnectFile(llvm::StringRef args, 120 socket_id_callback_type socket_id_callback, 121 Status *error_ptr); 122 123 lldb::ConnectionStatus 124 ConnectSerialPort(llvm::StringRef args, 125 socket_id_callback_type socket_id_callback, 126 Status *error_ptr); 127 128 lldb::IOObjectSP m_io_sp; 129 130 Pipe m_pipe; 131 std::recursive_mutex m_mutex; 132 std::atomic<bool> m_shutting_down; // This marks that we are shutting down so 133 // if we get woken up from 134 // BytesAvailable to disconnect, we won't try to read again. 135 136 std::string m_uri; 137 138 private: 139 void InitializeSocket(Socket *socket); 140 141 ConnectionFileDescriptor(const ConnectionFileDescriptor &) = delete; 142 const ConnectionFileDescriptor & 143 operator=(const ConnectionFileDescriptor &) = delete; 144 }; 145 146 } // namespace lldb_private 147 148 #endif // LLDB_HOST_POSIX_CONNECTIONFILEDESCRIPTORPOSIX_H 149