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)
{