SBListener.cpp revision 5a15e6927b5b3234fb3e688717297ba6b5dd6ad7
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBListener.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
1049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBListener.h"
1149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBBroadcaster.h"
125a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham#include "lldb/API/SBDebugger.h"
1349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBEvent.h"
1449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/API/SBStream.h"
1549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/Core/Broadcaster.h"
165a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham#include "lldb/Core/Debugger.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Listener.h"
187826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
1949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include "lldb/Core/StreamString.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/TimeValue.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2763094e0bb161580564954dee512955c1c79d3476Greg ClaytonSBListener::SBListener () :
28538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (),
29538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (NULL)
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::SBListener (const char *name) :
34538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (new Listener (name)),
35538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (NULL)
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr = m_opaque_sp.get();
38538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
39e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
407826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
417826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
4249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
4361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     name, m_opaque_ptr);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
47538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::SBListener (const SBListener &rhs) :
48538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (rhs.m_opaque_sp),
49538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (rhs.m_opaque_ptr)
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst lldb::SBListener &
54538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::operator = (const lldb::SBListener &rhs)
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (this != &rhs)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp = rhs.m_opaque_sp;
59538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_ptr = rhs.m_opaque_ptr;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    return *this;
62538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
63538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
64538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::SBListener (Listener &listener) :
65538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_sp (),
66538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    m_opaque_ptr (&listener)
67538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
68538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
69538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
70538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::~SBListener ()
71538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::IsValid() const
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7763094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr != NULL;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::AddEvent (const SBEvent &event)
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8363094e0bb161580564954dee512955c1c79d3476Greg Clayton    EventSP &event_sp = event.GetSP ();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (event_sp)
8563094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ptr->AddEvent (event_sp);
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::Clear ()
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
9263094e0bb161580564954dee512955c1c79d3476Greg Clayton        m_opaque_ptr->Clear ();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
955a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    uint32_t
965a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    SBListener::StartListeningForEventClass (SBDebugger &debugger,
975a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                 const char *broadcaster_class,
985a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                 uint32_t event_mask)
995a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    {
1005a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        if (m_opaque_ptr)
1015a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        {
1025a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            Debugger *lldb_debugger = debugger.get();
1035a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            if (!lldb_debugger)
1045a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                return 0;
1055a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
1065a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
1075a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        }
1085a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        else
1095a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return 0;
1105a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    }
1115a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
1125a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    bool
1135a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    SBListener::StopListeningForEventClass (SBDebugger &debugger,
1145a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                const char *broadcaster_class,
1155a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                                uint32_t event_mask)
1165a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    {
1175a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        if (m_opaque_ptr)
1185a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        {
1195a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            Debugger *lldb_debugger = debugger.get();
1205a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            if (!lldb_debugger)
1215a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham                return false;
1225a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
1235a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
1245a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        }
1255a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham        else
1265a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham            return false;
1275a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    }
1285a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1337826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
13449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    uint32_t acquired_event_mask = 0;
13563094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1397826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
140926060e198137f8a64face70455324a8cd4362a5Caroline Tice    log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
1417826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
14249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
14349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        StreamString sstr_requested;
14449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        StreamString sstr_acquired;
14549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
14649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        Broadcaster *lldb_broadcaster = broadcaster.get();
14749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (lldb_broadcaster)
14849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
14949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
15049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
15149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
15249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr,
15349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster,
15449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster->GetBroadcasterName().GetCString(),
15549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         event_mask,
15649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_requested_names ? " (" : "",
15749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         sstr_requested.GetData(),
15849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_requested_names ? ")" : "",
15949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         acquired_event_mask,
16049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_acquired_names ? " (" : "",
16149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         sstr_acquired.GetData(),
16249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         got_acquired_names ? ")" : "");
16349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
16449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
16549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
16649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
16749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr,
16849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         lldb_broadcaster,
16949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         event_mask,
17049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         acquired_event_mask);
17149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
17249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
17349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
1747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
17549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return acquired_event_mask;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18363094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18949ce682dfa7993d31206cea19ce7006cd3f3077eGreg ClaytonSBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
191e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (log)
19349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
19449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs == UINT32_MAX)
19549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
19649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
19749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, event.get());
19849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
19949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
20049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
20149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
20249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, timeout_secs, event.get());
20349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
20449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
20549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    bool success = false;
2067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
20763094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
21049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs != UINT32_MAX)
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
21449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            time_value.OffsetWithSeconds (timeout_secs);
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
21763094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21963094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
22049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            success = true;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
22549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    {
22649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        if (timeout_secs == UINT32_MAX)
22749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
22849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
22949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, event.get(), success);
23049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
23149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        else
23249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        {
23349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton            log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
23449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                         m_opaque_ptr, timeout_secs, event.get(), success);
23549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        }
23649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    }
23749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (!success)
23849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        event.reset (NULL);
23949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return success;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::WaitForEventForBroadcaster
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_seconds,
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_seconds != UINT32_MAX)
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value.OffsetWithSeconds (num_seconds);
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
25963094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
26063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                         broadcaster.get(),
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                         event_sp))
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26363094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26863094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::WaitForEventForBroadcasterWithType
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_seconds,
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t event_type_mask,
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TimeValue time_value;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_seconds != UINT32_MAX)
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value = TimeValue::Now();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            time_value.OffsetWithSeconds (num_seconds);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
29063094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
29163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              broadcaster.get(),
29263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_type_mask,
29363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_sp))
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29563094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29963094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEvent (SBEvent &event)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30663094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30863094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset (m_opaque_ptr->PeekAtNextEvent ());
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31163094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32063094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32363094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                   SBEvent &event)
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33163094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33363094e0bb161580564954dee512955c1c79d3476Greg Clayton        event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return event.IsValid();
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33663094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEvent (SBEvent &event)
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34363094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
34663094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEvent (event_sp))
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34863094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35263094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35963094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
36263094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36463094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36863094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::GetNextEventForBroadcasterWithType
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SBBroadcaster &broadcaster,
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t event_type_mask,
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBEvent &event
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38063094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr && broadcaster.IsValid())
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        EventSP event_sp;
38363094e0bb161580564954dee512955c1c79d3476Greg Clayton        if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
38463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_type_mask,
38563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                              event_sp))
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
38763094e0bb161580564954dee512955c1c79d3476Greg Clayton            event.reset (event_sp);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39163094e0bb161580564954dee512955c1c79d3476Greg Clayton    event.reset (NULL);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::HandleBroadcastEvent (const SBEvent &event)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39863094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (m_opaque_ptr)
39963094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40363094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener *
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator->() const
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40663094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr;
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40963094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener *
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::get() const
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return m_opaque_ptr;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41563094e0bb161580564954dee512955c1c79d3476Greg Claytonvoid
416538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBListener::reset(Listener *listener, bool owns)
41763094e0bb161580564954dee512955c1c79d3476Greg Clayton{
418538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (owns)
419538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp.reset (listener);
420538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    else
421538eb82a89a68dbc57251915080bd5152b333978Greg Clayton        m_opaque_sp.reset ();
42263094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_opaque_ptr = listener;
42363094e0bb161580564954dee512955c1c79d3476Greg Clayton}
42463094e0bb161580564954dee512955c1c79d3476Greg Clayton
425271a5db096ae183e9235ebd273c4a6aab6130b3eGreg ClaytonListener &
426271a5db096ae183e9235ebd273c4a6aab6130b3eGreg ClaytonSBListener::ref() const
427271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton{
428271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton    return *m_opaque_ptr;
429271a5db096ae183e9235ebd273c4a6aab6130b3eGreg Clayton}
43063094e0bb161580564954dee512955c1c79d3476Greg Clayton
43163094e0bb161580564954dee512955c1c79d3476Greg ClaytonListener &
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator *()
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43463094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ptr;
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43763094e0bb161580564954dee512955c1c79d3476Greg Claytonconst Listener &
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBListener::operator *() const
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44063094e0bb161580564954dee512955c1c79d3476Greg Clayton    return *m_opaque_ptr;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
444