[haiku-commits] haiku: hrev48258 - src/apps/debugger/user_interface/gui/inspector_window

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 9 Nov 2014 05:36:47 +0100 (CET)

hrev48258 adds 1 changeset to branch 'master'
old head: 1436fe7448ef691c602d278a2704f689baa179c7
new head: 3ea675fc93a37f4697bc4970f93fa4a951880a82
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=3ea675f+%5E1436fe7

----------------------------------------------------------------------------

3ea675f: Debugger: Fix #11430.
  
  InspectorWindow:
  - Inherit from Team::Listener and implement hook for thread state
    change events.
  - On thread state change, if the new state is stopped, and we have
    an active block, release it, and ask to re-inspect.
  - Factor out helper function for updating the active block.
  - Always ensure the MemoryView is updated when we change blocks.
  
  MemoryView:
  - Clean up acquisition of target memory block.
  
  This ensures that the block data is kept up to date when stepping
  through code with an inspector window open.

                                         [ Rene Gollent <rene@xxxxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev48258
Commit:      3ea675fc93a37f4697bc4970f93fa4a951880a82
URL:         http://cgit.haiku-os.org/haiku/commit/?id=3ea675f
Author:      Rene Gollent <rene@xxxxxxxxxxx>
Date:        Sun Nov  9 04:28:53 2014 UTC

Ticket:      https://dev.haiku-os.org/ticket/11430

----------------------------------------------------------------------------

3 files changed, 62 insertions(+), 23 deletions(-)
.../gui/inspector_window/InspectorWindow.cpp     | 66 +++++++++++++++-----
.../gui/inspector_window/InspectorWindow.h       | 10 ++-
.../gui/inspector_window/MemoryView.cpp          |  9 +--

----------------------------------------------------------------------------

diff --git 
a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp 
b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
index 6f0536f..0fd48f0 100644
--- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
+++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
@@ -51,15 +51,14 @@ InspectorWindow::InspectorWindow(::Team* team, 
UserInterfaceListener* listener,
        fExpressionInfo(NULL),
        fTarget(target)
 {
+       AutoLocker< ::Team> teamLocker(fTeam);
+       fTeam->AddListener(this);
 }
 
 
 InspectorWindow::~InspectorWindow()
 {
-       if (fCurrentBlock != NULL) {
-               fCurrentBlock->RemoveListener(this);
-               fCurrentBlock->ReleaseReference();
-       }
+       _SetCurrentBlock(NULL);
 
        if (fLanguage != NULL)
                fLanguage->ReleaseReference();
@@ -68,6 +67,9 @@ InspectorWindow::~InspectorWindow()
                fExpressionInfo->RemoveListener(this);
                fExpressionInfo->ReleaseReference();
        }
+
+       AutoLocker< ::Team> teamLocker(fTeam);
+       fTeam->RemoveListener(this);
 }
 
 
@@ -206,11 +208,27 @@ InspectorWindow::_Init()
 }
 
 
-
 void
 InspectorWindow::MessageReceived(BMessage* message)
 {
        switch (message->what) {
+               case MSG_THREAD_STATE_CHANGED:
+               {
+                       ::Thread* thread;
+                       if (message->FindPointer("thread",
+                                       reinterpret_cast<void**>(&thread)) != 
B_OK) {
+                               break;
+                       }
+
+                       BReference< ::Thread> threadReference(thread, true);
+                       if (thread->State() == THREAD_STATE_STOPPED) {
+                               if (fCurrentBlock != NULL) {
+                                       _SetCurrentBlock(NULL);
+                                       _SetToAddress(fCurrentAddress);
+                               }
+                       }
+                       break;
+               }
                case MSG_INSPECT_ADDRESS:
                {
                        target_addr_t address = 0;
@@ -226,7 +244,6 @@ InspectorWindow::MessageReceived(BMessage* message)
                                _SetToAddress(address);
                        break;
                }
-
                case MSG_EXPRESSION_EVALUATED:
                {
                        BString errorMessage;
@@ -281,17 +298,8 @@ InspectorWindow::MessageReceived(BMessage* message)
                                break;
                        }
 
-                       {
-                               AutoLocker< ::Team> teamLocker(fTeam);
-                               block->RemoveListener(this);
-                       }
-
                        if (result == B_OK) {
-                               if (fCurrentBlock != NULL)
-                                       fCurrentBlock->ReleaseReference();
-
-                               fCurrentBlock = block;
-                               fMemoryView->SetTargetAddress(block, 
fCurrentAddress);
+                               _SetCurrentBlock(block);
                                fPreviousBlockButton->SetEnabled(true);
                                fNextBlockButton->SetEnabled(true);
                        } else {
@@ -330,6 +338,18 @@ InspectorWindow::QuitRequested()
 
 
 void
+InspectorWindow::ThreadStateChanged(const Team::ThreadEvent& event)
+{
+       BMessage message(MSG_THREAD_STATE_CHANGED);
+       BReference< ::Thread> threadReference(event.GetThread());
+       message.AddPointer("thread", threadReference.Get());
+
+       if (PostMessage(&message) == B_OK)
+               threadReference.Detach();
+}
+
+
+void
 InspectorWindow::MemoryBlockRetrieved(TeamMemoryBlock* block)
 {
        BMessage message(MSG_MEMORY_BLOCK_RETRIEVED);
@@ -480,3 +500,17 @@ InspectorWindow::_SetToAddress(target_addr_t address)
        } else
                fMemoryView->SetTargetAddress(fCurrentBlock, address);
 }
+
+
+void
+InspectorWindow::_SetCurrentBlock(TeamMemoryBlock* block)
+{
+       AutoLocker< ::Team> teamLocker(fTeam);
+       if (fCurrentBlock != NULL) {
+               fCurrentBlock->RemoveListener(this);
+               fCurrentBlock->ReleaseReference();
+       }
+
+       fCurrentBlock = block;
+       fMemoryView->SetTargetAddress(fCurrentBlock, fCurrentAddress);
+}
diff --git 
a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h 
b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
index e1de9be..29c951f 100644
--- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
+++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
@@ -24,9 +24,8 @@ class SourceLanguage;
 class UserInterfaceListener;
 
 
-class InspectorWindow : public BWindow,
-       public TeamMemoryBlock::Listener,
-       public MemoryView::Listener,
+class InspectorWindow : public BWindow, private Team::Listener,
+       private TeamMemoryBlock::Listener,      private MemoryView::Listener,
        private ExpressionInfo::Listener {
 public:
                                                                
InspectorWindow(::Team* team,
@@ -42,6 +41,10 @@ public:
        virtual void                            MessageReceived(BMessage* 
message);
        virtual bool                            QuitRequested();
 
+       // Team::Listener
+       virtual void                            ThreadStateChanged(
+                                                                       const 
Team::ThreadEvent& event);
+
        // TeamMemoryBlock::Listener
        virtual void                            
MemoryBlockRetrieved(TeamMemoryBlock* block);
        virtual void                            MemoryBlockRetrievalFailed(
@@ -70,6 +73,7 @@ private:
                                                                        
BMessage& settings);
 
        void                                            
_SetToAddress(target_addr_t address);
+       void                                            
_SetCurrentBlock(TeamMemoryBlock* block);
 
 private:
        UserInterfaceListener*          fListener;
diff --git 
a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp 
b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp
index c0dd2b6..bfdd848 100644
--- a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp
+++ b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp
@@ -90,12 +90,13 @@ void
 MemoryView::SetTargetAddress(TeamMemoryBlock* block, target_addr_t address)
 {
        fTargetAddress = address;
-       if (block != fTargetBlock && fTargetBlock != NULL)
-               fTargetBlock->ReleaseReference();
-
        if (block != fTargetBlock) {
+               if (fTargetBlock != NULL)
+                       fTargetBlock->ReleaseReference();
+
                fTargetBlock = block;
-               fTargetBlock->AcquireReference();
+               if (block != NULL)
+                       fTargetBlock->AcquireReference();
        }
 
        MakeFocus(true);


Other related posts:

  • » [haiku-commits] haiku: hrev48258 - src/apps/debugger/user_interface/gui/inspector_window - anevilyak