180814287SRaphael Isemann //===-- SBBroadcaster.cpp -------------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
9181b823bSPavel Labath #include "lldb/Utility/Broadcaster.h"
101755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
1130fdc8d8SChris Lattner 
12ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
13ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h"
14b9c1b51eSKate Stone #include "lldb/API/SBListener.h"
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner using namespace lldb;
1730fdc8d8SChris Lattner using namespace lldb_private;
1830fdc8d8SChris Lattner 
SBBroadcaster()191755f5b1SJonas Devlieghere SBBroadcaster::SBBroadcaster() { LLDB_INSTRUMENT_VA(this); }
2030fdc8d8SChris Lattner 
SBBroadcaster(const char * name)21b9c1b51eSKate Stone SBBroadcaster::SBBroadcaster(const char *name)
22*28c878aeSShafik Yaghmour     : m_opaque_sp(new Broadcaster(nullptr, name)) {
231755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name);
24baf5664fSJonas Devlieghere 
25efabb123SGreg Clayton   m_opaque_ptr = m_opaque_sp.get();
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
SBBroadcaster(lldb_private::Broadcaster * broadcaster,bool owns)28b9c1b51eSKate Stone SBBroadcaster::SBBroadcaster(lldb_private::Broadcaster *broadcaster, bool owns)
29248a1305SKonrad Kleine     : m_opaque_sp(owns ? broadcaster : nullptr), m_opaque_ptr(broadcaster) {}
30efabb123SGreg Clayton 
SBBroadcaster(const SBBroadcaster & rhs)31b9c1b51eSKate Stone SBBroadcaster::SBBroadcaster(const SBBroadcaster &rhs)
32baf5664fSJonas Devlieghere     : m_opaque_sp(rhs.m_opaque_sp), m_opaque_ptr(rhs.m_opaque_ptr) {
331755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
34baf5664fSJonas Devlieghere }
35efabb123SGreg Clayton 
operator =(const SBBroadcaster & rhs)36b9c1b51eSKate Stone const SBBroadcaster &SBBroadcaster::operator=(const SBBroadcaster &rhs) {
371755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
38baf5664fSJonas Devlieghere 
39b9c1b51eSKate Stone   if (this != &rhs) {
40efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
41efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
42efabb123SGreg Clayton   }
43d232abc3SJonas Devlieghere   return *this;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
~SBBroadcaster()46248a1305SKonrad Kleine SBBroadcaster::~SBBroadcaster() { reset(nullptr, false); }
4730fdc8d8SChris Lattner 
BroadcastEventByType(uint32_t event_type,bool unique)48b9c1b51eSKate Stone void SBBroadcaster::BroadcastEventByType(uint32_t event_type, bool unique) {
491755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event_type, unique);
50baf5664fSJonas Devlieghere 
51248a1305SKonrad Kleine   if (m_opaque_ptr == nullptr)
5230fdc8d8SChris Lattner     return;
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner   if (unique)
55efabb123SGreg Clayton     m_opaque_ptr->BroadcastEventIfUnique(event_type);
5630fdc8d8SChris Lattner   else
57efabb123SGreg Clayton     m_opaque_ptr->BroadcastEvent(event_type);
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
BroadcastEvent(const SBEvent & event,bool unique)60b9c1b51eSKate Stone void SBBroadcaster::BroadcastEvent(const SBEvent &event, bool unique) {
611755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event, unique);
62baf5664fSJonas Devlieghere 
63248a1305SKonrad Kleine   if (m_opaque_ptr == nullptr)
6430fdc8d8SChris Lattner     return;
6530fdc8d8SChris Lattner 
666611103cSGreg Clayton   EventSP event_sp = event.GetSP();
6730fdc8d8SChris Lattner   if (unique)
68efabb123SGreg Clayton     m_opaque_ptr->BroadcastEventIfUnique(event_sp);
6930fdc8d8SChris Lattner   else
70efabb123SGreg Clayton     m_opaque_ptr->BroadcastEvent(event_sp);
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
AddInitialEventsToListener(const SBListener & listener,uint32_t requested_events)73b9c1b51eSKate Stone void SBBroadcaster::AddInitialEventsToListener(const SBListener &listener,
74b9c1b51eSKate Stone                                                uint32_t requested_events) {
751755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, listener, requested_events);
76baf5664fSJonas Devlieghere 
77efabb123SGreg Clayton   if (m_opaque_ptr)
78b9c1b51eSKate Stone     m_opaque_ptr->AddInitialEventsToListener(listener.m_opaque_sp,
79b9c1b51eSKate Stone                                              requested_events);
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
AddListener(const SBListener & listener,uint32_t event_mask)82b9c1b51eSKate Stone uint32_t SBBroadcaster::AddListener(const SBListener &listener,
83b9c1b51eSKate Stone                                     uint32_t event_mask) {
841755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, listener, event_mask);
85baf5664fSJonas Devlieghere 
86efabb123SGreg Clayton   if (m_opaque_ptr)
87583bbb1dSJim Ingham     return m_opaque_ptr->AddListener(listener.m_opaque_sp, event_mask);
8830fdc8d8SChris Lattner   return 0;
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
GetName() const91b9c1b51eSKate Stone const char *SBBroadcaster::GetName() const {
921755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
93baf5664fSJonas Devlieghere 
94efabb123SGreg Clayton   if (m_opaque_ptr)
95efabb123SGreg Clayton     return m_opaque_ptr->GetBroadcasterName().GetCString();
96248a1305SKonrad Kleine   return nullptr;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
EventTypeHasListeners(uint32_t event_type)99b9c1b51eSKate Stone bool SBBroadcaster::EventTypeHasListeners(uint32_t event_type) {
1001755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, event_type);
101baf5664fSJonas Devlieghere 
102efabb123SGreg Clayton   if (m_opaque_ptr)
103efabb123SGreg Clayton     return m_opaque_ptr->EventTypeHasListeners(event_type);
10430fdc8d8SChris Lattner   return false;
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
RemoveListener(const SBListener & listener,uint32_t event_mask)107b9c1b51eSKate Stone bool SBBroadcaster::RemoveListener(const SBListener &listener,
108b9c1b51eSKate Stone                                    uint32_t event_mask) {
1091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, listener, event_mask);
110baf5664fSJonas Devlieghere 
111efabb123SGreg Clayton   if (m_opaque_ptr)
112583bbb1dSJim Ingham     return m_opaque_ptr->RemoveListener(listener.m_opaque_sp, event_mask);
11330fdc8d8SChris Lattner   return false;
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
get() const116b9c1b51eSKate Stone Broadcaster *SBBroadcaster::get() const { return m_opaque_ptr; }
11730fdc8d8SChris Lattner 
reset(Broadcaster * broadcaster,bool owns)118b9c1b51eSKate Stone void SBBroadcaster::reset(Broadcaster *broadcaster, bool owns) {
119efabb123SGreg Clayton   if (owns)
120efabb123SGreg Clayton     m_opaque_sp.reset(broadcaster);
121efabb123SGreg Clayton   else
122efabb123SGreg Clayton     m_opaque_sp.reset();
123efabb123SGreg Clayton   m_opaque_ptr = broadcaster;
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
IsValid() const126baf5664fSJonas Devlieghere bool SBBroadcaster::IsValid() const {
1271755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1287f5237bcSPavel Labath   return this->operator bool();
1297f5237bcSPavel Labath }
operator bool() const1307f5237bcSPavel Labath SBBroadcaster::operator bool() const {
1311755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
132baf5664fSJonas Devlieghere 
133248a1305SKonrad Kleine   return m_opaque_ptr != nullptr;
134baf5664fSJonas Devlieghere }
13530fdc8d8SChris Lattner 
Clear()136b9c1b51eSKate Stone void SBBroadcaster::Clear() {
1371755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
138baf5664fSJonas Devlieghere 
1391c2f2838SGreg Clayton   m_opaque_sp.reset();
140248a1305SKonrad Kleine   m_opaque_ptr = nullptr;
1411c2f2838SGreg Clayton }
1421c2f2838SGreg Clayton 
operator ==(const SBBroadcaster & rhs) const143b9c1b51eSKate Stone bool SBBroadcaster::operator==(const SBBroadcaster &rhs) const {
1441755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
145baf5664fSJonas Devlieghere 
146efabb123SGreg Clayton   return m_opaque_ptr == rhs.m_opaque_ptr;
14730fdc8d8SChris Lattner }
14830fdc8d8SChris Lattner 
operator !=(const SBBroadcaster & rhs) const149b9c1b51eSKate Stone bool SBBroadcaster::operator!=(const SBBroadcaster &rhs) const {
1501755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
151baf5664fSJonas Devlieghere 
152efabb123SGreg Clayton   return m_opaque_ptr != rhs.m_opaque_ptr;
15330fdc8d8SChris Lattner }
154f7d6a2a6SGreg Clayton 
operator <(const SBBroadcaster & rhs) const155b9c1b51eSKate Stone bool SBBroadcaster::operator<(const SBBroadcaster &rhs) const {
1561755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
157baf5664fSJonas Devlieghere 
158f7d6a2a6SGreg Clayton   return m_opaque_ptr < rhs.m_opaque_ptr;
159f7d6a2a6SGreg Clayton }
160