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/Core/Log.h"
14 #include "lldb/Host/ConnectionFileDescriptor.h"
17 using namespace lldb_private;
19 SBCommunication::SBCommunication() : m_opaque(NULL), m_opaque_owned(false) {}
21 SBCommunication::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));
26 log->Printf("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
27 "SBCommunication(%p)",
28 broadcaster_name, static_cast<void *>(m_opaque));
31 SBCommunication::~SBCommunication() {
32 if (m_opaque && m_opaque_owned)
35 m_opaque_owned = false;
38 bool SBCommunication::IsValid() const { return m_opaque != NULL; }
40 bool SBCommunication::GetCloseOnEOF() {
42 return m_opaque->GetCloseOnEOF();
46 void SBCommunication::SetCloseOnEOF(bool b) {
48 m_opaque->SetCloseOnEOF(b);
51 ConnectionStatus SBCommunication::Connect(const char *url) {
53 if (!m_opaque->HasConnection())
54 m_opaque->SetConnection(Connection::CreateDefaultConnection(url));
55 return m_opaque->Connect(url, NULL);
57 return eConnectionStatusNoConnection;
60 ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {
61 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
63 ConnectionStatus status = eConnectionStatusNoConnection;
65 if (m_opaque->HasConnection()) {
66 if (m_opaque->IsConnected())
67 m_opaque->Disconnect();
69 m_opaque->SetConnection(new ConnectionFileDescriptor(fd, owns_fd));
70 if (m_opaque->IsConnected())
71 status = eConnectionStatusSuccess;
73 status = eConnectionStatusLostConnection;
78 "SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
79 static_cast<void *>(m_opaque), fd, owns_fd,
80 Communication::ConnectionStatusAsCString(status));
85 ConnectionStatus SBCommunication::Disconnect() {
86 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
88 ConnectionStatus status = eConnectionStatusNoConnection;
90 status = m_opaque->Disconnect();
93 log->Printf("SBCommunication(%p)::Disconnect () => %s",
94 static_cast<void *>(m_opaque),
95 Communication::ConnectionStatusAsCString(status));
100 bool SBCommunication::IsConnected() const {
101 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
104 result = m_opaque->IsConnected();
107 log->Printf("SBCommunication(%p)::IsConnected () => %i",
108 static_cast<void *>(m_opaque), result);
113 size_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));
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 Timeout<std::micro> timeout = timeout_usec == UINT32_MAX
123 ? Timeout<std::micro>(llvm::None)
124 : std::chrono::microseconds(timeout_usec);
126 bytes_read = m_opaque->Read(dst, dst_len, timeout, status, NULL);
128 status = eConnectionStatusNoConnection;
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));
140 size_t SBCommunication::Write(const void *src, size_t src_len,
141 ConnectionStatus &status) {
142 size_t bytes_written = 0;
144 bytes_written = m_opaque->Write(src, src_len, status, NULL);
146 status = eConnectionStatusNoConnection;
148 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
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));
160 bool SBCommunication::ReadThreadStart() {
161 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
163 bool success = false;
165 success = m_opaque->StartReadThread();
168 log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
169 static_cast<void *>(m_opaque), success);
174 bool SBCommunication::ReadThreadStop() {
175 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
177 log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
178 static_cast<void *>(m_opaque));
180 bool success = false;
182 success = m_opaque->StopReadThread();
185 log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
186 static_cast<void *>(m_opaque), success);
191 bool SBCommunication::ReadThreadIsRunning() {
194 result = m_opaque->ReadThreadIsRunning();
195 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
197 log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
198 static_cast<void *>(m_opaque), result);
202 bool SBCommunication::SetReadThreadBytesReceivedCallback(
203 ReadThreadBytesReceived callback, void *callback_baton) {
204 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
208 m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
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);
222 SBBroadcaster SBCommunication::GetBroadcaster() {
223 SBBroadcaster broadcaster(m_opaque, false);
225 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
228 log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
229 static_cast<void *>(m_opaque),
230 static_cast<void *>(broadcaster.get()));
235 const char *SBCommunication::GetBroadcasterClass() {
236 return Communication::GetStaticBroadcasterClass().AsCString();
241 // SBCommunication::CreateIfNeeded ()
243 // if (m_opaque == NULL)
245 // static uint32_t g_broadcaster_num;
246 // char broadcaster_name[256];
247 // ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
248 // m_opaque = new Communication (broadcaster_name);
249 // m_opaque_owned = true;
251 // assert (m_opaque);