blob: 8ebc33ca26a6d784cb48be47c8a88aa43895eaae [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"
Zachary Turner6f9e6902017-03-03 20:56:28 +000014#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
16using namespace lldb;
17using namespace lldb_private;
18
Kate Stoneb9c1b512016-09-06 20:57:50 +000019SBCommunication::SBCommunication() : m_opaque(NULL), m_opaque_owned(false) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020
Kate Stoneb9c1b512016-09-06 20:57:50 +000021SBCommunication::SBCommunication(const char *broadcaster_name)
22 : m_opaque(new Communication(broadcaster_name)), m_opaque_owned(true) {
23 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024
Kate Stoneb9c1b512016-09-06 20:57:50 +000025 if (log)
26 log->Printf("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
27 "SBCommunication(%p)",
28 broadcaster_name, static_cast<void *>(m_opaque));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029}
30
Kate Stoneb9c1b512016-09-06 20:57:50 +000031SBCommunication::~SBCommunication() {
32 if (m_opaque && m_opaque_owned)
33 delete m_opaque;
34 m_opaque = NULL;
35 m_opaque_owned = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036}
37
Kate Stoneb9c1b512016-09-06 20:57:50 +000038bool SBCommunication::IsValid() const { return m_opaque != NULL; }
39
40bool SBCommunication::GetCloseOnEOF() {
41 if (m_opaque)
42 return m_opaque->GetCloseOnEOF();
43 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044}
45
Kate Stoneb9c1b512016-09-06 20:57:50 +000046void SBCommunication::SetCloseOnEOF(bool b) {
47 if (m_opaque)
48 m_opaque->SetCloseOnEOF(b);
Johnny Chendd68ab82011-06-20 22:30:48 +000049}
50
Kate Stoneb9c1b512016-09-06 20:57:50 +000051ConnectionStatus SBCommunication::Connect(const char *url) {
52 if (m_opaque) {
53 if (!m_opaque->HasConnection())
54 m_opaque->SetConnection(Connection::CreateDefaultConnection(url));
55 return m_opaque->Connect(url, NULL);
56 }
57 return eConnectionStatusNoConnection;
Greg Claytond46c87a2010-12-04 02:39:47 +000058}
59
Kate Stoneb9c1b512016-09-06 20:57:50 +000060ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {
61 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Greg Claytond46c87a2010-12-04 02:39:47 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 ConnectionStatus status = eConnectionStatusNoConnection;
64 if (m_opaque) {
65 if (m_opaque->HasConnection()) {
66 if (m_opaque->IsConnected())
67 m_opaque->Disconnect();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 m_opaque->SetConnection(new ConnectionFileDescriptor(fd, owns_fd));
70 if (m_opaque->IsConnected())
71 status = eConnectionStatusSuccess;
Greg Clayton48381312010-10-30 04:51:46 +000072 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 status = eConnectionStatusLostConnection;
74 }
Greg Clayton48381312010-10-30 04:51:46 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 if (log)
77 log->Printf(
78 "SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
79 static_cast<void *>(m_opaque), fd, owns_fd,
80 Communication::ConnectionStatusAsCString(status));
81
82 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083}
84
Kate Stoneb9c1b512016-09-06 20:57:50 +000085ConnectionStatus SBCommunication::Disconnect() {
86 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 ConnectionStatus status = eConnectionStatusNoConnection;
89 if (m_opaque)
90 status = m_opaque->Disconnect();
Greg Clayton48381312010-10-30 04:51:46 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 if (log)
93 log->Printf("SBCommunication(%p)::Disconnect () => %s",
94 static_cast<void *>(m_opaque),
95 Communication::ConnectionStatusAsCString(status));
Greg Clayton48381312010-10-30 04:51:46 +000096
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 return status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000098}
99
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100bool SBCommunication::IsConnected() const {
101 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
102 bool result = false;
103 if (m_opaque)
104 result = m_opaque->IsConnected();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 if (log)
107 log->Printf("SBCommunication(%p)::IsConnected () => %i",
108 static_cast<void *>(m_opaque), result);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000111}
112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113size_t SBCommunication::Read(void *dst, size_t dst_len, uint32_t timeout_usec,
114 ConnectionStatus &status) {
115 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
116 if (log)
117 log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
118 ", timeout_usec=%u, &status)...",
119 static_cast<void *>(m_opaque), static_cast<void *>(dst),
120 static_cast<uint64_t>(dst_len), timeout_usec);
121 size_t bytes_read = 0;
Pavel Labathc4063ee2016-11-25 11:58:44 +0000122 Timeout<std::micro> timeout = timeout_usec == UINT32_MAX
123 ? Timeout<std::micro>(llvm::None)
124 : std::chrono::microseconds(timeout_usec);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 if (m_opaque)
Pavel Labathc4063ee2016-11-25 11:58:44 +0000126 bytes_read = m_opaque->Read(dst, dst_len, timeout, status, NULL);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 else
128 status = eConnectionStatusNoConnection;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 if (log)
131 log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
132 ", timeout_usec=%u, &status=%s) => %" PRIu64,
133 static_cast<void *>(m_opaque), static_cast<void *>(dst),
134 static_cast<uint64_t>(dst_len), timeout_usec,
135 Communication::ConnectionStatusAsCString(status),
136 static_cast<uint64_t>(bytes_read));
137 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138}
139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140size_t SBCommunication::Write(const void *src, size_t src_len,
141 ConnectionStatus &status) {
142 size_t bytes_written = 0;
143 if (m_opaque)
144 bytes_written = m_opaque->Write(src, src_len, status, NULL);
145 else
146 status = eConnectionStatusNoConnection;
147
148 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
149 if (log)
150 log->Printf("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64
151 ", &status=%s) => %" PRIu64,
152 static_cast<void *>(m_opaque), static_cast<const void *>(src),
153 static_cast<uint64_t>(src_len),
154 Communication::ConnectionStatusAsCString(status),
155 static_cast<uint64_t>(bytes_written));
156
157 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158}
159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160bool SBCommunication::ReadThreadStart() {
161 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000162
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 bool success = false;
164 if (m_opaque)
165 success = m_opaque->StartReadThread();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 if (log)
168 log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
169 static_cast<void *>(m_opaque), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000172}
173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174bool SBCommunication::ReadThreadStop() {
175 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
176 if (log)
177 log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
178 static_cast<void *>(m_opaque));
Greg Clayton48381312010-10-30 04:51:46 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 bool success = false;
181 if (m_opaque)
182 success = m_opaque->StopReadThread();
Greg Clayton48381312010-10-30 04:51:46 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 if (log)
185 log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
186 static_cast<void *>(m_opaque), success);
Greg Clayton48381312010-10-30 04:51:46 +0000187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000189}
190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191bool SBCommunication::ReadThreadIsRunning() {
192 bool result = false;
193 if (m_opaque)
194 result = m_opaque->ReadThreadIsRunning();
195 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
196 if (log)
197 log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
198 static_cast<void *>(m_opaque), result);
199 return result;
200}
201
202bool SBCommunication::SetReadThreadBytesReceivedCallback(
203 ReadThreadBytesReceived callback, void *callback_baton) {
204 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
205
206 bool result = false;
207 if (m_opaque) {
208 m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
209 result = true;
210 }
211
212 if (log)
213 log->Printf("SBCommunication(%p)::SetReadThreadBytesReceivedCallback "
214 "(callback=%p, baton=%p) => %i",
215 static_cast<void *>(m_opaque),
216 reinterpret_cast<void *>(reinterpret_cast<intptr_t>(callback)),
217 static_cast<void *>(callback_baton), result);
218
219 return result;
220}
221
222SBBroadcaster SBCommunication::GetBroadcaster() {
223 SBBroadcaster broadcaster(m_opaque, false);
224
225 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
226
227 if (log)
228 log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
229 static_cast<void *>(m_opaque),
230 static_cast<void *>(broadcaster.get()));
231
232 return broadcaster;
233}
234
235const char *SBCommunication::GetBroadcasterClass() {
236 return Communication::GetStaticBroadcasterClass().AsCString();
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000237}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238
239//
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240// void
241// SBCommunication::CreateIfNeeded ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242//{
Greg Clayton66111032010-06-23 01:19:29 +0000243// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000244// {
245// static uint32_t g_broadcaster_num;
246// char broadcaster_name[256];
247// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000248// m_opaque = new Communication (broadcaster_name);
249// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000250// }
Greg Clayton66111032010-06-23 01:19:29 +0000251// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000252//}
253//
254//