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