Path: blob/main/contrib/llvm-project/lldb/source/API/SBCommunication.cpp
39587 views
//===-- SBCommunication.cpp -----------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/API/SBCommunication.h"9#include "lldb/API/SBBroadcaster.h"10#include "lldb/Core/ThreadedCommunication.h"11#include "lldb/Host/ConnectionFileDescriptor.h"12#include "lldb/Host/Host.h"13#include "lldb/Utility/Instrumentation.h"1415using namespace lldb;16using namespace lldb_private;1718SBCommunication::SBCommunication() { LLDB_INSTRUMENT_VA(this); }1920SBCommunication::SBCommunication(const char *broadcaster_name)21: m_opaque(new ThreadedCommunication(broadcaster_name)),22m_opaque_owned(true) {23LLDB_INSTRUMENT_VA(this, broadcaster_name);24}2526SBCommunication::~SBCommunication() {27if (m_opaque && m_opaque_owned)28delete m_opaque;29m_opaque = nullptr;30m_opaque_owned = false;31}3233bool SBCommunication::IsValid() const {34LLDB_INSTRUMENT_VA(this);35return this->operator bool();36}37SBCommunication::operator bool() const {38LLDB_INSTRUMENT_VA(this);3940return m_opaque != nullptr;41}4243bool SBCommunication::GetCloseOnEOF() {44LLDB_INSTRUMENT_VA(this);4546if (m_opaque)47return m_opaque->GetCloseOnEOF();48return false;49}5051void SBCommunication::SetCloseOnEOF(bool b) {52LLDB_INSTRUMENT_VA(this, b);5354if (m_opaque)55m_opaque->SetCloseOnEOF(b);56}5758ConnectionStatus SBCommunication::Connect(const char *url) {59LLDB_INSTRUMENT_VA(this, url);6061if (m_opaque) {62if (!m_opaque->HasConnection())63m_opaque->SetConnection(Host::CreateDefaultConnection(url));64return m_opaque->Connect(url, nullptr);65}66return eConnectionStatusNoConnection;67}6869ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {70LLDB_INSTRUMENT_VA(this, fd, owns_fd);7172ConnectionStatus status = eConnectionStatusNoConnection;73if (m_opaque) {74if (m_opaque->HasConnection()) {75if (m_opaque->IsConnected())76m_opaque->Disconnect();77}78m_opaque->SetConnection(79std::make_unique<ConnectionFileDescriptor>(fd, owns_fd));80if (m_opaque->IsConnected())81status = eConnectionStatusSuccess;82else83status = eConnectionStatusLostConnection;84}85return status;86}8788ConnectionStatus SBCommunication::Disconnect() {89LLDB_INSTRUMENT_VA(this);9091ConnectionStatus status = eConnectionStatusNoConnection;92if (m_opaque)93status = m_opaque->Disconnect();94return status;95}9697bool SBCommunication::IsConnected() const {98LLDB_INSTRUMENT_VA(this);99100return m_opaque ? m_opaque->IsConnected() : false;101}102103size_t SBCommunication::Read(void *dst, size_t dst_len, uint32_t timeout_usec,104ConnectionStatus &status) {105LLDB_INSTRUMENT_VA(this, dst, dst_len, timeout_usec, status);106107size_t bytes_read = 0;108Timeout<std::micro> timeout = timeout_usec == UINT32_MAX109? Timeout<std::micro>(std::nullopt)110: std::chrono::microseconds(timeout_usec);111if (m_opaque)112bytes_read = m_opaque->Read(dst, dst_len, timeout, status, nullptr);113else114status = eConnectionStatusNoConnection;115116return bytes_read;117}118119size_t SBCommunication::Write(const void *src, size_t src_len,120ConnectionStatus &status) {121LLDB_INSTRUMENT_VA(this, src, src_len, status);122123size_t bytes_written = 0;124if (m_opaque)125bytes_written = m_opaque->Write(src, src_len, status, nullptr);126else127status = eConnectionStatusNoConnection;128129return bytes_written;130}131132bool SBCommunication::ReadThreadStart() {133LLDB_INSTRUMENT_VA(this);134135return m_opaque ? m_opaque->StartReadThread() : false;136}137138bool SBCommunication::ReadThreadStop() {139LLDB_INSTRUMENT_VA(this);140141return m_opaque ? m_opaque->StopReadThread() : false;142}143144bool SBCommunication::ReadThreadIsRunning() {145LLDB_INSTRUMENT_VA(this);146147return m_opaque ? m_opaque->ReadThreadIsRunning() : false;148}149150bool SBCommunication::SetReadThreadBytesReceivedCallback(151ReadThreadBytesReceived callback, void *callback_baton) {152LLDB_INSTRUMENT_VA(this, callback, callback_baton);153154bool result = false;155if (m_opaque) {156m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);157result = true;158}159return result;160}161162SBBroadcaster SBCommunication::GetBroadcaster() {163LLDB_INSTRUMENT_VA(this);164165SBBroadcaster broadcaster(m_opaque, false);166return broadcaster;167}168169const char *SBCommunication::GetBroadcasterClass() {170LLDB_INSTRUMENT();171172return ConstString(ThreadedCommunication::GetStaticBroadcasterClass())173.AsCString();174}175176177