diff --git a/src/bin/debug/profile/BasicThreadProfileResult.cpp b/src/bin/debug/profile/BasicThreadProfileResult.cpp index 2f1cd7ee57..059d8940ce 100644 --- a/src/bin/debug/profile/BasicThreadProfileResult.cpp +++ b/src/bin/debug/profile/BasicThreadProfileResult.cpp @@ -119,41 +119,16 @@ BasicThreadProfileResult::AddDroppedTicks(int32 dropped) void BasicThreadProfileResult::PrintResults() { - // count images and symbols - int32 imageCount = 0; + // get hit images + BasicThreadImage* images[fOldImages.Size() + fImages.Size()]; + int32 imageCount = GetHitImages(images); + + // count symbols int32 symbolCount = 0; - - ImageList::Iterator it = fOldImages.GetIterator(); - while (BasicThreadImage* image = it.Next()) { - if (image->TotalHits() > 0) { - imageCount++; - if (image->TotalHits() > image->UnknownHits()) - symbolCount += image->GetImage()->SymbolCount(); - } - } - - it = fImages.GetIterator(); - while (BasicThreadImage* image = it.Next()) { - if (image->TotalHits() > 0) { - imageCount++; - if (image->TotalHits() > image->UnknownHits()) - symbolCount += image->GetImage()->SymbolCount(); - } - } - - BasicThreadImage* images[imageCount]; - imageCount = 0; - - it = fOldImages.GetIterator(); - while (BasicThreadImage* image = it.Next()) { - if (image->TotalHits() > 0) - images[imageCount++] = image; - } - - it = fImages.GetIterator(); - while (BasicThreadImage* image = it.Next()) { - if (image->TotalHits() > 0) - images[imageCount++] = image; + for (int32 k = 0; k < imageCount; k++) { + BasicThreadImage* image = images[k]; + if (image->TotalHits() > image->UnknownHits()) + symbolCount += image->GetImage()->SymbolCount(); } // find and sort the hit symbols @@ -261,7 +236,7 @@ InclusiveThreadProfileResult::AddSamples(addr_t* samples, int32 sampleCount) symbol = image->GetImage()->FindSymbol(address); if (symbol < 0) { // TODO: Count unknown image hits? - } else if (symbol != previousSymbol) + } else if (image != previousImage || symbol != previousSymbol) image->AddSymbolHit(symbol); if (image != previousImage) diff --git a/src/bin/debug/profile/Thread.h b/src/bin/debug/profile/Thread.h index 170a18490b..f32c72772e 100644 --- a/src/bin/debug/profile/Thread.h +++ b/src/bin/debug/profile/Thread.h @@ -105,6 +105,7 @@ public: virtual void SynchronizeImages(int32 event); ThreadImageType* FindImage(addr_t address) const; + int32 GetHitImages(ThreadImageType** images) const; virtual void AddSamples(addr_t* samples, int32 sampleCount) = 0; @@ -239,7 +240,7 @@ void AbstractThreadProfileResult::SynchronizeImages(int32 event) { // remove obsolete images - ImageList::Iterator it = fImages.GetIterator(); + typename ImageList::Iterator it = fImages.GetIterator(); while (ThreadImageType* image = it.Next()) { int32 deleted = image->GetImage()->DeletionEvent(); if (deleted >= 0 && event >= deleted) { @@ -266,7 +267,7 @@ template ThreadImageType* AbstractThreadProfileResult::FindImage(addr_t address) const { - ImageList::ConstIterator it = fImages.GetIterator(); + typename ImageList::ConstIterator it = fImages.GetIterator(); while (ThreadImageType* image = it.Next()) { if (image->ContainsAddress(address)) return image; @@ -275,4 +276,26 @@ AbstractThreadProfileResult::FindImage(addr_t address) const } +template +int32 +AbstractThreadProfileResult::GetHitImages( + ThreadImageType** images) const +{ + int32 imageCount = 0; + + typename ImageList::ConstIterator it = fOldImages.GetIterator(); + while (ThreadImageType* image = it.Next()) { + if (image->TotalHits() > 0) + images[imageCount++] = image; + } + + it = fImages.GetIterator(); + while (ThreadImageType* image = it.Next()) { + if (image->TotalHits() > 0) + images[imageCount++] = image; + } + + return imageCount; +} + #endif // THREAD_H