blob: f80b114e222cdd82d3850cac27ac3e0f2447fdcc [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"
Caroline Ticeceb6b132010-10-26 03:11:13 +000013#include "lldb/Core/Log.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000014#include "lldb/Host/ConnectionFileDescriptor.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;
122 if (m_opaque)
123 bytes_read = m_opaque->Read(dst, dst_len, timeout_usec, status, NULL);
124 else
125 status = eConnectionStatusNoConnection;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 if (log)
128 log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
129 ", timeout_usec=%u, &status=%s) => %" PRIu64,
130 static_cast<void *>(m_opaque), static_cast<void *>(dst),
131 static_cast<uint64_t>(dst_len), timeout_usec,
132 Communication::ConnectionStatusAsCString(status),
133 static_cast<uint64_t>(bytes_read));
134 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000135}
136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137size_t SBCommunication::Write(const void *src, size_t src_len,
138 ConnectionStatus &status) {
139 size_t bytes_written = 0;
140 if (m_opaque)
141 bytes_written = m_opaque->Write(src, src_len, status, NULL);
142 else
143 status = eConnectionStatusNoConnection;
144
145 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
146 if (log)
147 log->Printf("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64
148 ", &status=%s) => %" PRIu64,
149 static_cast<void *>(m_opaque), static_cast<const void *>(src),
150 static_cast<uint64_t>(src_len),
151 Communication::ConnectionStatusAsCString(status),
152 static_cast<uint64_t>(bytes_written));
153
154 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155}
156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157bool SBCommunication::ReadThreadStart() {
158 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 bool success = false;
161 if (m_opaque)
162 success = m_opaque->StartReadThread();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 if (log)
165 log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
166 static_cast<void *>(m_opaque), success);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000169}
170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171bool SBCommunication::ReadThreadStop() {
172 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
173 if (log)
174 log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
175 static_cast<void *>(m_opaque));
Greg Clayton48381312010-10-30 04:51:46 +0000176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 bool success = false;
178 if (m_opaque)
179 success = m_opaque->StopReadThread();
Greg Clayton48381312010-10-30 04:51:46 +0000180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 if (log)
182 log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
183 static_cast<void *>(m_opaque), success);
Greg Clayton48381312010-10-30 04:51:46 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000186}
187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188bool SBCommunication::ReadThreadIsRunning() {
189 bool result = false;
190 if (m_opaque)
191 result = m_opaque->ReadThreadIsRunning();
192 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
193 if (log)
194 log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
195 static_cast<void *>(m_opaque), result);
196 return result;
197}
198
199bool SBCommunication::SetReadThreadBytesReceivedCallback(
200 ReadThreadBytesReceived callback, void *callback_baton) {
201 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
202
203 bool result = false;
204 if (m_opaque) {
205 m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
206 result = true;
207 }
208
209 if (log)
210 log->Printf("SBCommunication(%p)::SetReadThreadBytesReceivedCallback "
211 "(callback=%p, baton=%p) => %i",
212 static_cast<void *>(m_opaque),
213 reinterpret_cast<void *>(reinterpret_cast<intptr_t>(callback)),
214 static_cast<void *>(callback_baton), result);
215
216 return result;
217}
218
219SBBroadcaster SBCommunication::GetBroadcaster() {
220 SBBroadcaster broadcaster(m_opaque, false);
221
222 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
223
224 if (log)
225 log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
226 static_cast<void *>(m_opaque),
227 static_cast<void *>(broadcaster.get()));
228
229 return broadcaster;
230}
231
232const char *SBCommunication::GetBroadcasterClass() {
233 return Communication::GetStaticBroadcasterClass().AsCString();
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000234}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235
236//
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237// void
238// SBCommunication::CreateIfNeeded ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000239//{
Greg Clayton66111032010-06-23 01:19:29 +0000240// if (m_opaque == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241// {
242// static uint32_t g_broadcaster_num;
243// char broadcaster_name[256];
244// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
Greg Clayton66111032010-06-23 01:19:29 +0000245// m_opaque = new Communication (broadcaster_name);
246// m_opaque_owned = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000247// }
Greg Clayton66111032010-06-23 01:19:29 +0000248// assert (m_opaque);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000249//}
250//
251//