[Lldb-commits] [lldb] Make sure that a `Progress` "completed" update is always reported at destruction (PR #102097)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 6 15:11:56 PDT 2024
https://github.com/royitaqi updated https://github.com/llvm/llvm-project/pull/102097
>From 8222646222673a07d52eeb2b3a02c380e253249c Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Mon, 5 Aug 2024 20:30:14 -0700
Subject: [PATCH 1/2] Make sure that a progress completed update is always
reported at Progress destruction
---
lldb/source/Core/Progress.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lldb/source/Core/Progress.cpp b/lldb/source/Core/Progress.cpp
index 1a779e2ddf924..e0ba1a63c508e 100644
--- a/lldb/source/Core/Progress.cpp
+++ b/lldb/source/Core/Progress.cpp
@@ -45,8 +45,7 @@ Progress::~Progress() {
// Make sure to always report progress completed when this object is
// destructed so it indicates the progress dialog/activity should go away.
std::lock_guard<std::mutex> guard(m_mutex);
- if (!m_completed)
- m_completed = m_total;
+ m_completed = m_total;
ReportProgress();
// Report to the ProgressManager if that subsystem is enabled.
>From a2c9310e66250a9d046b42e8446cf5b8c2ff8172 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Tue, 6 Aug 2024 15:11:44 -0700
Subject: [PATCH 2/2] Add unit test
---
lldb/unittests/Core/ProgressReportTest.cpp | 74 ++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/lldb/unittests/Core/ProgressReportTest.cpp b/lldb/unittests/Core/ProgressReportTest.cpp
index 141244feb1f08..d21a181affdc1 100644
--- a/lldb/unittests/Core/ProgressReportTest.cpp
+++ b/lldb/unittests/Core/ProgressReportTest.cpp
@@ -133,6 +133,80 @@ TEST_F(ProgressReportTest, TestReportCreation) {
EXPECT_EQ(data->GetMessage(), "Progress report 1: Starting report 1");
}
+TEST_F(ProgressReportTest, TestReportDestructionWithPartialProgress) {
+ ListenerSP listener_sp = CreateListenerFor(lldb::eBroadcastBitProgress);
+ EventSP event_sp;
+ const ProgressEventData *data;
+
+ // Create a finite progress report and only increment to a non-completed
+ // state before destruction.
+ {
+ Progress progress("Finite progress", "Report 1", 100);
+ progress.Increment(3);
+ }
+
+ // Verify that the progress in the events are:
+ // 1. At construction: 0 out of 100
+ // 2. At increment: 3 out of 100
+ // 3. At destruction: 100 out of 100
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 1");
+ EXPECT_TRUE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), (uint64_t)0);
+ EXPECT_EQ(data->GetTotal(), (uint64_t)100);
+ EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1");
+
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 1");
+ EXPECT_TRUE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), (uint64_t)3);
+ EXPECT_EQ(data->GetTotal(), (uint64_t)100);
+ EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1");
+
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 1");
+ EXPECT_TRUE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), (uint64_t)100);
+ EXPECT_EQ(data->GetTotal(), (uint64_t)100);
+ EXPECT_EQ(data->GetMessage(), "Finite progress: Report 1");
+
+ // Create an infinite progress report and increment by some amount.
+ {
+ Progress progress("Infinite progress", "Report 2");
+ progress.Increment(3);
+ }
+
+ // Verify that the progress in the events are:
+ // 1. At construction: 0
+ // 2. At increment: 3
+ // 3. At destruction: 100 out of 100
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 2");
+ EXPECT_FALSE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), (uint64_t)0);
+ EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal);
+ EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2");
+
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 2");
+ EXPECT_FALSE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), (uint64_t)3);
+ EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal);
+ EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2");
+
+ ASSERT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
+ data = ProgressEventData::GetEventDataFromEvent(event_sp.get());
+ EXPECT_EQ(data->GetDetails(), "Report 2");
+ EXPECT_FALSE(data->IsFinite());
+ EXPECT_EQ(data->GetCompleted(), Progress::kNonDeterministicTotal);
+ EXPECT_EQ(data->GetTotal(), Progress::kNonDeterministicTotal);
+ EXPECT_EQ(data->GetMessage(), "Infinite progress: Report 2");}
+
TEST_F(ProgressReportTest, TestProgressManager) {
ListenerSP listener_sp =
CreateListenerFor(lldb::eBroadcastBitProgressCategory);
More information about the lldb-commits
mailing list