[Lldb-commits] [lldb] r150665 - in /lldb/trunk: include/lldb/ include/lldb/API/ include/lldb/Core/ include/lldb/Interpreter/ include/lldb/Target/ scripts/Python/interface/ source/API/ source/Commands/ source/Core/ source/Interpreter/ source/Plugins/Process/MacOSX-Kernel/ source/Plugins/Process/gdb-remote/ source/Target/ tools/driver/
Jim Ingham
jingham at apple.com
Wed Feb 15 22:50:01 PST 2012
Author: jingham
Date: Thu Feb 16 00:50:00 2012
New Revision: 150665
URL: http://llvm.org/viewvc/llvm-project?rev=150665&view=rev
Log:
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>
Modified:
lldb/trunk/include/lldb/API/SBCommandInterpreter.h
lldb/trunk/include/lldb/API/SBCommunication.h
lldb/trunk/include/lldb/API/SBDebugger.h
lldb/trunk/include/lldb/API/SBEvent.h
lldb/trunk/include/lldb/API/SBListener.h
lldb/trunk/include/lldb/API/SBProcess.h
lldb/trunk/include/lldb/API/SBTarget.h
lldb/trunk/include/lldb/Core/Broadcaster.h
lldb/trunk/include/lldb/Core/Communication.h
lldb/trunk/include/lldb/Core/Debugger.h
lldb/trunk/include/lldb/Core/Listener.h
lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h
lldb/trunk/include/lldb/Target/Process.h
lldb/trunk/include/lldb/Target/Target.h
lldb/trunk/include/lldb/Target/TargetList.h
lldb/trunk/include/lldb/lldb-forward.h
lldb/trunk/scripts/Python/interface/SBCommandInterpreter.i
lldb/trunk/scripts/Python/interface/SBCommunication.i
lldb/trunk/scripts/Python/interface/SBEvent.i
lldb/trunk/scripts/Python/interface/SBListener.i
lldb/trunk/scripts/Python/interface/SBProcess.i
lldb/trunk/scripts/Python/interface/SBTarget.i
lldb/trunk/source/API/SBBroadcaster.cpp
lldb/trunk/source/API/SBCommandInterpreter.cpp
lldb/trunk/source/API/SBCommunication.cpp
lldb/trunk/source/API/SBEvent.cpp
lldb/trunk/source/API/SBListener.cpp
lldb/trunk/source/API/SBProcess.cpp
lldb/trunk/source/API/SBTarget.cpp
lldb/trunk/source/Commands/CommandObjectProcess.cpp
lldb/trunk/source/Core/Broadcaster.cpp
lldb/trunk/source/Core/Communication.cpp
lldb/trunk/source/Core/Debugger.cpp
lldb/trunk/source/Core/Listener.cpp
lldb/trunk/source/Interpreter/CommandInterpreter.cpp
lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Target/Process.cpp
lldb/trunk/source/Target/Target.cpp
lldb/trunk/source/Target/TargetList.cpp
lldb/trunk/tools/driver/Driver.cpp
Modified: lldb/trunk/include/lldb/API/SBCommandInterpreter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBCommandInterpreter.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBCommandInterpreter.h (original)
+++ lldb/trunk/include/lldb/API/SBCommandInterpreter.h Thu Feb 16 00:50:00 2012
@@ -50,6 +50,9 @@
lldb::SBBroadcaster
GetBroadcaster ();
+
+ static const char *
+ GetBroadcasterClass ();
bool
HasCommands ();
Modified: lldb/trunk/include/lldb/API/SBCommunication.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBCommunication.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBCommunication.h (original)
+++ lldb/trunk/include/lldb/API/SBCommunication.h Thu Feb 16 00:50:00 2012
@@ -39,6 +39,8 @@
lldb::SBBroadcaster
GetBroadcaster ();
+
+ static const char *GetBroadcasterClass();
lldb::ConnectionStatus
AdoptFileDesriptor (int fd, bool owns_fd);
Modified: lldb/trunk/include/lldb/API/SBDebugger.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBDebugger.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBDebugger.h (original)
+++ lldb/trunk/include/lldb/API/SBDebugger.h Thu Feb 16 00:50:00 2012
@@ -277,6 +277,7 @@
friend class SBProcess;
friend class SBSourceManager;
friend class SBTarget;
+ friend class SBListener;
lldb::SBTarget
FindTargetWithLLDBProcess (const lldb::ProcessSP &processSP);
Modified: lldb/trunk/include/lldb/API/SBEvent.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBEvent.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBEvent.h (original)
+++ lldb/trunk/include/lldb/API/SBEvent.h Thu Feb 16 00:50:00 2012
@@ -47,6 +47,9 @@
lldb::SBBroadcaster
GetBroadcaster () const;
+ const char *
+ GetBroadcasterClass () const;
+
bool
BroadcasterMatchesPtr (const lldb::SBBroadcaster *broadcaster);
Modified: lldb/trunk/include/lldb/API/SBListener.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBListener.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBListener.h (original)
+++ lldb/trunk/include/lldb/API/SBListener.h Thu Feb 16 00:50:00 2012
@@ -38,6 +38,16 @@
IsValid () const;
uint32_t
+ StartListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask);
+
+ bool
+ StopListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask);
+
+ uint32_t
StartListeningForEvents (const lldb::SBBroadcaster& broadcaster,
uint32_t event_mask);
Modified: lldb/trunk/include/lldb/API/SBProcess.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBProcess.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBProcess.h (original)
+++ lldb/trunk/include/lldb/API/SBProcess.h Thu Feb 16 00:50:00 2012
@@ -42,6 +42,9 @@
~SBProcess();
+ static const char *
+ GetBroadcasterClassName ();
+
void
Clear ();
@@ -178,6 +181,9 @@
lldb::SBBroadcaster
GetBroadcaster () const;
+ static const char *
+ GetBroadcasterClass ();
+
bool
GetDescription (lldb::SBStream &description);
Modified: lldb/trunk/include/lldb/API/SBTarget.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTarget.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTarget.h (original)
+++ lldb/trunk/include/lldb/API/SBTarget.h Thu Feb 16 00:50:00 2012
@@ -52,6 +52,9 @@
bool
IsValid() const;
+
+ static const char *
+ GetBroadcasterClassName ();
lldb::SBProcess
GetProcess ();
Modified: lldb/trunk/include/lldb/Core/Broadcaster.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Broadcaster.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Broadcaster.h (original)
+++ lldb/trunk/include/lldb/Core/Broadcaster.h Thu Feb 16 00:50:00 2012
@@ -20,11 +20,192 @@
// Project includes
#include "lldb/lldb-private.h"
//#include "lldb/Core/Flags.h"
+#include "lldb/Core/ConstString.h"
#include "lldb/Core/Listener.h"
namespace lldb_private {
//----------------------------------------------------------------------
+// lldb::BroadcastEventSpec
+//
+// This class is used to specify a kind of event to register for. The Debugger
+// maintains a list of BroadcastEventSpec's and when it is made
+//----------------------------------------------------------------------
+class BroadcastEventSpec
+{
+public:
+ BroadcastEventSpec (const ConstString &broadcaster_class, uint32_t event_bits) :
+ m_broadcaster_class (broadcaster_class),
+ m_event_bits (event_bits)
+ {
+ }
+
+ BroadcastEventSpec (const BroadcastEventSpec &rhs);
+
+ ~BroadcastEventSpec() {}
+
+ const ConstString &GetBroadcasterClass() const
+ {
+ return m_broadcaster_class;
+ }
+
+ uint32_t GetEventBits () const
+ {
+ return m_event_bits;
+ }
+
+ // Tell whether this BroadcastEventSpec is contained in in_spec.
+ // That is:
+ // (a) the two spec's share the same broadcaster class
+ // (b) the event bits of this spec are wholly contained in those of in_spec.
+ bool IsContainedIn (BroadcastEventSpec in_spec) const
+ {
+ if (m_broadcaster_class != in_spec.GetBroadcasterClass())
+ return false;
+ uint32_t in_bits = in_spec.GetEventBits();
+ if (in_bits == m_event_bits)
+ return true;
+ else
+ {
+ if ((m_event_bits & in_bits) != 0
+ && (m_event_bits & ~in_bits) == 0)
+ return true;
+ }
+ return false;
+ }
+
+ bool operator< (const BroadcastEventSpec &rhs) const;
+ const BroadcastEventSpec &operator= (const BroadcastEventSpec &rhs);
+
+private:
+ ConstString m_broadcaster_class;
+ uint32_t m_event_bits;
+};
+
+class BroadcasterManager
+{
+public:
+ BroadcasterManager ();
+
+ ~BroadcasterManager () {};
+
+ uint32_t
+ RegisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec);
+
+ bool
+ UnregisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec);
+
+ Listener *
+ GetListenerForEventSpec (BroadcastEventSpec event_spec) const;
+
+ void
+ SignUpListenersForBroadcaster (Broadcaster &broadcaster);
+
+ void
+ RemoveListener (Listener &Listener);
+
+protected:
+ void Clear();
+
+private:
+ typedef std::pair<BroadcastEventSpec, Listener *> event_listener_key;
+ typedef std::map<BroadcastEventSpec, Listener *> collection;
+ typedef std::set<Listener *> listener_collection;
+ collection m_event_map;
+ listener_collection m_listeners;
+
+ Mutex m_manager_mutex;
+
+ // A couple of comparator classes for find_if:
+
+ class BroadcasterClassMatches
+ {
+ public:
+ BroadcasterClassMatches (const ConstString &broadcaster_class) :
+ m_broadcaster_class (broadcaster_class)
+ {
+ }
+
+ ~BroadcasterClassMatches () {}
+
+ bool operator() (const event_listener_key input) const
+ {
+ return (input.first.GetBroadcasterClass() == m_broadcaster_class);
+ }
+
+ private:
+ ConstString m_broadcaster_class;
+ };
+
+ class BroadcastEventSpecMatches
+ {
+ public:
+ BroadcastEventSpecMatches (BroadcastEventSpec broadcaster_spec) :
+ m_broadcaster_spec (broadcaster_spec)
+ {
+ }
+
+ ~BroadcastEventSpecMatches () {}
+
+ bool operator() (const event_listener_key input) const
+ {
+ return (input.first.IsContainedIn (m_broadcaster_spec));
+ }
+
+ private:
+ BroadcastEventSpec m_broadcaster_spec;
+ };
+
+ class ListenerMatchesAndSharedBits
+ {
+ public:
+ ListenerMatchesAndSharedBits (BroadcastEventSpec broadcaster_spec,
+ const Listener &listener) :
+ m_broadcaster_spec (broadcaster_spec),
+ m_listener (&listener)
+ {
+ }
+
+ ~ListenerMatchesAndSharedBits () {}
+
+ bool operator() (const event_listener_key input) const
+ {
+ return (input.first.GetBroadcasterClass() == m_broadcaster_spec.GetBroadcasterClass()
+ && (input.first.GetEventBits() & m_broadcaster_spec.GetEventBits()) != 0
+ && input.second == m_listener);
+ }
+
+ private:
+ BroadcastEventSpec m_broadcaster_spec;
+ const Listener *m_listener;
+ };
+
+ class ListenerMatches
+ {
+ public:
+ ListenerMatches (const Listener &in_listener) :
+ m_listener (&in_listener)
+ {
+ }
+
+ ~ListenerMatches() {}
+
+ bool operator () (const event_listener_key input) const
+ {
+ if (input.second == m_listener)
+ return true;
+ else
+ return false;
+ }
+
+ private:
+ const Listener *m_listener;
+
+ };
+
+};
+
+//----------------------------------------------------------------------
/// @class Broadcaster Broadcaster.h "lldb/Core/Broadcaster.h"
/// @brief An event broadcasting class.
///
@@ -66,7 +247,7 @@
/// A NULL terminated C string that contains the name of the
/// broadcaster object.
//------------------------------------------------------------------
- Broadcaster (const char *name);
+ Broadcaster (BroadcasterManager *manager, const char *name);
//------------------------------------------------------------------
/// Destructor.
@@ -76,6 +257,9 @@
virtual
~Broadcaster();
+ void
+ CheckInWithManager ();
+
//------------------------------------------------------------------
/// Broadcast an event which has no associated data.
///
@@ -245,6 +429,10 @@
//------------------------------------------------------------------
void
RestoreBroadcaster ();
+
+ virtual ConstString &GetBroadcasterClass() const;
+
+ BroadcasterManager *GetManager();
protected:
@@ -266,6 +454,7 @@
std::vector<Listener *> m_hijacking_listeners; // A simple mechanism to intercept events from a broadcaster
std::vector<uint32_t> m_hijacking_masks; // At some point we may want to have a stack or Listener
// collections, but for now this is just for private hijacking.
+ BroadcasterManager *m_manager;
private:
//------------------------------------------------------------------
Modified: lldb/trunk/include/lldb/Core/Communication.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Communication.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Communication.h (original)
+++ lldb/trunk/include/lldb/Core/Communication.h Thu Feb 16 00:50:00 2012
@@ -332,6 +332,13 @@
m_close_on_eof = b;
}
+ static ConstString &GetStaticBroadcasterClass ();
+
+ virtual ConstString &GetBroadcasterClass() const
+ {
+ return GetStaticBroadcasterClass();
+ }
+
private:
//------------------------------------------------------------------
// For Communication only
Modified: lldb/trunk/include/lldb/Core/Debugger.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Debugger.h (original)
+++ lldb/trunk/include/lldb/Core/Debugger.h Thu Feb 16 00:50:00 2012
@@ -18,6 +18,7 @@
#include <stack>
#include "lldb/lldb-public.h"
+#include "lldb/Core/Broadcaster.h"
#include "lldb/Core/Communication.h"
#include "lldb/Core/FormatManager.h"
#include "lldb/Core/InputReaderStack.h"
@@ -253,7 +254,8 @@
class Debugger :
public std::tr1::enable_shared_from_this<Debugger>,
public UserID,
- public DebuggerInstanceSettings
+ public DebuggerInstanceSettings,
+ public BroadcasterManager
{
friend class SourceManager; // For GetSourceFileCache.
Modified: lldb/trunk/include/lldb/Core/Listener.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Listener.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Listener.h (original)
+++ lldb/trunk/include/lldb/Core/Listener.h Thu Feb 16 00:50:00 2012
@@ -16,6 +16,7 @@
#include <map>
#include <set>
#include <string>
+#include <vector>
// Other libraries and framework includes
@@ -32,6 +33,7 @@
typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
friend class Broadcaster;
+ friend class BroadcasterManager;
//------------------------------------------------------------------
// Constructors and Destructors
@@ -53,9 +55,17 @@
}
uint32_t
- StartListeningForEvents (Broadcaster* broadcaster,
+ StartListeningForEventSpec (BroadcasterManager &manager,
+ const BroadcastEventSpec &event_spec);
+
+ bool
+ StopListeningForEventSpec (BroadcasterManager &manager,
+ const BroadcastEventSpec &event_spec);
+
+ uint32_t
+ StartListeningForEvents (Broadcaster* broadcaster,
uint32_t event_mask);
-
+
uint32_t
StartListeningForEvents (Broadcaster* broadcaster,
uint32_t event_mask,
@@ -128,6 +138,7 @@
typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
typedef std::list<lldb::EventSP> event_collection;
+ typedef std::vector<BroadcasterManager *> broadcaster_manager_collection;
bool
FindNextEventInternal (Broadcaster *broadcaster, // NULL for any broadcaster
@@ -158,9 +169,14 @@
event_collection m_events;
Mutex m_events_mutex; // Protects m_broadcasters and m_events
Predicate<bool> m_cond_wait;
+ broadcaster_manager_collection m_broadcaster_managers;
void
BroadcasterWillDestruct (Broadcaster *);
+
+ void
+ BroadcasterManagerWillDestruct (BroadcasterManager *manager);
+
private:
// broadcaster_collection::iterator
Modified: lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h (original)
+++ lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h Thu Feb 16 00:50:00 2012
@@ -55,6 +55,15 @@
eCommandTypesAllThem = 0xFFFF // all commands
};
+ // These two functions fill out the Broadcaster interface:
+
+ static ConstString &GetStaticBroadcasterClass ();
+
+ virtual ConstString &GetBroadcasterClass() const
+ {
+ return GetStaticBroadcasterClass();
+ }
+
void
SourceInitFile (bool in_cwd,
CommandReturnObject &result);
@@ -437,7 +446,7 @@
{
return "*** Some of your variables have more members than the debugger will show by default. To show all of them, you can either use the --show-all-children option to %s or raise the limit by changing the target.max-children-count setting.\n";
}
-
+
protected:
friend class Debugger;
@@ -468,6 +477,7 @@
char m_repeat_char;
bool m_batch_command_mode;
ChildrenTruncatedWarningStatus m_truncation_warning; // Whether we truncated children and whether the user has been told
+
};
Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Thu Feb 16 00:50:00 2012
@@ -1296,7 +1296,16 @@
eBroadcastInternalStateControlPause = (1<<1),
eBroadcastInternalStateControlResume = (1<<2)
};
-
+
+ // These two functions fill out the Broadcaster interface:
+
+ static ConstString &GetStaticBroadcasterClass ();
+
+ virtual ConstString &GetBroadcasterClass() const
+ {
+ return GetStaticBroadcasterClass();
+ }
+
//------------------------------------------------------------------
/// A notification structure that can be used by clients to listen
/// for changes in a process's lifetime.
Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Thu Feb 16 00:50:00 2012
@@ -278,6 +278,52 @@
eBroadcastBitModulesUnloaded = (1 << 2)
};
+ // These two functions fill out the Broadcaster interface:
+
+ static ConstString &GetStaticBroadcasterClass ();
+
+ virtual ConstString &GetBroadcasterClass() const
+ {
+ return GetStaticBroadcasterClass();
+ }
+
+ // This event data class is for use by the TargetList to broadcast new target notifications.
+ class TargetEventData : public EventData
+ {
+ public:
+
+ static const ConstString &
+ GetFlavorString ();
+
+ virtual const ConstString &
+ GetFlavor () const;
+
+ TargetEventData (const lldb::TargetSP &new_target_sp);
+
+ lldb::TargetSP &
+ GetTarget()
+ {
+ return m_target_sp;
+ }
+
+ virtual
+ ~TargetEventData();
+
+ virtual void
+ Dump (Stream *s) const;
+
+ static const lldb::TargetSP
+ GetTargetFromEvent (const lldb::EventSP &event_sp);
+
+ static const TargetEventData *
+ GetEventDataFromEvent (const Event *event_sp);
+
+ private:
+ lldb::TargetSP m_target_sp;
+
+ DISALLOW_COPY_AND_ASSIGN (TargetEventData);
+ };
+
static void
SettingsInitialize ();
Modified: lldb/trunk/include/lldb/Target/TargetList.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/TargetList.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/TargetList.h (original)
+++ lldb/trunk/include/lldb/Target/TargetList.h Thu Feb 16 00:50:00 2012
@@ -34,7 +34,7 @@
///
/// @see static TargetList& lldb_private::Debugger::GetTargetList().
//------------------------------------------------------------------
- TargetList();
+ TargetList(Debugger &debugger);
public:
@@ -47,7 +47,16 @@
};
- ~TargetList();
+ // These two functions fill out the Broadcaster interface:
+
+ static ConstString &GetStaticBroadcasterClass ();
+
+ virtual ConstString &GetBroadcasterClass() const
+ {
+ return GetStaticBroadcasterClass();
+ }
+
+ virtual ~TargetList();
//------------------------------------------------------------------
/// Create a new Target.
Modified: lldb/trunk/include/lldb/lldb-forward.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward.h (original)
+++ lldb/trunk/include/lldb/lldb-forward.h Thu Feb 16 00:50:00 2012
@@ -41,7 +41,9 @@
class BreakpointResolver;
class BreakpointSite;
class BreakpointSiteList;
+class BroadcastEventSpec;
class Broadcaster;
+class BroadcasterManager;
class CPPLanguageRuntime;
class ClangASTContext;
class ClangASTImporter;
Modified: lldb/trunk/scripts/Python/interface/SBCommandInterpreter.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBCommandInterpreter.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBCommandInterpreter.i (original)
+++ lldb/trunk/scripts/Python/interface/SBCommandInterpreter.i Thu Feb 16 00:50:00 2012
@@ -87,6 +87,9 @@
lldb::SBBroadcaster
GetBroadcaster ();
+ static const char *
+ GetBroadcasterClass ();
+
bool
HasCommands ();
Modified: lldb/trunk/scripts/Python/interface/SBCommunication.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBCommunication.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBCommunication.i (original)
+++ lldb/trunk/scripts/Python/interface/SBCommunication.i Thu Feb 16 00:50:00 2012
@@ -34,6 +34,8 @@
lldb::SBBroadcaster
GetBroadcaster ();
+ static const char *GetBroadcasterClass();
+
lldb::ConnectionStatus
AdoptFileDesriptor (int fd, bool owns_fd);
Modified: lldb/trunk/scripts/Python/interface/SBEvent.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBEvent.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBEvent.i (original)
+++ lldb/trunk/scripts/Python/interface/SBEvent.i Thu Feb 16 00:50:00 2012
@@ -134,6 +134,9 @@
lldb::SBBroadcaster
GetBroadcaster () const;
+ const char *
+ GetBroadcasterClass () const;
+
bool
BroadcasterMatchesRef (const lldb::SBBroadcaster &broadcaster);
Modified: lldb/trunk/scripts/Python/interface/SBListener.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBListener.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBListener.i (original)
+++ lldb/trunk/scripts/Python/interface/SBListener.i Thu Feb 16 00:50:00 2012
@@ -35,6 +35,16 @@
IsValid () const;
uint32_t
+ StartListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask);
+
+ uint32_t
+ StopListeningForEventClass (SBDebugger &debugger,
+ const char *broadcaster_class,
+ uint32_t event_mask);
+
+ uint32_t
StartListeningForEvents (const lldb::SBBroadcaster& broadcaster,
uint32_t event_mask);
Modified: lldb/trunk/scripts/Python/interface/SBProcess.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBProcess.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBProcess.i (original)
+++ lldb/trunk/scripts/Python/interface/SBProcess.i Thu Feb 16 00:50:00 2012
@@ -52,6 +52,9 @@
~SBProcess();
+ static const char *
+ GetBroadcasterClassName ();
+
void
Clear ();
Modified: lldb/trunk/scripts/Python/interface/SBTarget.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBTarget.i?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBTarget.i (original)
+++ lldb/trunk/scripts/Python/interface/SBTarget.i Thu Feb 16 00:50:00 2012
@@ -72,6 +72,9 @@
//------------------------------------------------------------------
~SBTarget();
+ static const char *
+ GetBroadcasterClassName ();
+
bool
IsValid() const;
Modified: lldb/trunk/source/API/SBBroadcaster.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBBroadcaster.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBBroadcaster.cpp (original)
+++ lldb/trunk/source/API/SBBroadcaster.cpp Thu Feb 16 00:50:00 2012
@@ -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();
Modified: lldb/trunk/source/API/SBCommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBCommandInterpreter.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBCommandInterpreter.cpp (original)
+++ lldb/trunk/source/API/SBCommandInterpreter.cpp Thu Feb 16 00:50:00 2012
@@ -292,6 +292,12 @@
return broadcaster;
}
+const char *
+SBCommandInterpreter::GetBroadcasterClass ()
+{
+ return Communication::GetStaticBroadcasterClass().AsCString();
+}
+
const char *
SBCommandInterpreter::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
{
Modified: lldb/trunk/source/API/SBCommunication.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBCommunication.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBCommunication.cpp (original)
+++ lldb/trunk/source/API/SBCommunication.cpp Thu Feb 16 00:50:00 2012
@@ -255,6 +255,11 @@
return broadcaster;
}
+const char *
+SBCommunication::GetBroadcasterClass ()
+{
+ return Communication::GetStaticBroadcasterClass().AsCString();
+}
//
//void
Modified: lldb/trunk/source/API/SBEvent.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBEvent.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBEvent.cpp (original)
+++ lldb/trunk/source/API/SBEvent.cpp Thu Feb 16 00:50:00 2012
@@ -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)
{
Modified: lldb/trunk/source/API/SBListener.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBListener.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBListener.cpp (original)
+++ lldb/trunk/source/API/SBListener.cpp Thu Feb 16 00:50:00 2012
@@ -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)
{
Modified: lldb/trunk/source/API/SBProcess.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBProcess.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBProcess.cpp (original)
+++ lldb/trunk/source/API/SBProcess.cpp Thu Feb 16 00:50:00 2012
@@ -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)
{
Modified: lldb/trunk/source/API/SBTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTarget.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/API/SBTarget.cpp (original)
+++ lldb/trunk/source/API/SBTarget.cpp Thu Feb 16 00:50:00 2012
@@ -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)
{
Modified: lldb/trunk/source/Commands/CommandObjectProcess.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectProcess.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectProcess.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectProcess.cpp Thu Feb 16 00:50:00 2012
@@ -30,7 +30,7 @@
//-------------------------------------------------------------------------
// CommandObjectProcessLaunch
//-------------------------------------------------------------------------
-#pragma mark CommandObjectProjectLaunch
+#pragma mark CommandObjectProcessLaunch
class CommandObjectProcessLaunch : public CommandObject
{
public:
Modified: lldb/trunk/source/Core/Broadcaster.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Broadcaster.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Core/Broadcaster.cpp (original)
+++ lldb/trunk/source/Core/Broadcaster.cpp Thu Feb 16 00:50:00 2012
@@ -21,12 +21,13 @@
using namespace lldb;
using namespace lldb_private;
-Broadcaster::Broadcaster (const char *name) :
+Broadcaster::Broadcaster (BroadcasterManager *manager, const char *name) :
m_broadcaster_name (name),
m_listeners (),
m_listeners_mutex (Mutex::eMutexTypeRecursive),
m_hijacking_listeners(),
- m_hijacking_masks()
+ m_hijacking_masks(),
+ m_manager (manager)
{
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
if (log)
@@ -44,6 +45,15 @@
}
void
+Broadcaster::CheckInWithManager ()
+{
+ if (m_manager != NULL)
+ {
+ m_manager->SignUpListenersForBroadcaster(*this);
+ }
+}
+
+void
Broadcaster::Clear()
{
Mutex::Locker listeners_locker(m_listeners_mutex);
@@ -297,3 +307,173 @@
m_hijacking_masks.pop_back();
}
+ConstString &
+Broadcaster::GetBroadcasterClass() const
+{
+ static ConstString class_name ("lldb.anonymous");
+ return class_name;
+}
+
+BroadcastEventSpec::BroadcastEventSpec (const BroadcastEventSpec &rhs) :
+ m_broadcaster_class (rhs.m_broadcaster_class),
+ m_event_bits (rhs.m_event_bits)
+{
+}
+
+bool
+BroadcastEventSpec::operator< (const BroadcastEventSpec &rhs) const
+{
+ if (GetBroadcasterClass() == rhs.GetBroadcasterClass())
+ {
+ return GetEventBits() < rhs.GetEventBits();
+ }
+ else
+ {
+ return GetBroadcasterClass() < rhs.GetBroadcasterClass();
+ }
+}
+
+const BroadcastEventSpec &
+BroadcastEventSpec::operator= (const BroadcastEventSpec &rhs)
+{
+ m_broadcaster_class = rhs.m_broadcaster_class;
+ m_event_bits = rhs.m_event_bits;
+ return *this;
+}
+
+BroadcasterManager::BroadcasterManager() :
+ m_manager_mutex(Mutex::eMutexTypeRecursive)
+{
+
+}
+
+uint32_t
+BroadcasterManager::RegisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec)
+{
+ Mutex::Locker locker(m_manager_mutex);
+
+ collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end();
+ uint32_t available_bits = event_spec.GetEventBits();
+
+ while (iter != end_iter
+ && (iter = find_if (iter, end_iter, BroadcasterClassMatches(event_spec.GetBroadcasterClass()))) != end_iter)
+ {
+ available_bits &= ~((*iter).first.GetEventBits());
+ iter++;
+ }
+
+ if (available_bits != 0)
+ {
+ m_event_map.insert (event_listener_key (BroadcastEventSpec (event_spec.GetBroadcasterClass(), available_bits), &listener));
+ m_listeners.insert(&listener);
+ }
+
+ return available_bits;
+}
+
+bool
+BroadcasterManager::UnregisterListenerForEvents (Listener &listener, BroadcastEventSpec event_spec)
+{
+ Mutex::Locker locker(m_manager_mutex);
+ bool removed_some = false;
+
+ if (m_listeners.erase(&listener) == 0)
+ return false;
+
+ ListenerMatchesAndSharedBits predicate (event_spec, listener);
+ std::vector<BroadcastEventSpec> to_be_readded;
+ uint32_t event_bits_to_remove = event_spec.GetEventBits();
+
+ // Go through the map and delete the exact matches, and build a list of matches that weren't exact to re-add:
+ while (1)
+ {
+ collection::iterator iter, end_iter = m_event_map.end();
+ iter = find_if (m_event_map.begin(), end_iter, predicate);
+ if (iter == end_iter)
+ {
+ break;
+ }
+ else
+ {
+ uint32_t iter_event_bits = (*iter).first.GetEventBits();
+ removed_some = true;
+
+ if (event_bits_to_remove != iter_event_bits)
+ {
+ uint32_t new_event_bits = iter_event_bits & ~event_bits_to_remove;
+ to_be_readded.push_back(BroadcastEventSpec (event_spec.GetBroadcasterClass(), new_event_bits));
+ }
+ m_event_map.erase (iter);
+ }
+ }
+
+ // Okay now add back the bits that weren't completely removed:
+ for (size_t i = 0; i < to_be_readded.size(); i++)
+ {
+ m_event_map.insert (event_listener_key (to_be_readded[i], &listener));
+ }
+
+ return removed_some;
+}
+
+Listener *
+BroadcasterManager::GetListenerForEventSpec (BroadcastEventSpec event_spec) const
+{
+ Mutex::Locker locker(*(const_cast<Mutex *> (&m_manager_mutex)));
+
+ collection::const_iterator iter, end_iter = m_event_map.end();
+ iter = find_if (m_event_map.begin(), end_iter, BroadcastEventSpecMatches (event_spec));
+ if (iter != end_iter)
+ return (*iter).second;
+ else
+ return NULL;
+}
+
+void
+BroadcasterManager::RemoveListener (Listener &listener)
+{
+ Mutex::Locker locker(m_manager_mutex);
+ ListenerMatches predicate (listener);
+
+
+ if (m_listeners.erase (&listener) == 0)
+ return;
+
+ while (1)
+ {
+ collection::iterator iter, end_iter = m_event_map.end();
+ iter = find_if (m_event_map.begin(), end_iter, predicate);
+ if (iter == end_iter)
+ break;
+ else
+ m_event_map.erase(iter);
+ }
+}
+
+void
+BroadcasterManager::SignUpListenersForBroadcaster (Broadcaster &broadcaster)
+{
+ Mutex::Locker locker(m_manager_mutex);
+
+ collection::iterator iter = m_event_map.begin(), end_iter = m_event_map.end();
+
+ while (iter != end_iter
+ && (iter = find_if (iter, end_iter, BroadcasterClassMatches(broadcaster.GetBroadcasterClass()))) != end_iter)
+ {
+ (*iter).second->StartListeningForEvents (&broadcaster, (*iter).first.GetEventBits());
+ iter++;
+ }
+}
+
+void
+BroadcasterManager::Clear ()
+{
+ Mutex::Locker locker(m_manager_mutex);
+ listener_collection::iterator end_iter = m_listeners.end();
+
+ for (listener_collection::iterator iter = m_listeners.begin(); iter != end_iter; iter++)
+ (*iter)->BroadcasterManagerWillDestruct(this);
+ m_listeners.clear();
+ m_event_map.clear();
+
+}
Modified: lldb/trunk/source/Core/Communication.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Communication.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Core/Communication.cpp (original)
+++ lldb/trunk/source/Core/Communication.cpp Thu Feb 16 00:50:00 2012
@@ -23,11 +23,18 @@
using namespace lldb;
using namespace lldb_private;
+ConstString &
+Communication::GetStaticBroadcasterClass ()
+{
+ static ConstString class_name ("lldb.communication");
+ return class_name;
+}
+
//----------------------------------------------------------------------
// Constructor
//----------------------------------------------------------------------
Communication::Communication(const char *name) :
- Broadcaster (name),
+ Broadcaster (NULL, name),
m_connection_sp (),
m_read_thread (LLDB_INVALID_HOST_THREAD),
m_read_thread_enabled (false),
@@ -48,6 +55,8 @@
SetEventName (eBroadcastBitReadThreadDidExit, "read thread did exit");
SetEventName (eBroadcastBitReadThreadShouldExit, "read thread should exit");
SetEventName (eBroadcastBitPacketAvailable, "packet available");
+
+ CheckInWithManager();
}
//----------------------------------------------------------------------
Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Thu Feb 16 00:50:00 2012
@@ -333,7 +333,7 @@
m_input_file (),
m_output_file (),
m_error_file (),
- m_target_list (),
+ m_target_list (*this),
m_platform_list (),
m_listener ("lldb.Debugger"),
m_source_manager(*this),
@@ -374,6 +374,7 @@
target_sp->Destroy();
}
}
+ BroadcasterManager::Clear ();
DisconnectInput();
}
Modified: lldb/trunk/source/Core/Listener.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Listener.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Core/Listener.cpp (original)
+++ lldb/trunk/source/Core/Listener.cpp Thu Feb 16 00:50:00 2012
@@ -40,6 +40,13 @@
Listener::~Listener()
{
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
+ Mutex::Locker locker (m_broadcasters_mutex);
+
+ size_t num_managers = m_broadcaster_managers.size();
+
+ for (int i = 0; i < num_managers; i++)
+ m_broadcaster_managers[i]->RemoveListener(*this);
+
if (log)
log->Printf ("%p Listener::~Listener('%s')", this, m_name.c_str());
Clear();
@@ -164,6 +171,16 @@
}
void
+Listener::BroadcasterManagerWillDestruct (BroadcasterManager *manager)
+{
+ // Just need to remove this broadcast manager from the list of managers:
+ broadcaster_manager_collection::iterator iter, end_iter = m_broadcaster_managers.end();
+ iter = find(m_broadcaster_managers.begin(), end_iter, manager);
+ if (iter != end_iter)
+ m_broadcaster_managers.erase (iter);
+}
+
+void
Listener::AddEvent (EventSP &event_sp)
{
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EVENTS));
@@ -483,3 +500,27 @@
}
return num_handled;
}
+
+uint32_t
+Listener::StartListeningForEventSpec (BroadcasterManager &manager,
+ const BroadcastEventSpec &event_spec)
+{
+ Mutex::Locker locker(m_broadcasters_mutex);
+
+ uint32_t bits_acquired = manager.RegisterListenerForEvents(*this, event_spec);
+ if (bits_acquired)
+ m_broadcaster_managers.push_back(&manager);
+
+ return bits_acquired;
+}
+
+bool
+Listener::StopListeningForEventSpec (BroadcasterManager &manager,
+ const BroadcastEventSpec &event_spec)
+{
+ Mutex::Locker locker(m_broadcasters_mutex);
+ return manager.UnregisterListenerForEvents (*this, event_spec);
+
+}
+
+
Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Thu Feb 16 00:50:00 2012
@@ -59,13 +59,20 @@
using namespace lldb;
using namespace lldb_private;
+ConstString &
+CommandInterpreter::GetStaticBroadcasterClass ()
+{
+ static ConstString class_name ("lldb.commandInterpreter");
+ return class_name;
+}
+
CommandInterpreter::CommandInterpreter
(
Debugger &debugger,
ScriptLanguage script_language,
bool synchronous_execution
) :
- Broadcaster ("lldb.command-interpreter"),
+ Broadcaster (&debugger, "lldb.command-interpreter"),
m_debugger (debugger),
m_synchronous_execution (synchronous_execution),
m_skip_lldbinit_files (false),
@@ -86,6 +93,8 @@
SetEventName (eBroadcastBitThreadShouldExit, "thread-should-exit");
SetEventName (eBroadcastBitResetPrompt, "reset-prompt");
SetEventName (eBroadcastBitQuitCommandReceived, "quit");
+
+ CheckInWithManager ();
}
void
Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Thu Feb 16 00:50:00 2012
@@ -89,7 +89,7 @@
ProcessKDP::ProcessKDP(Target& target, Listener &listener) :
Process (target, listener),
m_comm("lldb.process.kdp-remote.communication"),
- m_async_broadcaster ("lldb.process.kdp-remote.async-broadcaster"),
+ m_async_broadcaster (NULL, "lldb.process.kdp-remote.async-broadcaster"),
m_async_thread (LLDB_INVALID_HOST_THREAD)
{
// m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit");
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Thu Feb 16 00:50:00 2012
@@ -146,7 +146,7 @@
m_last_stop_packet (),
m_last_stop_packet_mutex (Mutex::eMutexTypeNormal),
m_register_info (),
- m_async_broadcaster ("lldb.process.gdb-remote.async-broadcaster"),
+ m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"),
m_async_thread (LLDB_INVALID_HOST_THREAD),
m_continue_c_tids (),
m_continue_C_tids (),
Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Thu Feb 16 00:50:00 2012
@@ -743,19 +743,25 @@
return process_sp;
}
+ConstString &
+Process::GetStaticBroadcasterClass ()
+{
+ static ConstString class_name ("lldb.process");
+ return class_name;
+}
//----------------------------------------------------------------------
// Process constructor
//----------------------------------------------------------------------
Process::Process(Target &target, Listener &listener) :
UserID (LLDB_INVALID_PROCESS_ID),
- Broadcaster ("lldb.process"),
+ Broadcaster (&(target.GetDebugger()), "lldb.process"),
ProcessInstanceSettings (GetSettingsController()),
m_target (target),
m_public_state (eStateUnloaded),
m_private_state (eStateUnloaded),
- m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"),
- m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"),
+ m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"),
+ m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"),
m_private_state_listener ("lldb.process.internal_state_listener"),
m_private_state_control_wait(),
m_private_state_thread (LLDB_INVALID_HOST_THREAD),
@@ -783,6 +789,8 @@
m_can_jit(eCanJITDontKnow)
{
UpdateInstanceName();
+
+ CheckInWithManager ();
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
if (log)
Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Thu Feb 16 00:50:00 2012
@@ -41,11 +41,18 @@
using namespace lldb;
using namespace lldb_private;
+ConstString &
+Target::GetStaticBroadcasterClass ()
+{
+ static ConstString class_name ("lldb.target");
+ return class_name;
+}
+
//----------------------------------------------------------------------
// Target constructor
//----------------------------------------------------------------------
Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) :
- Broadcaster ("lldb.target"),
+ Broadcaster (&debugger, "lldb.target"),
ExecutionContextScope (),
TargetInstanceSettings (GetSettingsController()),
m_debugger (debugger),
@@ -72,6 +79,8 @@
SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed");
SetEventName (eBroadcastBitModulesLoaded, "modules-loaded");
SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded");
+
+ CheckInWithManager();
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
if (log)
@@ -2773,3 +2782,58 @@
{ TSC_DISABLE_STDIO , eSetVarTypeBoolean, "false" , NULL, false, false, "Disable stdin/stdout for process (e.g. for a GUI application)" },
{ NULL , eSetVarTypeNone , NULL , NULL, false, false, NULL }
};
+
+const ConstString &
+Target::TargetEventData::GetFlavorString ()
+{
+ static ConstString g_flavor ("Target::TargetEventData");
+ return g_flavor;
+}
+
+const ConstString &
+Target::TargetEventData::GetFlavor () const
+{
+ return TargetEventData::GetFlavorString ();
+}
+
+Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) :
+ EventData(),
+ m_target_sp (new_target_sp)
+{
+}
+
+Target::TargetEventData::~TargetEventData()
+{
+
+}
+
+void
+Target::TargetEventData::Dump (Stream *s) const
+{
+
+}
+
+const TargetSP
+Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp)
+{
+ TargetSP target_sp;
+
+ const TargetEventData *data = GetEventDataFromEvent (event_sp.get());
+ if (data)
+ target_sp = data->m_target_sp;
+
+ return target_sp;
+}
+
+const Target::TargetEventData *
+Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
+{
+ if (event_ptr)
+ {
+ const EventData *event_data = event_ptr->GetData();
+ if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
+ return static_cast <const TargetEventData *> (event_ptr->GetData());
+ }
+ return NULL;
+}
+
Modified: lldb/trunk/source/Target/TargetList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetList.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/source/Target/TargetList.cpp (original)
+++ lldb/trunk/source/Target/TargetList.cpp Thu Feb 16 00:50:00 2012
@@ -25,16 +25,23 @@
using namespace lldb;
using namespace lldb_private;
+ConstString &
+TargetList::GetStaticBroadcasterClass ()
+{
+ static ConstString class_name ("lldb.targetList");
+ return class_name;
+}
//----------------------------------------------------------------------
// TargetList constructor
//----------------------------------------------------------------------
-TargetList::TargetList() :
- Broadcaster("TargetList"),
+TargetList::TargetList(Debugger &debugger) :
+ Broadcaster(&debugger, "TargetList"),
m_target_list(),
m_target_list_mutex (Mutex::eMutexTypeRecursive),
m_selected_target_idx (0)
{
+ CheckInWithManager();
}
//----------------------------------------------------------------------
@@ -176,9 +183,6 @@
Mutex::Locker locker(m_target_list_mutex);
m_selected_target_idx = m_target_list.size();
m_target_list.push_back(target_sp);
-
- // Now sign the Debugger up to listen to target events for this target:
- debugger.GetListener().StartListeningForEvents(target_sp.get(), Target::eBroadcastBitBreakpointChanged);
}
return error;
Modified: lldb/trunk/tools/driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/driver/Driver.cpp?rev=150665&r1=150664&r2=150665&view=diff
==============================================================================
--- lldb/trunk/tools/driver/Driver.cpp (original)
+++ lldb/trunk/tools/driver/Driver.cpp Thu Feb 16 00:50:00 2012
@@ -1233,6 +1233,9 @@
m_debugger.PushInputReader (m_editline_reader);
SBListener listener(m_debugger.GetListener());
+ listener.StartListeningForEventClass(m_debugger,
+ SBTarget::GetBroadcasterClassName(),
+ SBTarget::eBroadcastBitBreakpointChanged);
if (listener.IsValid())
{
More information about the lldb-commits
mailing list