From d1331844fbc02620888a67fc87a74398790c346c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 25 Apr 2009 19:16:58 +0000 Subject: [PATCH] * Also compute the threads' total waits/wait time. * Added wait times to threads table and general thread page. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30408 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debuganalyzer/Model.cpp | 10 +++++++ src/apps/debuganalyzer/Model.h | 27 +++++++++++++++++++ src/apps/debuganalyzer/ModelLoader.cpp | 1 + .../debuganalyzer/main_window/ThreadsPage.cpp | 17 +++++++++++- .../thread_window/GeneralPage.cpp | 18 ++++++++----- .../debuganalyzer/thread_window/GeneralPage.h | 1 + 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/apps/debuganalyzer/Model.cpp b/src/apps/debuganalyzer/Model.cpp index d22409278a..f185bffbe6 100644 --- a/src/apps/debuganalyzer/Model.cpp +++ b/src/apps/debuganalyzer/Model.cpp @@ -129,6 +129,8 @@ Model::Thread::Thread(Team* team, const system_profiler_thread_added* event, fTotalRerunTime(0), fMinRerunTime(-1), fMaxRerunTime(-1), + fWaits(0), + fTotalWaitTime(0), fUnspecifiedWaitTime(0), fPreemptions(0), fWaitObjectGroups(20, true) @@ -199,6 +201,14 @@ Model::Thread::AddPreemption(bigtime_t runTime) } +void +Model::Thread::AddWait(bigtime_t waitTime) +{ + fWaits++; + fTotalWaitTime += waitTime; +} + + void Model::Thread::AddUnspecifiedWait(bigtime_t waitTime) { diff --git a/src/apps/debuganalyzer/Model.h b/src/apps/debuganalyzer/Model.h index 07955bc404..125a7c2fc1 100644 --- a/src/apps/debuganalyzer/Model.h +++ b/src/apps/debuganalyzer/Model.h @@ -230,6 +230,9 @@ public: inline int64 Latencies() const; inline bigtime_t TotalLatency() const; inline int64 Preemptions() const; + inline int64 Waits() const; + inline bigtime_t TotalWaitTime() const; + inline bigtime_t UnspecifiedWaitTime() const; ThreadWaitObjectGroup* ThreadWaitObjectGroupFor(uint32 type, addr_t object) const; @@ -240,6 +243,7 @@ public: void AddRerun(bigtime_t runTime); void AddLatency(bigtime_t latency); void AddPreemption(bigtime_t runTime); + void AddWait(bigtime_t waitTime); void AddUnspecifiedWait(bigtime_t waitTime); ThreadWaitObject* AddThreadWaitObject(WaitObject* waitObject, @@ -281,6 +285,8 @@ private: bigtime_t fMinRerunTime; bigtime_t fMaxRerunTime; + int64 fWaits; + bigtime_t fTotalWaitTime; bigtime_t fUnspecifiedWaitTime; int64 fPreemptions; @@ -593,6 +599,27 @@ Model::Thread::Preemptions() const } +int64 +Model::Thread::Waits() const +{ + return fWaits; +} + + +bigtime_t +Model::Thread::TotalWaitTime() const +{ + return fTotalWaitTime; +} + + +bigtime_t +Model::Thread::UnspecifiedWaitTime() const +{ + return fUnspecifiedWaitTime; +} + + void Model::Thread::SetDeletionTime(bigtime_t time) { diff --git a/src/apps/debuganalyzer/ModelLoader.cpp b/src/apps/debuganalyzer/ModelLoader.cpp index a29ad4f893..8204598095 100644 --- a/src/apps/debuganalyzer/ModelLoader.cpp +++ b/src/apps/debuganalyzer/ModelLoader.cpp @@ -552,6 +552,7 @@ ModelLoader::_HandleThreadEnqueuedInRunQueue( if (thread->waitObject != NULL) { thread->waitObject->AddWait(diffTime); thread->waitObject = NULL; + thread->thread->AddWait(diffTime); } else if (thread->state != UNKNOWN) thread->thread->AddUnspecifiedWait(diffTime); diff --git a/src/apps/debuganalyzer/main_window/ThreadsPage.cpp b/src/apps/debuganalyzer/main_window/ThreadsPage.cpp index 50bb9ba690..a1b096338e 100644 --- a/src/apps/debuganalyzer/main_window/ThreadsPage.cpp +++ b/src/apps/debuganalyzer/main_window/ThreadsPage.cpp @@ -25,7 +25,7 @@ public: virtual int32 CountColumns() const { - return 11; + return 14; } virtual int32 CountRows() const @@ -79,6 +79,15 @@ public: case 10: value.SetTo(thread->TotalRerunTime()); return true; + case 11: + value.SetTo(thread->Waits()); + return true; + case 12: + value.SetTo(thread->TotalWaitTime()); + return true; + case 13: + value.SetTo(thread->UnspecifiedWaitTime()); + return true; default: return false; } @@ -128,6 +137,12 @@ MainWindow::ThreadsPage::ThreadsPage(MainWindow* parent) 1000, B_TRUNCATE_END, B_ALIGN_RIGHT)); fThreadsTable->AddColumn(new BigtimeTableColumn(10, "Preemption Time", 80, 20, 1000, false, B_TRUNCATE_END, B_ALIGN_RIGHT)); + fThreadsTable->AddColumn(new Int64TableColumn(11, "Waits", 80, 20, + 1000, B_TRUNCATE_END, B_ALIGN_RIGHT)); + fThreadsTable->AddColumn(new BigtimeTableColumn(12, "Wait Time", 80, + 20, 1000, false, B_TRUNCATE_END, B_ALIGN_RIGHT)); + fThreadsTable->AddColumn(new BigtimeTableColumn(13, "Unspecified Time", 80, + 20, 1000, false, B_TRUNCATE_END, B_ALIGN_RIGHT)); fThreadsTable->AddTableListener(this); } diff --git a/src/apps/debuganalyzer/thread_window/GeneralPage.cpp b/src/apps/debuganalyzer/thread_window/GeneralPage.cpp index c6f5405e63..31622d5237 100644 --- a/src/apps/debuganalyzer/thread_window/GeneralPage.cpp +++ b/src/apps/debuganalyzer/thread_window/GeneralPage.cpp @@ -19,7 +19,8 @@ ThreadWindow::GeneralPage::GeneralPage() fRunTimeView(NULL), fWaitTimeView(NULL), fLatencyView(NULL), - fPreemptionView(NULL) + fPreemptionView(NULL), + fUnspecifiedTimeView(NULL) { fThreadNameView = AddDataView("Name:"); fThreadIDView = AddDataView("ID:"); @@ -28,6 +29,7 @@ ThreadWindow::GeneralPage::GeneralPage() fWaitTimeView = AddDataView("Wait Time:"); fLatencyView = AddDataView("Latencies:"); fPreemptionView = AddDataView("Preemptions:"); + fUnspecifiedTimeView = AddDataView("Unspecified Time:"); } @@ -63,11 +65,9 @@ ThreadWindow::GeneralPage::SetModel(Model* model, Model::Thread* thread) fRunTimeView->SetText(buffer); // wait time - fWaitTimeView->SetText(""); -// TODO:... -// snprintf(buffer, sizeof(buffer), "%lld μs (%lld)", -// fThread->TotalRunTime(), fThread->Runs()); -// fWaitTimeView->SetText(buffer); + snprintf(buffer, sizeof(buffer), "%lld μs (%lld)", + fThread->TotalWaitTime(), fThread->Waits()); + fWaitTimeView->SetText(buffer); // latencies snprintf(buffer, sizeof(buffer), "%lld μs (%lld)", @@ -78,6 +78,11 @@ ThreadWindow::GeneralPage::SetModel(Model* model, Model::Thread* thread) snprintf(buffer, sizeof(buffer), "%lld μs (%lld)", fThread->TotalRerunTime(), fThread->Preemptions()); fPreemptionView->SetText(buffer); + + // unspecified time + snprintf(buffer, sizeof(buffer), "%lld μs", + fThread->UnspecifiedWaitTime()); + fUnspecifiedTimeView->SetText(buffer); } else { fThreadNameView->SetText(""); fThreadIDView->SetText(""); @@ -86,5 +91,6 @@ ThreadWindow::GeneralPage::SetModel(Model* model, Model::Thread* thread) fWaitTimeView->SetText(""); fLatencyView->SetText(""); fPreemptionView->SetText(""); + fUnspecifiedTimeView->SetText(""); } } diff --git a/src/apps/debuganalyzer/thread_window/GeneralPage.h b/src/apps/debuganalyzer/thread_window/GeneralPage.h index b97e516d54..38b97668c3 100644 --- a/src/apps/debuganalyzer/thread_window/GeneralPage.h +++ b/src/apps/debuganalyzer/thread_window/GeneralPage.h @@ -29,6 +29,7 @@ private: TextDataView* fWaitTimeView; TextDataView* fLatencyView; TextDataView* fPreemptionView; + TextDataView* fUnspecifiedTimeView; };