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