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