Add a general mechanism to wait on the debugger for Broadcasters of a given class/event bit set.
Use this to allow the lldb Driver to emit notifications for breakpoint modifications.
<rdar://problem/10619974>


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@150665 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBBroadcaster.cpp b/source/API/SBBroadcaster.cpp
index a33f784..9ede891 100644
--- a/source/API/SBBroadcaster.cpp
+++ b/source/API/SBBroadcaster.cpp
@@ -25,7 +25,7 @@
 }
 
 SBBroadcaster::SBBroadcaster (const char *name) :
-    m_opaque_sp (new Broadcaster (name)),
+    m_opaque_sp (new Broadcaster (NULL, name)),
     m_opaque_ptr (NULL)
 {
     m_opaque_ptr = m_opaque_sp.get();
diff --git a/source/API/SBCommandInterpreter.cpp b/source/API/SBCommandInterpreter.cpp
index e605478..cbf2f91 100644
--- a/source/API/SBCommandInterpreter.cpp
+++ b/source/API/SBCommandInterpreter.cpp
@@ -292,6 +292,12 @@
     return broadcaster;
 }
 
+const char *
+SBCommandInterpreter::GetBroadcasterClass ()
+{
+    return Communication::GetStaticBroadcasterClass().AsCString();
+}
+
 const char * 
 SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
 {
diff --git a/source/API/SBCommunication.cpp b/source/API/SBCommunication.cpp
index 6b5ddb3..bf3a49e 100644
--- a/source/API/SBCommunication.cpp
+++ b/source/API/SBCommunication.cpp
@@ -255,6 +255,11 @@
     return broadcaster;
 }
 
+const char *
+SBCommunication::GetBroadcasterClass ()
+{
+    return Communication::GetStaticBroadcasterClass().AsCString();
+}
 
 //
 //void
diff --git a/source/API/SBEvent.cpp b/source/API/SBEvent.cpp
index f9d0e0c..5ba71b0 100644
--- a/source/API/SBEvent.cpp
+++ b/source/API/SBEvent.cpp
@@ -109,6 +109,16 @@
     return broadcaster;
 }
 
+const char *
+SBEvent::GetBroadcasterClass () const
+{
+    const Event *lldb_event = get();
+    if (lldb_event)
+        return lldb_event->GetBroadcaster()->GetBroadcasterClass().AsCString();
+    else
+        return "unknown class";
+}
+
 bool
 SBEvent::BroadcasterMatchesPtr (const SBBroadcaster *broadcaster)
 {
diff --git a/source/API/SBListener.cpp b/source/API/SBListener.cpp
index f981634..b1942be 100644
--- a/source/API/SBListener.cpp
+++ b/source/API/SBListener.cpp
@@ -9,9 +9,11 @@
 
 #include "lldb/API/SBListener.h"
 #include "lldb/API/SBBroadcaster.h"
+#include "lldb/API/SBDebugger.h"
 #include "lldb/API/SBEvent.h"
 #include "lldb/API/SBStream.h"
 #include "lldb/Core/Broadcaster.h"
+#include "lldb/Core/Debugger.h"
 #include "lldb/Core/Listener.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/StreamString.h"
@@ -90,6 +92,40 @@
         m_opaque_ptr->Clear ();
 }
 
+    uint32_t
+    SBListener::StartListeningForEventClass (SBDebugger &debugger,
+                                 const char *broadcaster_class, 
+                                 uint32_t event_mask)
+    {
+        if (m_opaque_ptr)
+        {
+            Debugger *lldb_debugger = debugger.get();
+            if (!lldb_debugger)
+                return 0;
+            BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
+            return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
+        }
+        else
+            return 0;
+    }
+                                 
+    bool
+    SBListener::StopListeningForEventClass (SBDebugger &debugger,
+                                const char *broadcaster_class,
+                                uint32_t event_mask)
+    {
+        if (m_opaque_ptr)
+        {
+            Debugger *lldb_debugger = debugger.get();
+            if (!lldb_debugger)
+                return false;
+            BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
+            return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
+        }
+        else
+            return false;
+    }
+    
 uint32_t
 SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
 {
diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp
index 5fc7196..9e32f91 100644
--- a/source/API/SBProcess.cpp
+++ b/source/API/SBProcess.cpp
@@ -74,6 +74,12 @@
 {
 }
 
+const char *
+SBProcess::GetBroadcasterClassName ()
+{
+    return Process::GetStaticBroadcasterClass().AsCString();
+}
+
 lldb::ProcessSP
 SBProcess::GetSP() const
 {
@@ -743,7 +749,7 @@
 bool
 SBProcess::EventIsProcessEvent (const SBEvent &event)
 {
-    return Process::ProcessEventData::GetEventDataFromEvent(event.get()) != NULL;
+    return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
 }
 
 SBBroadcaster
@@ -762,6 +768,12 @@
     return broadcaster;
 }
 
+const char *
+SBProcess::GetBroadcasterClass ()
+{
+    return Process::GetStaticBroadcasterClass().AsCString();
+}
+
 size_t
 SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
 {
diff --git a/source/API/SBTarget.cpp b/source/API/SBTarget.cpp
index 687c44e..7fdfb34 100644
--- a/source/API/SBTarget.cpp
+++ b/source/API/SBTarget.cpp
@@ -87,6 +87,12 @@
 {
 }
 
+const char *
+SBTarget::GetBroadcasterClassName ()
+{
+    return Target::GetStaticBroadcasterClass().AsCString();
+}
+
 bool
 SBTarget::IsValid () const
 {
@@ -1235,7 +1241,6 @@
     return broadcaster;
 }
 
-
 bool
 SBTarget::GetDescription (SBStream &description, lldb::DescriptionLevel description_level)
 {