blob: 63b672efe3c02e302c94793ba98d3d3ef29b89c5 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBCommunication.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBCommunication.h"
11#include "lldb/API/SBBroadcaster.h"
12#include "lldb/Core/Communication.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000013#include "lldb/Host/ConnectionFileDescriptor.h"
Pavel Labath4ccd9952017-06-27 10:33:14 +000014#include "lldb/Host/Host.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000015#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016
17using namespace lldb;
18using namespace lldb_private;
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020SBCommunication::SBCommunication() : m_opaque(NULL), m_opaque_owned(false) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
Kate Stoneb9c1b512016-09-06 20:57:50 +000022SBCommunication::SBCommunication(const char *broadcaster_name)
23 : m_opaque(new Communication(broadcaster_name)), m_opaque_owned(true) {
24 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025
Kate Stoneb9c1b512016-09-06 20:57:50 +000026 if (log)
27 log->Printf("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
28 "SBCommunication(%p)",
29 broadcaster_name, static_cast<void *>(m_opaque));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030}
31
Kate Stoneb9c1b512016-09-06 20:57:50 +000032SBCommunication::~SBCommunication() {
33 if (m_opaque && m_opaque_owned)
34 delete m_opaque;
35 m_opaque = NULL;
36 m_opaque_owned = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037}
38
Kate Stoneb9c1b512016-09-06 20:57:50 +000039bool SBCommunication::IsValid() const { return m_opaque != NULL; }
40
41bool SBCommunication::GetCloseOnEOF() {
42 if (m_opaque)
43 return m_opaque->GetCloseOnEOF();
44 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
Kate Stoneb9c1b512016-09-06 20:57:50 +000047void SBCommunication::SetCloseOnEOF(bool b) {
48 if (m_opaque)
49 m_opaque->SetCloseOnEOF(b);
Johnny Chendd68ab82011-06-20 22:30:48 +000050}
51
Kate Stoneb9c1b512016-09-06 20:57:50 +000052ConnectionStatus SBCommunication::Connect(const char *url) {
53 if (m_opaque) {
54 if (!m_opaque->HasConnection())
Pavel Labath4ccd9952017-06-27 10:33:14 +000055 m_opaque->SetConnection(Host::CreateDefaultConnection(url).release());
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 return m_opaque->Connect(url, NULL);
57 }
58 return eConnectionStatusNoConnection;
Greg Claytond46c87a2010-12-04 02:39:47 +000059}
60
Kate Stoneb9c1b512016-09-06 20:57:50 +000061ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {
62 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Greg Claytond46c87a2010-12-04 02:39:47 +000063
Kate Stoneb9c1b512016-09-06 20:57:50 +000064 ConnectionStatus status = eConnectionStatusNoConnection;
65 if (m_opaque) {
66 if (m_opaque->HasConnection()) {
67 if (m_opaque->IsConnected())
68 m_opaque->Disconnect();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 m_opaque->SetConnection(new ConnectionFileDescriptor(fd, owns_fd));
71 if (m_opaque->IsConnected())
72 status = eConnectionStatusSuccess;
Greg Clayton48381312010-10-30 04:51:46 +000073 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 status = eConnectionStatusLostConnection;
75 }
Greg Clayton48381312010-10-30 04:51:46 +000076
Kate Stoneb9c1b512016-09-06 20:57:50 +000077 if (log)
78 log->Printf(
79 "SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
80 static_cast<void *>(m_opaque), fd, owns_fd,
81 Communication::ConnectionStatusAsCString(status));
82
83 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000084}
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086ConnectionStatus SBCommunication::Disconnect() {
87 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000088
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 ConnectionStatus status = eConnectionStatusNoConnection;
90 if (m_opaque)
91 status = m_opaque->Disconnect();
Greg Clayton48381312010-10-30 04:51:46 +000092
Kate Stoneb9c1b512016-09-06 20:57:50 +000093 if (log)
94 log->Printf("SBCommunication(%p)::Disconnect () => %s",
95 static_cast<void *>(m_opaque),
96 Communication::ConnectionStatusAsCString(status));
Greg Clayton48381312010-10-30 04:51:46 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000099}
100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101bool SBCommunication::IsConnected() const {
102 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
103 bool result = false;
104 if (m_opaque)
105 result = m_opaque->IsConnected();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 if (log)
108 log->Printf("SBCommunication(%p)::IsConnected () => %i",
109 static_cast<void *>(m_opaque), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000112}
113
Kate Stoneb9c1b512016-09-06 20:57:50 +0000114size_t SBCommunication::Read(void *dst, size_t dst_len, uint32_t timeout_usec,
115 ConnectionStatus &status) {
116 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
117 if (log)
118 log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
119 ", timeout_usec=%u, &status)...",
120 static_cast<void *>(m_opaque), static_cast<void *>(dst),
121 static_cast<uint64_t>(dst_len), timeout_usec);
122 size_t bytes_read = 0;
Pavel Labathc4063ee2016-11-25 11:58:44 +0000123 Timeout<std::micro> timeout = timeout_usec == UINT32_MAX
124 ? Timeout<std::micro>(llvm::None)
125 : std::chrono::microseconds(timeout_usec);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 if (m_opaque)
Pavel Labathc4063ee2016-11-25 11:58:44 +0000127 bytes_read = m_opaque->Read(dst, dst_len, timeout, status, NULL);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 else
129 status = eConnectionStatusNoConnection;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 if (log)
132 log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
133 ", timeout_usec=%u, &status=%s) => %" PRIu64,
134 static_cast<void *>(m_opaque), static_cast<void *>(dst),
135 static_cast<uint64_t>(dst_len), timeout_usec,
136 Communication::ConnectionStatusAsCString(status),
137 static_cast<uint64_t>(bytes_read));
138 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000139}
140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141size_t SBCommunication::Write(const void *src, size_t src_len,
142 ConnectionStatus &status) {
143 size_t bytes_written = 0;
144 if (m_opaque)
145 bytes_written = m_opaque->Write(src, src_len, status, NULL);
146 else
147 status = eConnectionStatusNoConnection;
148
149 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
150 if (log)
151 log->Printf("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64
152 ", &status=%s) => %" PRIu64,
153 static_cast<void *>(m_opaque), static_cast<const void *>(src),
154 static_cast<uint64_t>(src_len),
155 Communication::ConnectionStatusAsCString(status),
156 static_cast<uint64_t>(bytes_written));
157
158 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000159}
160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161bool SBCommunication::ReadThreadStart() {
162 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 bool success = false;
165 if (m_opaque)
166 success = m_opaque->StartReadThread();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 if (log)
169 log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
170 static_cast<void *>(m_opaque), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000173}
174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175bool SBCommunication::ReadThreadStop() {
176 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
177 if (log)
178 log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
179 static_cast<void *>(m_opaque));
Greg Clayton48381312010-10-30 04:51:46 +0000180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 bool success = false;
182 if (m_opaque)
183 success = m_opaque->StopReadThread();
Greg Clayton48381312010-10-30 04:51:46 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 if (log)
186 log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
187 static_cast<void *>(m_opaque), success);
Greg Clayton48381312010-10-30 04:51:46 +0000188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190}
191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192bool SBCommunication::ReadThreadIsRunning() {
193 bool result = false;
194 if (m_opaque)
195 result = m_opaque->ReadThreadIsRunning();
196 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
197 if (log)
198 log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
199 static_cast<void *>(m_opaque), result);
200 return result;
201}
202
203bool SBCommunication::SetReadThreadBytesReceivedCallback(
204 ReadThreadBytesReceived callback, void *callback_baton) {
205 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
206
207 bool result = false;
208 if (m_opaque) {
209 m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
210 result = true;
211 }
212
213 if (log)
214 log->Printf("SBCommunication(%p)::SetReadThreadBytesReceivedCallback "
215 "(callback=%p, baton=%p) => %i",
216 static_cast<void *>(m_opaque),
217 reinterpret_cast<void *>(reinterpret_cast<intptr_t>(callback)),
218 static_cast<void *>(callback_baton), result);
219
220 return result;
221}
222
223SBBroadcaster SBCommunication::GetBroadcaster() {
224 SBBroadcaster broadcaster(m_opaque, false);
225
226 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
227
228 if (log)
229 log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
230 static_cast<void *>(m_opaque),
231 static_cast<void *>(broadcaster.get()));
232
233 return broadcaster;
234}
235
236const char *SBCommunication::GetBroadcasterClass() {
237 return Communication::GetStaticBroadcasterClass().AsCString();
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000238}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000239
240//
Kate Stoneb9c1b512016-09-06 20:57:50 +0000241// void
242// SBCommunication::CreateIfNeeded ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000243//{
Greg Clayton66111032010-06-23 01:19:29 +0000244// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000245// {
246// static uint32_t g_broadcaster_num;
247// char broadcaster_name[256];
248// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000249// m_opaque = new Communication (broadcaster_name);
250// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000251// }
Greg Clayton66111032010-06-23 01:19:29 +0000252// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000253//}
254//
255//