* If a stack frame is selected show its registers instead those of the top

frame.
* Some cleanup in ThreadListView.
* Unregister view listeners in the window destructor.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31147 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-06-20 19:26:47 +00:00
parent cba4143217
commit c3edfca6e4
6 changed files with 138 additions and 38 deletions
@@ -135,6 +135,11 @@ public:
}
}
StackFrame* FrameAt(int32 index) const
{
return fStackTrace != NULL ? fStackTrace->FrameAt(index) : NULL;
}
private:
StackTrace* fStackTrace;
};
@@ -143,11 +148,12 @@ private:
// #pragma mark - StackTraceView
StackTraceView::StackTraceView()
StackTraceView::StackTraceView(Listener* listener)
:
BGroupView(B_VERTICAL),
fFramesTable(NULL),
fFramesTableModel(NULL)
fFramesTableModel(NULL),
fListener(listener)
{
SetName("Stack Trace");
}
@@ -162,9 +168,9 @@ StackTraceView::~StackTraceView()
/*static*/ StackTraceView*
StackTraceView::Create()
StackTraceView::Create(Listener* listener)
{
StackTraceView* self = new StackTraceView();
StackTraceView* self = new StackTraceView(listener);
try {
self->_Init();
@@ -177,6 +183,13 @@ StackTraceView::Create()
}
void
StackTraceView::UnsetListener()
{
fListener = NULL;
}
void
StackTraceView::SetStackTrace(StackTrace* stackTrace)
{
@@ -195,6 +208,19 @@ StackTraceView::SetStackTrace(StackTrace* stackTrace)
}
void
StackTraceView::TableSelectionChanged(Table* table)
{
if (fListener == NULL)
return;
StackFrame* frame
= fFramesTableModel->FrameAt(table->SelectionModel()->RowAt(0));
fListener->StackFrameSelectionChanged(frame);
}
void
StackTraceView::TableRowInvoked(Table* table, int32 rowIndex)
{
@@ -213,11 +239,20 @@ StackTraceView::_Init()
1000, B_TRUNCATE_END, B_ALIGN_RIGHT));
fFramesTable->AddColumn(new TargetAddressValueColumn(1, "IP", 80, 40, 1000,
B_TRUNCATE_END, B_ALIGN_RIGHT));
fFramesTable->AddColumn(new StringTableColumn(2, "Function", 80, 40, 1000,
fFramesTable->AddColumn(new StringTableColumn(2, "Function", 300, 100, 1000,
B_TRUNCATE_END, B_ALIGN_LEFT));
fFramesTableModel = new FramesTableModel();
fFramesTable->SetTableModel(fFramesTableModel);
fFramesTable->SetSelectionMode(B_SINGLE_SELECTION_LIST);
fFramesTable->AddTableListener(this);
}
// #pragma mark - Listener
StackTraceView::Listener::~Listener()
{
}
@@ -11,14 +11,22 @@
#include "Team.h"
class StackFrame;
class StackTraceView : public BGroupView, private TableListener {
public:
StackTraceView();
class Listener;
public:
StackTraceView(Listener* listener);
~StackTraceView();
static StackTraceView* Create();
static StackTraceView* Create(Listener* listener);
// throws
void UnsetListener();
void SetStackTrace(StackTrace* stackTrace);
private:
@@ -26,6 +34,7 @@ private:
private:
// TableListener
virtual void TableSelectionChanged(Table* table);
virtual void TableRowInvoked(Table* table, int32 rowIndex);
void _Init();
@@ -34,6 +43,16 @@ private:
StackTrace* fStackTrace;
Table* fFramesTable;
FramesTableModel* fFramesTableModel;
Listener* fListener;
};
class StackTraceView::Listener {
public:
virtual ~Listener();
virtual void StackFrameSelectionChanged(
StackFrame* frame) = 0;
};
@@ -34,6 +34,7 @@ TeamWindow::TeamWindow(TeamDebugModel* debugModel, Listener* listener)
B_ASYNCHRONOUS_CONTROLS),
fDebugModel(debugModel),
fActiveThread(NULL),
fActiveStackFrame(NULL),
fListener(listener),
fTabView(NULL),
fLocalsTabView(NULL),
@@ -58,6 +59,11 @@ TeamWindow::TeamWindow(TeamDebugModel* debugModel, Listener* listener)
TeamWindow::~TeamWindow()
{
if (fThreadListView != NULL)
fThreadListView->UnsetListener();
if (fStackTraceView != NULL)
fStackTraceView->UnsetListener();
fDebugModel->GetTeam()->RemoveListener(this);
}
@@ -143,6 +149,13 @@ TeamWindow::ThreadSelectionChanged(::Thread* thread)
}
void
TeamWindow::StackFrameSelectionChanged(StackFrame* frame)
{
_SetActiveStackFrame(frame);
}
void
TeamWindow::ThreadStateChanged(const Team::ThreadEvent& event)
{
@@ -197,7 +210,7 @@ TeamWindow::_Init()
fTabView->AddTab(threadGroup);
BLayoutBuilder::Split<>(threadGroup)
.Add(fThreadListView = ThreadListView::Create(this))
.Add(fStackTraceView = StackTraceView::Create());
.Add(fStackTraceView = StackTraceView::Create(this));
// add images tab
BSplitView* imagesGroup = new BSplitView(B_HORIZONTAL);
@@ -243,11 +256,6 @@ TeamWindow::_SetActiveThread(::Thread* thread)
AutoLocker<TeamDebugModel> locker(fDebugModel);
_UpdateRunButtons();
CpuState* cpuState = fActiveThread != NULL
? fActiveThread->GetCpuState() : NULL;
Reference<CpuState> cpuStateReference(cpuState);
// hold a reference until the register view has one
StackTrace* stackTrace = fActiveThread != NULL
? fActiveThread->GetStackTrace() : NULL;
Reference<StackTrace> stackTraceReference(stackTrace);
@@ -255,8 +263,49 @@ TeamWindow::_SetActiveThread(::Thread* thread)
locker.Unlock();
fRegisterView->SetCpuState(cpuState);
fStackTraceView->SetStackTrace(stackTrace);
_UpdateCpuState();
}
void
TeamWindow::_SetActiveStackFrame(StackFrame* frame)
{
if (frame == fActiveStackFrame)
return;
if (fActiveStackFrame != NULL)
fActiveStackFrame->RemoveReference();
fActiveStackFrame = frame;
if (fActiveStackFrame != NULL)
fActiveStackFrame->AddReference();
_UpdateCpuState();
}
void
TeamWindow::_UpdateCpuState()
{
// get the CPU state
CpuState* cpuState = NULL;
Reference<CpuState> cpuStateReference;
// hold a reference until the register view has one
if (fActiveThread != NULL) {
// Get the CPU state from the active stack frame or the thread directly.
if (fActiveStackFrame == NULL) {
AutoLocker<TeamDebugModel> locker(fDebugModel);
cpuState = fActiveThread->GetCpuState();
cpuStateReference.SetTo(cpuState);
locker.Unlock();
} else
cpuState = fActiveStackFrame->GetCpuState();
}
fRegisterView->SetCpuState(cpuState);
}
@@ -312,16 +361,7 @@ TeamWindow::_HandleCpuStateChanged(thread_id threadID)
if (fActiveThread == NULL || threadID != fActiveThread->ID())
return;
AutoLocker<TeamDebugModel> locker(fDebugModel);
CpuState* cpuState = fActiveThread != NULL
? fActiveThread->GetCpuState() : NULL;
Reference<CpuState> reference(cpuState);
// hold a reference until the register view has one
locker.Unlock();
fRegisterView->SetCpuState(cpuState);
_UpdateCpuState();
}
@@ -8,6 +8,7 @@
#include <String.h>
#include <Window.h>
#include "StackTraceView.h"
#include "Team.h"
#include "ThreadListView.h"
@@ -16,12 +17,11 @@ class BButton;
class BTabView;
class ImageListView;
class RegisterView;
class StackTraceView;
class TeamDebugModel;
class TeamWindow : public BWindow, private ThreadListView::Listener,
Team::Listener {
StackTraceView::Listener, Team::Listener {
public:
class Listener;
@@ -41,6 +41,9 @@ private:
// ThreadListView::Listener
virtual void ThreadSelectionChanged(::Thread* thread);
// StackTraceView::Listener
virtual void StackFrameSelectionChanged(StackFrame* frame);
// Team::Listener
virtual void ThreadStateChanged(
const Team::ThreadEvent& event);
@@ -52,6 +55,8 @@ private:
void _Init();
void _SetActiveThread(::Thread* thread);
void _SetActiveStackFrame(StackFrame* frame);
void _UpdateCpuState();
void _UpdateRunButtons();
void _HandleThreadStateChanged(thread_id threadID);
@@ -61,6 +66,7 @@ private:
private:
TeamDebugModel* fDebugModel;
::Thread* fActiveThread;
StackFrame* fActiveStackFrame;
Listener* fListener;
BTabView* fTabView;
BTabView* fLocalsTabView;
@@ -165,6 +165,13 @@ ThreadListView::Create(Listener* listener)
}
void
ThreadListView::UnsetListener()
{
fListener = NULL;
}
void
ThreadListView::SetTeam(Team* team)
{
@@ -222,6 +229,9 @@ ThreadListView::ThreadRemoved(const Team::ThreadEvent& event)
void
ThreadListView::TableSelectionChanged(Table* table)
{
if (fListener == NULL)
return;
Thread* thread = NULL;
if (fThreadsTableModel != NULL) {
TableSelectionModel* selectionModel = table->SelectionModel();
@@ -232,17 +242,6 @@ ThreadListView::TableSelectionChanged(Table* table)
}
void
ThreadListView::TableRowInvoked(Table* table, int32 rowIndex)
{
// if (fThreadsTableModel != NULL) {
// Thread* thread = fThreadsTableModel->ThreadAt(rowIndex);
// if (thread != NULL)
// fParent->OpenThreadWindow(thread);
// }
}
void
ThreadListView::_Init()
{
@@ -26,6 +26,8 @@ public:
static ThreadListView* Create(Listener* listener);
// throws
void UnsetListener();
void SetTeam(Team* team);
virtual void MessageReceived(BMessage* message);
@@ -40,7 +42,6 @@ private:
// TableListener
virtual void TableSelectionChanged(Table* table);
virtual void TableRowInvoked(Table* table, int32 rowIndex);
void _Init();