1 //===-- SBCommunication.cpp -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/API/SBCommunication.h"
11 #include "lldb/API/SBBroadcaster.h"
12 #include "lldb/Core/Communication.h"
13 #include "lldb/Host/ConnectionFileDescriptor.h"
14 #include "lldb/Host/Host.h"
15 #include "lldb/Utility/Log.h"
18 using namespace lldb_private;
20 SBCommunication::SBCommunication() : m_opaque(NULL), m_opaque_owned(false) {}
22 SBCommunication::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));
27 log->Printf("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
28 "SBCommunication(%p)",
29 broadcaster_name, static_cast<void *>(m_opaque));
32 SBCommunication::~SBCommunication() {
33 if (m_opaque && m_opaque_owned)
36 m_opaque_owned = false;
39 bool SBCommunication::IsValid() const { return m_opaque != NULL; }
41 bool SBCommunication::GetCloseOnEOF() {
43 return m_opaque->GetCloseOnEOF();
47 void SBCommunication::SetCloseOnEOF(bool b) {
49 m_opaque->SetCloseOnEOF(b);
52 ConnectionStatus SBCommunication::Connect(const char *url) {
54 if (!m_opaque->HasConnection())
55 m_opaque->SetConnection(Host::CreateDefaultConnection(url).release());
56 return m_opaque->Connect(url, NULL);
58 return eConnectionStatusNoConnection;
61 ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {
62 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
64 ConnectionStatus status = eConnectionStatusNoConnection;
66 if (m_opaque->HasConnection()) {
67 if (m_opaque->IsConnected())
68 m_opaque->Disconnect();
70 m_opaque->SetConnection(new ConnectionFileDescriptor(fd, owns_fd));
71 if (m_opaque->IsConnected())
72 status = eConnectionStatusSuccess;
74 status = eConnectionStatusLostConnection;
79 "SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
80 static_cast<void *>(m_opaque), fd, owns_fd,
81 Communication::ConnectionStatusAsCString(status));
86 ConnectionStatus SBCommunication::Disconnect() {
87 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
89 ConnectionStatus status = eConnectionStatusNoConnection;
91 status = m_opaque->Disconnect();
94 log->Printf("SBCommunication(%p)::Disconnect () => %s",
95 static_cast<void *>(m_opaque),
96 Communication::ConnectionStatusAsCString(status));
101 bool SBCommunication::IsConnected() const {
102 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
105 result = m_opaque->IsConnected();
108 log->Printf("SBCommunication(%p)::IsConnected () => %i",
109 static_cast<void *>(m_opaque), result);
114 size_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));
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;
123 Timeout<std::micro> timeout = timeout_usec == UINT32_MAX
124 ? Timeout<std::micro>(llvm::None)
125 : std::chrono::microseconds(timeout_usec);
127 bytes_read = m_opaque->Read(dst, dst_len, timeout, status, NULL);
129 status = eConnectionStatusNoConnection;
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));
141 size_t SBCommunication::Write(const void *src, size_t src_len,
142 ConnectionStatus &status) {
143 size_t bytes_written = 0;
145 bytes_written = m_opaque->Write(src, src_len, status, NULL);
147 status = eConnectionStatusNoConnection;
149 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
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));
161 bool SBCommunication::ReadThreadStart() {
162 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
164 bool success = false;
166 success = m_opaque->StartReadThread();
169 log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
170 static_cast<void *>(m_opaque), success);
175 bool SBCommunication::ReadThreadStop() {
176 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
178 log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
179 static_cast<void *>(m_opaque));
181 bool success = false;
183 success = m_opaque->StopReadThread();
186 log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
187 static_cast<void *>(m_opaque), success);
192 bool SBCommunication::ReadThreadIsRunning() {
195 result = m_opaque->ReadThreadIsRunning();
196 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
198 log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
199 static_cast<void *>(m_opaque), result);
203 bool SBCommunication::SetReadThreadBytesReceivedCallback(
204 ReadThreadBytesReceived callback, void *callback_baton) {
205 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
209 m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
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);
223 SBBroadcaster SBCommunication::GetBroadcaster() {
224 SBBroadcaster broadcaster(m_opaque, false);
226 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
229 log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
230 static_cast<void *>(m_opaque),
231 static_cast<void *>(broadcaster.get()));
236 const char *SBCommunication::GetBroadcasterClass() {
237 return Communication::GetStaticBroadcasterClass().AsCString();
242 // SBCommunication::CreateIfNeeded ()
244 // if (m_opaque == NULL)
246 // static uint32_t g_broadcaster_num;
247 // char broadcaster_name[256];
248 // ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
249 // m_opaque = new Communication (broadcaster_name);
250 // m_opaque_owned = true;
252 // assert (m_opaque);