2010-06-09 00:52:24 +08:00
|
|
|
//===-- SBCommunication.cpp -------------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "lldb/API/SBCommunication.h"
|
|
|
|
#include "lldb/API/SBBroadcaster.h"
|
|
|
|
#include "lldb/Core/Communication.h"
|
2014-10-07 05:22:36 +08:00
|
|
|
#include "lldb/Host/ConnectionFileDescriptor.h"
|
2017-06-27 18:33:14 +08:00
|
|
|
#include "lldb/Host/Host.h"
|
2017-03-04 04:56:28 +08:00
|
|
|
#include "lldb/Utility/Log.h"
|
2010-06-09 00:52:24 +08:00
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
SBCommunication::SBCommunication() : m_opaque(NULL), m_opaque_owned(false) {}
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
SBCommunication::SBCommunication(const char *broadcaster_name)
|
|
|
|
: m_opaque(new Communication(broadcaster_name)), m_opaque_owned(true) {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication::SBCommunication (broadcaster_name=\"%s\") => "
|
|
|
|
"SBCommunication(%p)",
|
|
|
|
broadcaster_name, static_cast<void *>(m_opaque));
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
SBCommunication::~SBCommunication() {
|
|
|
|
if (m_opaque && m_opaque_owned)
|
|
|
|
delete m_opaque;
|
|
|
|
m_opaque = NULL;
|
|
|
|
m_opaque_owned = false;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::IsValid() const { return m_opaque != NULL; }
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::GetCloseOnEOF() {
|
|
|
|
if (m_opaque)
|
|
|
|
return m_opaque->GetCloseOnEOF();
|
|
|
|
return false;
|
2011-06-21 06:30:48 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
void SBCommunication::SetCloseOnEOF(bool b) {
|
|
|
|
if (m_opaque)
|
|
|
|
m_opaque->SetCloseOnEOF(b);
|
2010-12-04 10:39:47 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
ConnectionStatus SBCommunication::Connect(const char *url) {
|
|
|
|
if (m_opaque) {
|
|
|
|
if (!m_opaque->HasConnection())
|
2017-06-27 18:33:14 +08:00
|
|
|
m_opaque->SetConnection(Host::CreateDefaultConnection(url).release());
|
2016-09-07 04:57:50 +08:00
|
|
|
return m_opaque->Connect(url, NULL);
|
|
|
|
}
|
|
|
|
return eConnectionStatusNoConnection;
|
2010-12-04 10:39:47 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
ConnectionStatus status = eConnectionStatusNoConnection;
|
|
|
|
if (m_opaque) {
|
|
|
|
if (m_opaque->HasConnection()) {
|
|
|
|
if (m_opaque->IsConnected())
|
|
|
|
m_opaque->Disconnect();
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
m_opaque->SetConnection(new ConnectionFileDescriptor(fd, owns_fd));
|
|
|
|
if (m_opaque->IsConnected())
|
|
|
|
status = eConnectionStatusSuccess;
|
|
|
|
else
|
|
|
|
status = eConnectionStatusLostConnection;
|
|
|
|
}
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf(
|
|
|
|
"SBCommunication(%p)::AdoptFileDescriptor (fd=%d, ownd_fd=%i) => %s",
|
|
|
|
static_cast<void *>(m_opaque), fd, owns_fd,
|
|
|
|
Communication::ConnectionStatusAsCString(status));
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return status;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
ConnectionStatus SBCommunication::Disconnect() {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
ConnectionStatus status = eConnectionStatusNoConnection;
|
|
|
|
if (m_opaque)
|
|
|
|
status = m_opaque->Disconnect();
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::Disconnect () => %s",
|
|
|
|
static_cast<void *>(m_opaque),
|
|
|
|
Communication::ConnectionStatusAsCString(status));
|
|
|
|
|
|
|
|
return status;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::IsConnected() const {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
bool result = false;
|
|
|
|
if (m_opaque)
|
|
|
|
result = m_opaque->IsConnected();
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::IsConnected () => %i",
|
|
|
|
static_cast<void *>(m_opaque), result);
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return false;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
size_t SBCommunication::Read(void *dst, size_t dst_len, uint32_t timeout_usec,
|
|
|
|
ConnectionStatus &status) {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
|
|
|
|
", timeout_usec=%u, &status)...",
|
|
|
|
static_cast<void *>(m_opaque), static_cast<void *>(dst),
|
|
|
|
static_cast<uint64_t>(dst_len), timeout_usec);
|
|
|
|
size_t bytes_read = 0;
|
2016-11-25 19:58:44 +08:00
|
|
|
Timeout<std::micro> timeout = timeout_usec == UINT32_MAX
|
|
|
|
? Timeout<std::micro>(llvm::None)
|
|
|
|
: std::chrono::microseconds(timeout_usec);
|
2016-09-07 04:57:50 +08:00
|
|
|
if (m_opaque)
|
2016-11-25 19:58:44 +08:00
|
|
|
bytes_read = m_opaque->Read(dst, dst_len, timeout, status, NULL);
|
2016-09-07 04:57:50 +08:00
|
|
|
else
|
|
|
|
status = eConnectionStatusNoConnection;
|
|
|
|
|
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::Read (dst=%p, dst_len=%" PRIu64
|
|
|
|
", timeout_usec=%u, &status=%s) => %" PRIu64,
|
|
|
|
static_cast<void *>(m_opaque), static_cast<void *>(dst),
|
|
|
|
static_cast<uint64_t>(dst_len), timeout_usec,
|
|
|
|
Communication::ConnectionStatusAsCString(status),
|
|
|
|
static_cast<uint64_t>(bytes_read));
|
|
|
|
return bytes_read;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
size_t SBCommunication::Write(const void *src, size_t src_len,
|
|
|
|
ConnectionStatus &status) {
|
|
|
|
size_t bytes_written = 0;
|
|
|
|
if (m_opaque)
|
|
|
|
bytes_written = m_opaque->Write(src, src_len, status, NULL);
|
|
|
|
else
|
|
|
|
status = eConnectionStatusNoConnection;
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::Write (src=%p, src_len=%" PRIu64
|
|
|
|
", &status=%s) => %" PRIu64,
|
|
|
|
static_cast<void *>(m_opaque), static_cast<const void *>(src),
|
|
|
|
static_cast<uint64_t>(src_len),
|
|
|
|
Communication::ConnectionStatusAsCString(status),
|
|
|
|
static_cast<uint64_t>(bytes_written));
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return 0;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::ReadThreadStart() {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool success = false;
|
|
|
|
if (m_opaque)
|
|
|
|
success = m_opaque->StartReadThread();
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::ReadThreadStart () => %i",
|
|
|
|
static_cast<void *>(m_opaque), success);
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return success;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::ReadThreadStop() {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::ReadThreadStop ()...",
|
|
|
|
static_cast<void *>(m_opaque));
|
2010-06-09 00:52:24 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool success = false;
|
|
|
|
if (m_opaque)
|
|
|
|
success = m_opaque->StopReadThread();
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::ReadThreadStop () => %i",
|
|
|
|
static_cast<void *>(m_opaque), success);
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return success;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::ReadThreadIsRunning() {
|
|
|
|
bool result = false;
|
|
|
|
if (m_opaque)
|
|
|
|
result = m_opaque->ReadThreadIsRunning();
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::ReadThreadIsRunning () => %i",
|
|
|
|
static_cast<void *>(m_opaque), result);
|
|
|
|
return result;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
bool SBCommunication::SetReadThreadBytesReceivedCallback(
|
|
|
|
ReadThreadBytesReceived callback, void *callback_baton) {
|
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
|
|
|
|
|
|
|
bool result = false;
|
|
|
|
if (m_opaque) {
|
|
|
|
m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);
|
|
|
|
result = true;
|
|
|
|
}
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::SetReadThreadBytesReceivedCallback "
|
|
|
|
"(callback=%p, baton=%p) => %i",
|
|
|
|
static_cast<void *>(m_opaque),
|
|
|
|
reinterpret_cast<void *>(reinterpret_cast<intptr_t>(callback)),
|
|
|
|
static_cast<void *>(callback_baton), result);
|
2010-10-26 11:11:13 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return result;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
SBBroadcaster SBCommunication::GetBroadcaster() {
|
|
|
|
SBBroadcaster broadcaster(m_opaque, false);
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
if (log)
|
|
|
|
log->Printf("SBCommunication(%p)::GetBroadcaster () => SBBroadcaster (%p)",
|
|
|
|
static_cast<void *>(m_opaque),
|
|
|
|
static_cast<void *>(broadcaster.get()));
|
2010-10-30 12:51:46 +08:00
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
return broadcaster;
|
2010-06-09 00:52:24 +08:00
|
|
|
}
|
|
|
|
|
2016-09-07 04:57:50 +08:00
|
|
|
const char *SBCommunication::GetBroadcasterClass() {
|
|
|
|
return Communication::GetStaticBroadcasterClass().AsCString();
|
2012-02-16 14:50:00 +08:00
|
|
|
}
|
2010-06-09 00:52:24 +08:00
|
|
|
|
|
|
|
//
|
2016-09-07 04:57:50 +08:00
|
|
|
// void
|
|
|
|
// SBCommunication::CreateIfNeeded ()
|
2010-06-09 00:52:24 +08:00
|
|
|
//{
|
2010-06-23 09:19:29 +08:00
|
|
|
// if (m_opaque == NULL)
|
2010-06-09 00:52:24 +08:00
|
|
|
// {
|
|
|
|
// static uint32_t g_broadcaster_num;
|
|
|
|
// char broadcaster_name[256];
|
|
|
|
// ::snprintf (name, broadcaster_name, "%p SBCommunication", this);
|
2010-06-23 09:19:29 +08:00
|
|
|
// m_opaque = new Communication (broadcaster_name);
|
|
|
|
// m_opaque_owned = true;
|
2010-06-09 00:52:24 +08:00
|
|
|
// }
|
2010-06-23 09:19:29 +08:00
|
|
|
// assert (m_opaque);
|
2010-06-09 00:52:24 +08:00
|
|
|
//}
|
|
|
|
//
|
|
|
|
//
|