brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · ee33e2a Raw
176 lines · cpp
1//===-- SBCommunication.cpp -----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/API/SBCommunication.h"10#include "lldb/API/SBBroadcaster.h"11#include "lldb/Core/ThreadedCommunication.h"12#include "lldb/Host/ConnectionFileDescriptor.h"13#include "lldb/Host/Host.h"14#include "lldb/Utility/Instrumentation.h"15 16using namespace lldb;17using namespace lldb_private;18 19SBCommunication::SBCommunication() { LLDB_INSTRUMENT_VA(this); }20 21SBCommunication::SBCommunication(const char *broadcaster_name)22    : m_opaque(new ThreadedCommunication(broadcaster_name)),23      m_opaque_owned(true) {24  LLDB_INSTRUMENT_VA(this, broadcaster_name);25}26 27SBCommunication::~SBCommunication() {28  if (m_opaque && m_opaque_owned)29    delete m_opaque;30  m_opaque = nullptr;31  m_opaque_owned = false;32}33 34bool SBCommunication::IsValid() const {35  LLDB_INSTRUMENT_VA(this);36  return this->operator bool();37}38SBCommunication::operator bool() const {39  LLDB_INSTRUMENT_VA(this);40 41  return m_opaque != nullptr;42}43 44bool SBCommunication::GetCloseOnEOF() {45  LLDB_INSTRUMENT_VA(this);46 47  if (m_opaque)48    return m_opaque->GetCloseOnEOF();49  return false;50}51 52void SBCommunication::SetCloseOnEOF(bool b) {53  LLDB_INSTRUMENT_VA(this, b);54 55  if (m_opaque)56    m_opaque->SetCloseOnEOF(b);57}58 59ConnectionStatus SBCommunication::Connect(const char *url) {60  LLDB_INSTRUMENT_VA(this, url);61 62  if (m_opaque) {63    if (!m_opaque->HasConnection())64      m_opaque->SetConnection(Host::CreateDefaultConnection(url));65    return m_opaque->Connect(url, nullptr);66  }67  return eConnectionStatusNoConnection;68}69 70ConnectionStatus SBCommunication::AdoptFileDesriptor(int fd, bool owns_fd) {71  LLDB_INSTRUMENT_VA(this, fd, owns_fd);72 73  ConnectionStatus status = eConnectionStatusNoConnection;74  if (m_opaque) {75    if (m_opaque->HasConnection()) {76      if (m_opaque->IsConnected())77        m_opaque->Disconnect();78    }79    m_opaque->SetConnection(80        std::make_unique<ConnectionFileDescriptor>(fd, owns_fd));81    if (m_opaque->IsConnected())82      status = eConnectionStatusSuccess;83    else84      status = eConnectionStatusLostConnection;85  }86  return status;87}88 89ConnectionStatus SBCommunication::Disconnect() {90  LLDB_INSTRUMENT_VA(this);91 92  ConnectionStatus status = eConnectionStatusNoConnection;93  if (m_opaque)94    status = m_opaque->Disconnect();95  return status;96}97 98bool SBCommunication::IsConnected() const {99  LLDB_INSTRUMENT_VA(this);100 101  return m_opaque ? m_opaque->IsConnected() : false;102}103 104size_t SBCommunication::Read(void *dst, size_t dst_len, uint32_t timeout_usec,105                             ConnectionStatus &status) {106  LLDB_INSTRUMENT_VA(this, dst, dst_len, timeout_usec, status);107 108  size_t bytes_read = 0;109  Timeout<std::micro> timeout = timeout_usec == UINT32_MAX110                                    ? Timeout<std::micro>(std::nullopt)111                                    : std::chrono::microseconds(timeout_usec);112  if (m_opaque)113    bytes_read = m_opaque->Read(dst, dst_len, timeout, status, nullptr);114  else115    status = eConnectionStatusNoConnection;116 117  return bytes_read;118}119 120size_t SBCommunication::Write(const void *src, size_t src_len,121                              ConnectionStatus &status) {122  LLDB_INSTRUMENT_VA(this, src, src_len, status);123 124  size_t bytes_written = 0;125  if (m_opaque)126    bytes_written = m_opaque->Write(src, src_len, status, nullptr);127  else128    status = eConnectionStatusNoConnection;129 130  return bytes_written;131}132 133bool SBCommunication::ReadThreadStart() {134  LLDB_INSTRUMENT_VA(this);135 136  return m_opaque ? m_opaque->StartReadThread() : false;137}138 139bool SBCommunication::ReadThreadStop() {140  LLDB_INSTRUMENT_VA(this);141 142  return m_opaque ? m_opaque->StopReadThread() : false;143}144 145bool SBCommunication::ReadThreadIsRunning() {146  LLDB_INSTRUMENT_VA(this);147 148  return m_opaque ? m_opaque->ReadThreadIsRunning() : false;149}150 151bool SBCommunication::SetReadThreadBytesReceivedCallback(152    ReadThreadBytesReceived callback, void *callback_baton) {153  LLDB_INSTRUMENT_VA(this, callback, callback_baton);154 155  bool result = false;156  if (m_opaque) {157    m_opaque->SetReadThreadBytesReceivedCallback(callback, callback_baton);158    result = true;159  }160  return result;161}162 163SBBroadcaster SBCommunication::GetBroadcaster() {164  LLDB_INSTRUMENT_VA(this);165 166  SBBroadcaster broadcaster(m_opaque, false);167  return broadcaster;168}169 170const char *SBCommunication::GetBroadcasterClass() {171  LLDB_INSTRUMENT();172 173  return ConstString(ThreadedCommunication::GetStaticBroadcasterClass())174      .AsCString();175}176