Go to the documentation of this file.
9 #ifndef LLDB_UTILITY_BROADCASTER_H
10 #define LLDB_UTILITY_BROADCASTER_H
16 #include "llvm/ADT/SmallVector.h"
75 :
public std::enable_shared_from_this<BroadcasterManager> {
109 typedef std::map<BroadcastEventSpec, lldb::ListenerSP>
collection;
152 const lldb::ListenerSP &listener_sp)
158 return (input.first.GetBroadcasterClass() ==
160 (input.first.GetEventBits() &
252 Broadcaster(lldb::BroadcasterManagerSP manager_sp,
const char *name);
271 const lldb::EventDataSP &event_data_sp) {
327 bool prefix_with_broadcaster_name)
const {
329 prefix_with_broadcaster_name);
438 const lldb::EventDataSP &event_data_sp);
455 bool prefix_with_broadcaster_name)
const;
464 return pos->second.c_str();
488 typedef llvm::SmallVector<std::pair<lldb::ListenerWP, uint32_t>, 4>
492 llvm::SmallVector<std::pair<lldb::ListenerSP, uint32_t &>, 4>
543 #endif // LLDB_UTILITY_BROADCASTER_H
void CheckInWithManager()
std::map< BroadcastEventSpec, lldb::ListenerSP > collection
uint32_t GetEventBits() const
void SignUpListenersForBroadcaster(Broadcaster &broadcaster)
lldb::BroadcasterManagerSP GetManager()
BroadcasterClassMatches(const ConstString &broadcaster_class)
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
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...
~BroadcastEventSpecMatches()=default
virtual void AddInitialEventsToListener(const lldb::ListenerSP &listener_sp, uint32_t requested_events)
~ListenerMatchesAndSharedBits()=default
Broadcaster * GetBroadcaster()
void BroadcastEvent(uint32_t event_type, EventData *event_data=nullptr)
std::map< uint32_t, std::string > event_names_map
const lldb::ListenerSP m_listener_sp
void BroadcastEvent(lldb::EventSP &event_sp)
~ListenerMatchesPointer()=default
BroadcasterImplSP m_broadcaster_sp
bool operator()(const event_listener_key &input) const
virtual ConstString & GetBroadcasterClass() const
This needs to be filled in if you are going to register the broadcaster with the broadcaster manager ...
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
const char * GetHijackingListenerName()
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
const Listener * m_listener
virtual ~Broadcaster()
Destructor.
BroadcastEventSpecMatches(const BroadcastEventSpec &broadcaster_spec)
static lldb::BroadcasterManagerSP MakeBroadcasterManager()
Listeners hold onto weak pointers to their broadcaster managers.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
~BroadcasterManager()=default
std::pair< BroadcastEventSpec, lldb::ListenerSP > event_listener_key
std::weak_ptr< BroadcasterImpl > BroadcasterImplWP
bool IsContainedIn(const BroadcastEventSpec &in_spec) const
Tell whether this BroadcastEventSpec is contained in in_spec.
ConstString GetBroadcasterClass() const
~BroadcasterClassMatches()=default
ListenerMatches(const lldb::ListenerSP &in_listener_sp)
uint32_t RegisterListenerForEvents(const lldb::ListenerSP &listener_sp, const BroadcastEventSpec &event_spec)
bool operator()(const event_listener_key &input) const
lldb::BroadcasterManagerSP m_manager_sp
bool EventTypeHasListeners(uint32_t event_type)
bool operator<(const BroadcastEventSpec &rhs) const
std::recursive_mutex m_listeners_mutex
A mutex that protects m_listeners.
const lldb::ListenerSP m_listener_sp
bool RemoveListener(lldb_private::Listener *listener, uint32_t event_mask=UINT32_MAX)
ConstString m_broadcaster_class
void RestoreBroadcaster()
Restore the state of the Broadcaster from a previous hijack attempt.
const char * GetEventName(uint32_t event_mask) const
bool UnregisterListenerForEvents(const lldb::ListenerSP &listener_sp, const BroadcastEventSpec &event_spec)
const ConstString m_broadcaster_name
The name of this broadcaster object.
bool operator()(const event_listener_key &input) const
uint32_t AddListener(const lldb::ListenerSP &listener_sp, uint32_t event_mask)
listener_collection m_listeners
void BroadcastEventIfUnique(lldb::EventSP &event_sp)
void RestoreBroadcaster()
void RemoveListener(const lldb::ListenerSP &listener_sp)
std::vector< lldb::ListenerSP > m_hijacking_listeners
A simple mechanism to intercept events from a broadcaster.
event_names_map m_event_names
Optionally define event names for readability and logging for each event bit.
uint32_t AddListener(const lldb::ListenerSP &listener_sp, uint32_t event_mask)
Listen for any events specified by event_mask.
const BroadcasterImpl & operator=(const BroadcasterImpl &)=delete
ListenerMatchesAndSharedBits(const BroadcastEventSpec &broadcaster_spec, const lldb::ListenerSP &listener_sp)
bool EventTypeHasListeners(uint32_t event_type)
ConstString m_broadcaster_class
BroadcasterImpl contains the actual Broadcaster implementation.
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 ...
bool HijackBroadcaster(const lldb::ListenerSP &listener_sp, uint32_t event_mask=UINT32_MAX)
Provides a simple mechanism to temporarily redirect events from broadcaster.
void SetEventName(uint32_t event_mask, const char *name)
std::shared_ptr< BroadcasterImpl > BroadcasterImplSP
lldb::ListenerSP GetListenerForEventSpec(const BroadcastEventSpec &event_spec) const
const Broadcaster & operator=(const Broadcaster &)=delete
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
Broadcaster(lldb::BroadcasterManagerSP manager_sp, const char *name)
Construct with a broadcaster with a name.
std::set< lldb::ListenerSP > listener_collection
bool IsHijackedForEvent(uint32_t event_mask)
bool operator()(const lldb::ListenerSP &input) const
BroadcastEventSpec m_broadcaster_spec
BroadcasterImpl(Broadcaster &broadcaster)
llvm::SmallVector< std::pair< lldb::ListenerSP, uint32_t & >, 4 > GetListeners()
const char * GetEventName(uint32_t event_mask) const
void BroadcastEventIfUnique(uint32_t event_type, EventData *event_data=nullptr)
void PrivateBroadcastEvent(lldb::EventSP &event_sp, bool unique)
bool IsHijackedForEvent(uint32_t event_mask)
~BroadcastEventSpec()=default
~ListenerMatches()=default
ConstString GetBroadcasterName()
Get the NULL terminated C string name of this Broadcaster object.
A class that represents a running process on the host machine.
BroadcastEventSpec m_broadcaster_spec
const char * GetBroadcasterName() const
void BroadcastEvent(uint32_t event_type, const lldb::EventDataSP &event_data_sp)
ListenerMatchesPointer(const Listener *in_listener)
~BroadcasterImpl()=default
bool operator()(const event_listener_key &input) const
BroadcastEventSpec(const ConstString &broadcaster_class, uint32_t event_bits)
bool operator()(const event_listener_key &input) const
collection m_listeners
A list of Listener / event_mask pairs that are listening to this broadcaster.
Broadcaster & m_broadcaster
The broadcaster that this implements.
llvm::SmallVector< std::pair< lldb::ListenerWP, uint32_t >, 4 > collection
bool GetEventNames(Stream &s, const uint32_t event_mask, bool prefix_with_broadcaster_name) const
bool GetEventNames(Stream &s, const uint32_t event_mask, bool prefix_with_broadcaster_name) const
Get the event name(s) for one or more event bits.
const char * GetHijackingListenerName()
std::recursive_mutex m_manager_mutex
BroadcasterImplSP GetBroadcasterImpl()