Debugger: Add listener interface for TargetHostInterface.

This commit is contained in:
Rene Gollent
2016-04-20 20:47:30 -04:00
parent a1afac4dca
commit 5bb138f751
2 changed files with 96 additions and 2 deletions
@@ -36,6 +36,7 @@ TeamDebuggerOptions::TeamDebuggerOptions()
TargetHostInterface::TargetHostInterface()
:
BLooper(),
fListeners(),
fTeamDebuggers(20, false)
{
}
@@ -43,6 +44,10 @@ TargetHostInterface::TargetHostInterface()
TargetHostInterface::~TargetHostInterface()
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->TargetHostInterfaceQuit(this);
}
}
@@ -124,6 +129,22 @@ TargetHostInterface::RemoveTeamDebugger(TeamDebugger* debugger)
}
void
TargetHostInterface::AddListener(Listener* listener)
{
AutoLocker<TargetHostInterface> interfaceLocker(this);
fListeners.Add(listener);
}
void
TargetHostInterface::RemoveListener(Listener* listener)
{
AutoLocker<TargetHostInterface> interfaceLocker(this);
fListeners.Remove(listener);
}
void
TargetHostInterface::Quit()
{
@@ -172,6 +193,7 @@ TargetHostInterface::TeamDebuggerStarted(TeamDebugger* debugger)
{
AutoLocker<TargetHostInterface> locker(this);
AddTeamDebugger(debugger);
_NotifyTeamDebuggerStarted(debugger);
}
@@ -189,9 +211,9 @@ TargetHostInterface::TeamDebuggerQuit(TeamDebugger* debugger)
{
AutoLocker<TargetHostInterface> interfaceLocker(this);
RemoveTeamDebugger(debugger);
interfaceLocker.Unlock();
if (debugger->Thread() >= 0) {
_NotifyTeamDebuggerQuit(debugger);
BMessage message(MSG_TEAM_DEBUGGER_QUIT);
message.AddInt32("thread", debugger->Thread());
PostMessage(&message);
@@ -251,6 +273,26 @@ TargetHostInterface::_StartTeamDebugger(team_id teamID,
}
void
TargetHostInterface::_NotifyTeamDebuggerStarted(TeamDebugger* debugger)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->TeamDebuggerStarted(debugger);
}
}
void
TargetHostInterface::_NotifyTeamDebuggerQuit(TeamDebugger* debugger)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->TeamDebuggerQuit(debugger);
}
}
/*static*/ int
TargetHostInterface::_CompareDebuggers(const TeamDebugger* a,
const TeamDebugger* b)
@@ -269,3 +311,30 @@ TargetHostInterface::_FindDebuggerByKey(const team_id* team,
return 1;
return 0;
}
// #pragma mark - TargetHostInterface::Listener
TargetHostInterface::Listener::~Listener()
{
}
void
TargetHostInterface::Listener::TeamDebuggerStarted(TeamDebugger* debugger)
{
}
void
TargetHostInterface::Listener::TeamDebuggerQuit(TeamDebugger* debugger)
{
}
void
TargetHostInterface::Listener::TargetHostInterfaceQuit(
TargetHostInterface* interface)
{
}
@@ -10,6 +10,8 @@
#include <ObjectList.h>
#include <util/DoublyLinkedList.h>
#include "TeamDebugger.h"
@@ -17,13 +19,13 @@ class DebuggerInterface;
class Settings;
class SettingsManager;
class TargetHost;
class TeamDebugger;
struct TeamDebuggerOptions;
class UserInterface;
class TargetHostInterface : public BLooper, private TeamDebugger::Listener {
public:
class Listener;
TargetHostInterface();
virtual ~TargetHostInterface();
@@ -52,6 +54,10 @@ public:
virtual status_t FindTeamByThread(thread_id thread,
team_id& _teamID) const = 0;
void AddListener(Listener* listener);
void RemoveListener(Listener* listener);
// BLooper
virtual void Quit();
virtual void MessageReceived(BMessage* message);
@@ -67,18 +73,37 @@ private:
status_t _StartTeamDebugger(team_id teamID,
const TeamDebuggerOptions& options,
bool stopInMain);
void _NotifyTeamDebuggerStarted(
TeamDebugger* debugger);
void _NotifyTeamDebuggerQuit(
TeamDebugger* debugger);
static int _CompareDebuggers(const TeamDebugger* a,
const TeamDebugger* b);
static int _FindDebuggerByKey(const team_id* team,
const TeamDebugger* debugger);
private:
typedef DoublyLinkedList<Listener> ListenerList;
typedef BObjectList<TeamDebugger> TeamDebuggerList;
private:
ListenerList fListeners;
TeamDebuggerList fTeamDebuggers;
};
class TargetHostInterface::Listener
: public DoublyLinkedListLinkImpl<Listener> {
public:
virtual ~Listener();
virtual void TeamDebuggerStarted(TeamDebugger* debugger);
virtual void TeamDebuggerQuit(TeamDebugger* debugger);
virtual void TargetHostInterfaceQuit(
TargetHostInterface* interface);
};
struct TeamDebuggerOptions {
TeamDebuggerOptions();
int commandLineArgc;