From 3c6ba4733bb0e2f36c8aee83d2d9c5b654984c47 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Fri, 19 Apr 2013 17:47:53 -0400 Subject: [PATCH] Fix #9684. Implement MemoryBlockRetrievalFailed() hook in DebugReportGenerator. Use it to report failure to dump the stack memory region instead of hanging forever waiting for the request to succeed. --- .../controllers/DebugReportGenerator.cpp | 31 +++++++++++++++++-- .../controllers/DebugReportGenerator.h | 3 ++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/apps/debugger/controllers/DebugReportGenerator.cpp b/src/apps/debugger/controllers/DebugReportGenerator.cpp index 03fad008e9..580507b9f1 100644 --- a/src/apps/debugger/controllers/DebugReportGenerator.cpp +++ b/src/apps/debugger/controllers/DebugReportGenerator.cpp @@ -50,6 +50,7 @@ DebugReportGenerator::DebugReportGenerator(::Team* team, fListener(listener), fWaitingNode(NULL), fCurrentBlock(NULL), + fBlockRetrievalStatus(B_OK), fTraceWaitingThread(NULL) { fTeam->AddListener(this); @@ -186,6 +187,24 @@ DebugReportGenerator::MemoryBlockRetrieved(TeamMemoryBlock* block) fCurrentBlock = NULL; } + fBlockRetrievalStatus = B_OK; + + fCurrentBlock = block; + release_sem(fTeamDataSem); +} + + +void +DebugReportGenerator::MemoryBlockRetrievalFailed(TeamMemoryBlock* block, + status_t result) +{ + if (fCurrentBlock != NULL) { + fCurrentBlock->ReleaseReference(); + fCurrentBlock = NULL; + } + + fBlockRetrievalStatus = result; + fCurrentBlock = block; release_sem(fTeamDataSem); } @@ -484,8 +503,16 @@ DebugReportGenerator::_DumpStackFrameMemory(BString& _output, } _output << "\t\t\tFrame memory:\n"; - UiUtils::DumpMemory(_output, 3, fCurrentBlock, startAddress, 1, 16, - endAddress - startAddress); + if (fBlockRetrievalStatus == B_OK) { + UiUtils::DumpMemory(_output, 3, fCurrentBlock, startAddress, 1, 16, + endAddress - startAddress); + } else { + BString data; + data.SetToFormat("\t\t\tUnavailable (%s)\n", strerror( + fBlockRetrievalStatus)); + _output += data; + } + } diff --git a/src/apps/debugger/controllers/DebugReportGenerator.h b/src/apps/debugger/controllers/DebugReportGenerator.h index 0a9e680457..4b4f0100c5 100644 --- a/src/apps/debugger/controllers/DebugReportGenerator.h +++ b/src/apps/debugger/controllers/DebugReportGenerator.h @@ -50,6 +50,8 @@ private: // TeamMemoryBlock::Listener virtual void MemoryBlockRetrieved(TeamMemoryBlock* block); + virtual void MemoryBlockRetrievalFailed( + TeamMemoryBlock* block, status_t result); // ValueNodeContainer::Listener virtual void ValueNodeValueChanged(ValueNode* node); @@ -81,6 +83,7 @@ private: UserInterfaceListener* fListener; ValueNode* fWaitingNode; TeamMemoryBlock* fCurrentBlock; + status_t fBlockRetrievalStatus; ::Thread* fTraceWaitingThread; };