160 lines · cpp
1//===-- SBBroadcaster.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/Utility/Broadcaster.h"10#include "lldb/Utility/Instrumentation.h"11 12#include "lldb/API/SBBroadcaster.h"13#include "lldb/API/SBEvent.h"14#include "lldb/API/SBListener.h"15 16using namespace lldb;17using namespace lldb_private;18 19SBBroadcaster::SBBroadcaster() { LLDB_INSTRUMENT_VA(this); }20 21SBBroadcaster::SBBroadcaster(const char *name)22 : m_opaque_sp(new Broadcaster(nullptr, name)) {23 LLDB_INSTRUMENT_VA(this, name);24 25 m_opaque_ptr = m_opaque_sp.get();26}27 28SBBroadcaster::SBBroadcaster(lldb_private::Broadcaster *broadcaster, bool owns)29 : m_opaque_sp(owns ? broadcaster : nullptr), m_opaque_ptr(broadcaster) {}30 31SBBroadcaster::SBBroadcaster(const SBBroadcaster &rhs)32 : m_opaque_sp(rhs.m_opaque_sp), m_opaque_ptr(rhs.m_opaque_ptr) {33 LLDB_INSTRUMENT_VA(this, rhs);34}35 36const SBBroadcaster &SBBroadcaster::operator=(const SBBroadcaster &rhs) {37 LLDB_INSTRUMENT_VA(this, rhs);38 39 if (this != &rhs) {40 m_opaque_sp = rhs.m_opaque_sp;41 m_opaque_ptr = rhs.m_opaque_ptr;42 }43 return *this;44}45 46SBBroadcaster::~SBBroadcaster() { reset(nullptr, false); }47 48void SBBroadcaster::BroadcastEventByType(uint32_t event_type, bool unique) {49 LLDB_INSTRUMENT_VA(this, event_type, unique);50 51 if (m_opaque_ptr == nullptr)52 return;53 54 if (unique)55 m_opaque_ptr->BroadcastEventIfUnique(event_type);56 else57 m_opaque_ptr->BroadcastEvent(event_type);58}59 60void SBBroadcaster::BroadcastEvent(const SBEvent &event, bool unique) {61 LLDB_INSTRUMENT_VA(this, event, unique);62 63 if (m_opaque_ptr == nullptr)64 return;65 66 EventSP event_sp = event.GetSP();67 if (unique)68 m_opaque_ptr->BroadcastEventIfUnique(event_sp);69 else70 m_opaque_ptr->BroadcastEvent(event_sp);71}72 73void SBBroadcaster::AddInitialEventsToListener(const SBListener &listener,74 uint32_t requested_events) {75 LLDB_INSTRUMENT_VA(this, listener, requested_events);76 77 if (m_opaque_ptr)78 m_opaque_ptr->AddInitialEventsToListener(listener.m_opaque_sp,79 requested_events);80}81 82uint32_t SBBroadcaster::AddListener(const SBListener &listener,83 uint32_t event_mask) {84 LLDB_INSTRUMENT_VA(this, listener, event_mask);85 86 if (m_opaque_ptr)87 return m_opaque_ptr->AddListener(listener.m_opaque_sp, event_mask);88 return 0;89}90 91const char *SBBroadcaster::GetName() const {92 LLDB_INSTRUMENT_VA(this);93 94 if (m_opaque_ptr)95 return ConstString(m_opaque_ptr->GetBroadcasterName()).GetCString();96 return nullptr;97}98 99bool SBBroadcaster::EventTypeHasListeners(uint32_t event_type) {100 LLDB_INSTRUMENT_VA(this, event_type);101 102 if (m_opaque_ptr)103 return m_opaque_ptr->EventTypeHasListeners(event_type);104 return false;105}106 107bool SBBroadcaster::RemoveListener(const SBListener &listener,108 uint32_t event_mask) {109 LLDB_INSTRUMENT_VA(this, listener, event_mask);110 111 if (m_opaque_ptr)112 return m_opaque_ptr->RemoveListener(listener.m_opaque_sp, event_mask);113 return false;114}115 116Broadcaster *SBBroadcaster::get() const { return m_opaque_ptr; }117 118void SBBroadcaster::reset(Broadcaster *broadcaster, bool owns) {119 if (owns)120 m_opaque_sp.reset(broadcaster);121 else122 m_opaque_sp.reset();123 m_opaque_ptr = broadcaster;124}125 126bool SBBroadcaster::IsValid() const {127 LLDB_INSTRUMENT_VA(this);128 return this->operator bool();129}130SBBroadcaster::operator bool() const {131 LLDB_INSTRUMENT_VA(this);132 133 return m_opaque_ptr != nullptr;134}135 136void SBBroadcaster::Clear() {137 LLDB_INSTRUMENT_VA(this);138 139 m_opaque_sp.reset();140 m_opaque_ptr = nullptr;141}142 143bool SBBroadcaster::operator==(const SBBroadcaster &rhs) const {144 LLDB_INSTRUMENT_VA(this, rhs);145 146 return m_opaque_ptr == rhs.m_opaque_ptr;147}148 149bool SBBroadcaster::operator!=(const SBBroadcaster &rhs) const {150 LLDB_INSTRUMENT_VA(this, rhs);151 152 return m_opaque_ptr != rhs.m_opaque_ptr;153}154 155bool SBBroadcaster::operator<(const SBBroadcaster &rhs) const {156 LLDB_INSTRUMENT_VA(this, rhs);157 158 return m_opaque_ptr < rhs.m_opaque_ptr;159}160