15ffd83dbSDimitry Andric //===-- SBBroadcaster.cpp -------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "lldb/Utility/Broadcaster.h"
1004eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
110b57cec5SDimitry Andric
120b57cec5SDimitry Andric #include "lldb/API/SBBroadcaster.h"
130b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
140b57cec5SDimitry Andric #include "lldb/API/SBListener.h"
150b57cec5SDimitry Andric
160b57cec5SDimitry Andric using namespace lldb;
170b57cec5SDimitry Andric using namespace lldb_private;
180b57cec5SDimitry Andric
SBBroadcaster()1904eeddc0SDimitry Andric SBBroadcaster::SBBroadcaster() { LLDB_INSTRUMENT_VA(this); }
200b57cec5SDimitry Andric
SBBroadcaster(const char * name)210b57cec5SDimitry Andric SBBroadcaster::SBBroadcaster(const char *name)
2281ad6265SDimitry Andric : m_opaque_sp(new Broadcaster(nullptr, name)) {
2304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name);
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric m_opaque_ptr = m_opaque_sp.get();
260b57cec5SDimitry Andric }
270b57cec5SDimitry Andric
SBBroadcaster(lldb_private::Broadcaster * broadcaster,bool owns)280b57cec5SDimitry Andric SBBroadcaster::SBBroadcaster(lldb_private::Broadcaster *broadcaster, bool owns)
290b57cec5SDimitry Andric : m_opaque_sp(owns ? broadcaster : nullptr), m_opaque_ptr(broadcaster) {}
300b57cec5SDimitry Andric
SBBroadcaster(const SBBroadcaster & rhs)310b57cec5SDimitry Andric SBBroadcaster::SBBroadcaster(const SBBroadcaster &rhs)
320b57cec5SDimitry Andric : m_opaque_sp(rhs.m_opaque_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
3304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric
operator =(const SBBroadcaster & rhs)360b57cec5SDimitry Andric const SBBroadcaster &SBBroadcaster::operator=(const SBBroadcaster &rhs) {
3704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric if (this != &rhs) {
400b57cec5SDimitry Andric m_opaque_sp = rhs.m_opaque_sp;
410b57cec5SDimitry Andric m_opaque_ptr = rhs.m_opaque_ptr;
420b57cec5SDimitry Andric }
4304eeddc0SDimitry Andric return *this;
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric
~SBBroadcaster()460b57cec5SDimitry Andric SBBroadcaster::~SBBroadcaster() { reset(nullptr, false); }
470b57cec5SDimitry Andric
BroadcastEventByType(uint32_t event_type,bool unique)480b57cec5SDimitry Andric void SBBroadcaster::BroadcastEventByType(uint32_t event_type, bool unique) {
4904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, event_type, unique);
500b57cec5SDimitry Andric
510b57cec5SDimitry Andric if (m_opaque_ptr == nullptr)
520b57cec5SDimitry Andric return;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric if (unique)
550b57cec5SDimitry Andric m_opaque_ptr->BroadcastEventIfUnique(event_type);
560b57cec5SDimitry Andric else
570b57cec5SDimitry Andric m_opaque_ptr->BroadcastEvent(event_type);
580b57cec5SDimitry Andric }
590b57cec5SDimitry Andric
BroadcastEvent(const SBEvent & event,bool unique)600b57cec5SDimitry Andric void SBBroadcaster::BroadcastEvent(const SBEvent &event, bool unique) {
6104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, event, unique);
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric if (m_opaque_ptr == nullptr)
640b57cec5SDimitry Andric return;
650b57cec5SDimitry Andric
660b57cec5SDimitry Andric EventSP event_sp = event.GetSP();
670b57cec5SDimitry Andric if (unique)
680b57cec5SDimitry Andric m_opaque_ptr->BroadcastEventIfUnique(event_sp);
690b57cec5SDimitry Andric else
700b57cec5SDimitry Andric m_opaque_ptr->BroadcastEvent(event_sp);
710b57cec5SDimitry Andric }
720b57cec5SDimitry Andric
AddInitialEventsToListener(const SBListener & listener,uint32_t requested_events)730b57cec5SDimitry Andric void SBBroadcaster::AddInitialEventsToListener(const SBListener &listener,
740b57cec5SDimitry Andric uint32_t requested_events) {
7504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, listener, requested_events);
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric if (m_opaque_ptr)
780b57cec5SDimitry Andric m_opaque_ptr->AddInitialEventsToListener(listener.m_opaque_sp,
790b57cec5SDimitry Andric requested_events);
800b57cec5SDimitry Andric }
810b57cec5SDimitry Andric
AddListener(const SBListener & listener,uint32_t event_mask)820b57cec5SDimitry Andric uint32_t SBBroadcaster::AddListener(const SBListener &listener,
830b57cec5SDimitry Andric uint32_t event_mask) {
8404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, listener, event_mask);
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric if (m_opaque_ptr)
870b57cec5SDimitry Andric return m_opaque_ptr->AddListener(listener.m_opaque_sp, event_mask);
880b57cec5SDimitry Andric return 0;
890b57cec5SDimitry Andric }
900b57cec5SDimitry Andric
GetName() const910b57cec5SDimitry Andric const char *SBBroadcaster::GetName() const {
9204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
930b57cec5SDimitry Andric
940b57cec5SDimitry Andric if (m_opaque_ptr)
95*06c3fb27SDimitry Andric return ConstString(m_opaque_ptr->GetBroadcasterName()).GetCString();
960b57cec5SDimitry Andric return nullptr;
970b57cec5SDimitry Andric }
980b57cec5SDimitry Andric
EventTypeHasListeners(uint32_t event_type)990b57cec5SDimitry Andric bool SBBroadcaster::EventTypeHasListeners(uint32_t event_type) {
10004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, event_type);
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andric if (m_opaque_ptr)
1030b57cec5SDimitry Andric return m_opaque_ptr->EventTypeHasListeners(event_type);
1040b57cec5SDimitry Andric return false;
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric
RemoveListener(const SBListener & listener,uint32_t event_mask)1070b57cec5SDimitry Andric bool SBBroadcaster::RemoveListener(const SBListener &listener,
1080b57cec5SDimitry Andric uint32_t event_mask) {
10904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, listener, event_mask);
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric if (m_opaque_ptr)
1120b57cec5SDimitry Andric return m_opaque_ptr->RemoveListener(listener.m_opaque_sp, event_mask);
1130b57cec5SDimitry Andric return false;
1140b57cec5SDimitry Andric }
1150b57cec5SDimitry Andric
get() const1160b57cec5SDimitry Andric Broadcaster *SBBroadcaster::get() const { return m_opaque_ptr; }
1170b57cec5SDimitry Andric
reset(Broadcaster * broadcaster,bool owns)1180b57cec5SDimitry Andric void SBBroadcaster::reset(Broadcaster *broadcaster, bool owns) {
1190b57cec5SDimitry Andric if (owns)
1200b57cec5SDimitry Andric m_opaque_sp.reset(broadcaster);
1210b57cec5SDimitry Andric else
1220b57cec5SDimitry Andric m_opaque_sp.reset();
1230b57cec5SDimitry Andric m_opaque_ptr = broadcaster;
1240b57cec5SDimitry Andric }
1250b57cec5SDimitry Andric
IsValid() const1260b57cec5SDimitry Andric bool SBBroadcaster::IsValid() const {
12704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1280b57cec5SDimitry Andric return this->operator bool();
1290b57cec5SDimitry Andric }
operator bool() const1300b57cec5SDimitry Andric SBBroadcaster::operator bool() const {
13104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric return m_opaque_ptr != nullptr;
1340b57cec5SDimitry Andric }
1350b57cec5SDimitry Andric
Clear()1360b57cec5SDimitry Andric void SBBroadcaster::Clear() {
13704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric m_opaque_sp.reset();
1400b57cec5SDimitry Andric m_opaque_ptr = nullptr;
1410b57cec5SDimitry Andric }
1420b57cec5SDimitry Andric
operator ==(const SBBroadcaster & rhs) const1430b57cec5SDimitry Andric bool SBBroadcaster::operator==(const SBBroadcaster &rhs) const {
14404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andric return m_opaque_ptr == rhs.m_opaque_ptr;
1470b57cec5SDimitry Andric }
1480b57cec5SDimitry Andric
operator !=(const SBBroadcaster & rhs) const1490b57cec5SDimitry Andric bool SBBroadcaster::operator!=(const SBBroadcaster &rhs) const {
15004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric return m_opaque_ptr != rhs.m_opaque_ptr;
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric
operator <(const SBBroadcaster & rhs) const1550b57cec5SDimitry Andric bool SBBroadcaster::operator<(const SBBroadcaster &rhs) const {
15604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1570b57cec5SDimitry Andric
1580b57cec5SDimitry Andric return m_opaque_ptr < rhs.m_opaque_ptr;
1590b57cec5SDimitry Andric }
160