Broadcaster.cpp revision 63e24d7aeae8a7feb2aae0581e597b922749d4a1
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Broadcaster.cpp -----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Broadcaster.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::Broadcaster (const char *name) : 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_name (name), 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_listeners (), 2763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_broadcaster_listeners_mutex (Mutex::eMutexTypeRecursive), 2863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijacking_listener(NULL), 2963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijack_mask(UINT32_MAX) 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Broadcaster::Broadcaster(\"%s\")", this, m_broadcaster_name.AsCString()); 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::~Broadcaster() 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Broadcaster::~Broadcaster(\"%s\")", this, m_broadcaster_name.AsCString()); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Scope for "listeners_locker" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker listeners_locker(m_broadcaster_listeners_mutex); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the listener forgets about this broadcaster. We do 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this in the broadcaster in case the broadcaster object initiates 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the removal. 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::iterator pos, end = m_broadcaster_listeners.end(); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_broadcaster_listeners.begin(); pos != end; ++pos) 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->first->BroadcasterWillDestruct (this); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_listeners.clear(); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::GetBroadcasterName () 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_broadcaster_name; 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::AddInitialEventsToListener (Listener *listener, uint32_t requested_events) 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::AddListener (Listener* listener, uint32_t event_mask) 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_broadcaster_listeners_mutex); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::iterator pos, end = m_broadcaster_listeners.end(); 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::iterator existing_pos = end; 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we already have this listener, and if so, update its mask 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t taken_event_types = 0; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_broadcaster_listeners.begin(); pos != end; ++pos) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->first == listener) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner existing_pos = pos; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For now don't descriminate on who gets what 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Implement "unique listener for this bit" mask 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // taken_event_types |= pos->second; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Each event bit in a Broadcaster object can only be used 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // by one listener 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t available_event_types = ~taken_event_types & event_mask; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (available_event_types) 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we didn't find our listener, add it 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (existing_pos == end) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Grant a new listener the available event bits 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_listeners.push_back(std::make_pair(listener, available_event_types)); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Grant the existing listener the available event bits 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner existing_pos->second |= available_event_types; 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Individual broadcasters decide whether they have outstanding data when a 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // listener attaches, and insert it into the listener with this method. 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddInitialEventsToListener (listener, available_event_types); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the event bits that were granted to the listener 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return available_event_types; 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::EventTypeHasListeners (uint32_t event_type) 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_broadcaster_listeners_mutex); 12163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 12263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (m_hijacking_listener != NULL && event_type & m_hijack_mask) 12363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return true; 12463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_broadcaster_listeners.empty()) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::iterator pos, end = m_broadcaster_listeners.end(); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_broadcaster_listeners.begin(); pos != end; ++pos) 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->second & event_type) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::RemoveListener (Listener* listener, uint32_t event_mask) 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_broadcaster_listeners_mutex); 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner collection::iterator pos, end = m_broadcaster_listeners.end(); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we already have this listener, and if so, update its mask 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_broadcaster_listeners.begin(); pos != end; ++pos) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->first == listener) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Relinquish all event bits in "event_mask" 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->second &= ~event_mask; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If all bits have been relinquished then remove this listener 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->second == 0) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_listeners.erase (pos); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::BroadcastEvent (EventSP &event_sp) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return PrivateBroadcastEvent (event_sp, false); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::BroadcastEventIfUnique (EventSP &event_sp) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return PrivateBroadcastEvent (event_sp, true); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::PrivateBroadcastEvent (EventSP &event_sp, bool unique) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Can't add a NULL event... 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp.get() == NULL) 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Update the broadcaster on this event 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_sp->SetBroadcaster (this); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t event_type = event_sp->GetType(); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EVENTS); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString event_description; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_sp->Dump (&event_description); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Broadcaster(\"%s\")::BroadcastEvent (event_sp = {%s}, unique =%i)", 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_broadcaster_name.AsCString(""), 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_description.GetData(), 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unique); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (m_hijacking_listener != NULL && m_hijack_mask & event_type) 19563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 19663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (unique && m_hijacking_listener->PeekAtNextEventForBroadcasterWithType (this, event_type)) 19763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return; 19863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijacking_listener->AddEvent (event_sp); 19963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 20063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 20163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 20263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham Mutex::Locker event_types_locker(m_broadcaster_listeners_mutex); 20363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham collection::iterator pos, end = m_broadcaster_listeners.end(); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham // Iterate through all listener/mask pairs 20763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham for (pos = m_broadcaster_listeners.begin(); pos != end; ++pos) 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham // If the listener's mask matches any bits that we just set, then 21063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham // put the new event on its event queue. 21163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (event_type & pos->second) 21263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 21363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (unique && pos->first->PeekAtNextEventForBroadcasterWithType (this, event_type)) 21463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham continue; 21563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham pos->first->AddEvent (event_sp); 21663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::BroadcastEvent (uint32_t event_type, EventData *event_data) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp (new Event (event_type, event_data)); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateBroadcastEvent (event_sp, false); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBroadcaster::BroadcastEventIfUnique (uint32_t event_type, EventData *event_data) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp (new Event (event_type, event_data)); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateBroadcastEvent (event_sp, true); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 23663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamBroadcaster::HijackBroadcaster (Listener *listener, uint32_t event_mask) 23763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 23863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham Mutex::Locker event_types_locker(m_broadcaster_listeners_mutex); 23963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 24063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (m_hijacking_listener != NULL) 24163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 24263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 24363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijacking_listener = listener; 24463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijack_mask = event_mask; 24563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return true; 24663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 24763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 24863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 24963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamBroadcaster::RestoreBroadcaster () 25063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 25163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham Mutex::Locker event_types_locker(m_broadcaster_listeners_mutex); 25263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 25363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_hijacking_listener = NULL; 25463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 25563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 256