30 LLDB_LOG(log,
"{0} Broadcaster::Broadcaster(\"{1}\")",
40 LLDB_LOG(log,
"{0} Broadcaster::~Broadcaster(\"{1}\")",
52llvm::SmallVector<std::pair<ListenerSP, uint32_t &>, 4>
54 bool include_primary) {
55 llvm::SmallVector<std::pair<ListenerSP, uint32_t &>, 4> listeners;
59 listeners.reserve(max_count);
63 if (curr_listener_sp) {
64 if (it->second & event_mask)
65 listeners.emplace_back(std::move(curr_listener_sp), it->second);
83 if (curr_listener_sp && (it->second & event_mask))
106 Stream &s, uint32_t event_mask,
bool prefix_with_broadcaster_name)
const {
107 uint32_t num_names_added = 0;
110 for (uint32_t
bit = 1u, mask = event_mask; mask != 0 &&
bit != 0;
115 if (num_names_added > 0)
118 if (prefix_with_broadcaster_name) {
128 return num_names_added > 0;
136 uint32_t event_mask) {
144 bool handled =
false;
151 if (pair.first == listener_sp) {
153 pair.second |= event_mask;
154 m_broadcaster.AddInitialEventsToListener(listener_sp, event_mask);
166 m_broadcaster.AddInitialEventsToListener(listener_sp, event_mask);
202 if (!curr_listener_sp) {
209 if (curr_listener_sp.get() == listener) {
210 it->second &= ~event_mask;
244 const uint32_t event_type = event_sp->GetType();
254 hijacking_listener_sp.reset();
258 if (!log && event_sp->GetData())
259 log = event_sp->GetData()->GetLogChannel();
263 event_sp->Dump(&event_description);
265 "{0:x} Broadcaster(\"{1}\")::BroadcastEvent (event_sp = {2}, "
266 "unique={3}) hijack = {4:x}",
268 event_description.
GetData(), unique,
269 static_cast<void *
>(hijacking_listener_sp.get()));
274 if (primary_listener_sp) {
275 if (unique && primary_listener_sp->PeekAtNextEventForBroadcasterWithType(
287 if (!hijacking_listener_sp) {
289 event_sp->AddPendingListener(pair.first);
291 primary_listener_sp->AddEvent(event_sp);
294 if (unique && pair.first->PeekAtNextEventForBroadcasterWithType(
298 pair.first->AddEvent(event_sp);
304 auto event_sp = std::make_shared<Event>(event_type,
nullptr);
310 auto event_sp = std::make_shared<Event>(event_type, event_data_sp);
315 auto event_sp = std::make_shared<Event>(event_type,
nullptr);
335 "{0} Broadcaster(\"{1}\")::HijackBroadcaster (listener(\"{2}\")={3})",
337 listener_sp->m_name.c_str(),
static_cast<void *
>(listener_sp.get()));
365 "{0} Broadcaster(\"{1}\")::RestoreBroadcaster (about to pop "
366 "listener(\"{2}\")={3})",
368 listener_sp->m_name.c_str(),
369 static_cast<void *
>(listener_sp.get()));
377 static constexpr llvm::StringLiteral class_name(
"lldb.anonymous");
400 return input.first.GetBroadcasterClass() ==
404 while (iter != end_iter &&
405 (iter = find_if(iter, end_iter, class_matches)) != end_iter) {
406 available_bits &= ~((*iter).first.GetEventBits());
410 if (available_bits != 0) {
417 return available_bits;
422 bool removed_some =
false;
427 auto listener_matches_and_shared_bits =
429 return input.first.GetBroadcasterClass() ==
431 (input.first.GetEventBits() & event_spec.
GetEventBits()) != 0 &&
432 input.second == listener_sp;
434 std::vector<BroadcastEventSpec> to_be_readded;
435 uint32_t event_bits_to_remove = event_spec.
GetEventBits();
440 iter = find_if(iter, end, listener_matches_and_shared_bits);
443 uint32_t iter_event_bits = (*iter).first.GetEventBits();
446 if (event_bits_to_remove != iter_event_bits) {
447 uint32_t new_event_bits = iter_event_bits & ~event_bits_to_remove;
455 for (
const auto &event : to_be_readded) {
466 auto event_spec_matches =
468 return input.first.IsContainedIn(event_spec);
471 auto iter = llvm::find_if(
m_event_map, event_spec_matches);
473 return (*iter).second;
480 auto listeners_predicate =
482 return input.get() == listener;
485 if (
auto iter = llvm::find_if(
m_listeners, listeners_predicate);
490 return input.second.get() == listener;
495 iter = find_if(iter, end, events_predicate);
506 auto listener_matches =
508 return input.second == listener_sp;
516 iter = find_if(iter, end_iter, listener_matches);
517 if (iter == end_iter)
531 return input.first.GetBroadcasterClass() ==
535 while (iter != end_iter &&
536 (iter = find_if(iter, end_iter, class_matches)) != end_iter) {
537 (*iter).second->StartListeningForEvents(&broadcaster,
538 (*iter).first.GetEventBits());
547 listener->BroadcasterManagerWillDestruct(this->shared_from_this());
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
bool operator<(const BroadcastEventSpec &rhs) const
BroadcastEventSpec(llvm::StringRef broadcaster_class, uint32_t event_bits)
uint32_t GetEventBits() const
const std::string & GetBroadcasterClass() const
listener_collection m_listeners
uint32_t RegisterListenerForEventsNoLock(const lldb::ListenerSP &listener_sp, const BroadcastEventSpec &event_spec)
static lldb::BroadcasterManagerSP MakeBroadcasterManager()
Listeners hold onto weak pointers to their broadcaster managers.
std::mutex m_manager_mutex
bool UnregisterListenerForEventsNoLock(const lldb::ListenerSP &listener_sp, const BroadcastEventSpec &event_spec)
void RemoveListener(const lldb::ListenerSP &listener_sp)
void SignUpListenersForBroadcaster(Broadcaster &broadcaster)
std::pair< BroadcastEventSpec, lldb::ListenerSP > event_listener_key
lldb::ListenerSP GetListenerForEventSpec(const BroadcastEventSpec &event_spec) const
BroadcasterImpl contains the actual Broadcaster implementation.
bool IsHijackedForEvent(uint32_t event_mask)
const char * GetHijackingListenerName()
void BroadcastEvent(lldb::EventSP &event_sp)
void SetPrimaryListener(lldb::ListenerSP listener_sp)
void PrivateBroadcastEvent(lldb::EventSP &event_sp, bool unique)
uint32_t AddListener(const lldb::ListenerSP &listener_sp, uint32_t event_mask)
Broadcaster & m_broadcaster
The broadcaster that this implements.
void RestoreBroadcaster()
bool EventTypeHasListeners(uint32_t event_type)
llvm::SmallVector< std::pair< lldb::ListenerSP, uint32_t & >, 4 > GetListeners(uint32_t event_mask=UINT32_MAX, bool include_primary=true)
std::vector< uint32_t > m_hijacking_masks
At some point we may want to have a stack or Listener collections, but for now this is just for priva...
uint32_t m_primary_listener_mask
bool RemoveListener(lldb_private::Listener *listener, uint32_t event_mask=UINT32_MAX)
bool HasListeners(uint32_t event_mask)
bool GetEventNames(Stream &s, const uint32_t event_mask, bool prefix_with_broadcaster_name) const
std::mutex m_listeners_mutex
A mutex that protects m_listeners.
std::vector< lldb::ListenerSP > m_hijacking_listeners
A simple mechanism to intercept events from a broadcaster.
collection m_listeners
A Broadcaster can have zero, one or many listeners.
BroadcasterImpl(Broadcaster &broadcaster)
Broadcaster * GetBroadcaster()
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
lldb::ListenerSP m_primary_listener_sp
See the discussion of Broadcasters and Listeners above.
event_names_map m_event_names
Optionally define event names for readability and logging for each event bit.
An event broadcasting class.
const std::string m_broadcaster_name
The name of this broadcaster object.
bool RemoveListener(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
Removes a Listener from this broadcasters list and frees the event bits specified by event_mask that ...
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
virtual void AddInitialEventsToListener(const lldb::ListenerSP &listener_sp, uint32_t requested_events)
const std::string & GetBroadcasterName()
Get this broadcaster's name.
lldb::BroadcasterManagerSP m_manager_sp
virtual llvm::StringRef GetBroadcasterClass() const
This needs to be filled in if you are going to register the broadcaster with the broadcaster manager ...
BroadcasterImplSP m_broadcaster_sp
void CheckInWithManager()
virtual ~Broadcaster()
Destructor.
const char * GetData() const
A stream class that can stream formatted output to a file.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
static uint32_t bit(const uint32_t val, const uint32_t msbit)
std::shared_ptr< lldb_private::BroadcasterManager > BroadcasterManagerSP
std::weak_ptr< lldb_private::Listener > ListenerWP
std::shared_ptr< lldb_private::Event > EventSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::EventData > EventDataSP