xref: /llvm-project/lldb/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h (revision ae7b5af904850db71308915836f32a8d79553dd8)
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