https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/128966
>From 7597ee080abcaaa8b88af316409feb849fb6d7f2 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Wed, 26 Feb 2025 15:38:24 -0800 Subject: [PATCH 1/4] Add a finalize method to the sbprogress, with an associated doc string and a test --- .../bindings/interface/SBProgressDocstrings.i | 7 +++ lldb/include/lldb/API/SBProgress.h | 5 +++ lldb/source/API/SBProgress.cpp | 10 +++++ .../python_api/sbprogress/TestSBProgress.py | 43 ++++++------------- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/lldb/bindings/interface/SBProgressDocstrings.i b/lldb/bindings/interface/SBProgressDocstrings.i index 2997fe619fcc7..50648b62411f8 100644 --- a/lldb/bindings/interface/SBProgressDocstrings.i +++ b/lldb/bindings/interface/SBProgressDocstrings.i @@ -12,3 +12,10 @@ and will always send an initial progress update, updates when Progress::Increment() is called, and also will make sure that a progress completed update is reported even if the user doesn't explicitly cause one to be sent.") lldb::SBProgress; + +%feature("docstring", +"Explicitly end an SBProgress, this is a utility to send the progressEnd event +without waiting for your language or language implementations non-deterministic destruction +of the SBProgress object. + +Note once finalized, no further increments will be processed.") lldb::SBProgress::Finalize; diff --git a/lldb/include/lldb/API/SBProgress.h b/lldb/include/lldb/API/SBProgress.h index d574d1d2982b9..1558cdc08e080 100644 --- a/lldb/include/lldb/API/SBProgress.h +++ b/lldb/include/lldb/API/SBProgress.h @@ -59,6 +59,11 @@ class LLDB_API SBProgress { void Increment(uint64_t amount, const char *description = nullptr); + /// Explicitly finalize an SBProgress, this can be used to terminate a + /// progress on command instead of waiting for a garbage collection or other + /// finalizer. + void Finalize(); + protected: lldb_private::Progress &ref() const; diff --git a/lldb/source/API/SBProgress.cpp b/lldb/source/API/SBProgress.cpp index 3e548854ab739..9b3f8acc27b00 100644 --- a/lldb/source/API/SBProgress.cpp +++ b/lldb/source/API/SBProgress.cpp @@ -40,10 +40,20 @@ SBProgress::~SBProgress() = default; void SBProgress::Increment(uint64_t amount, const char *description) { LLDB_INSTRUMENT_VA(amount, description); + if (!m_opaque_up) + return; + std::optional<std::string> description_opt; if (description && description[0]) description_opt = description; m_opaque_up->Increment(amount, std::move(description_opt)); } +void SBProgress::Finalize() { + if (!m_opaque_up) + return; + + m_opaque_up.reset(); +} + lldb_private::Progress &SBProgress::ref() const { return *m_opaque_up; } diff --git a/lldb/test/API/python_api/sbprogress/TestSBProgress.py b/lldb/test/API/python_api/sbprogress/TestSBProgress.py index 1b8f01d3e8bb1..b043ce9c4bf89 100644 --- a/lldb/test/API/python_api/sbprogress/TestSBProgress.py +++ b/lldb/test/API/python_api/sbprogress/TestSBProgress.py @@ -5,35 +5,6 @@ class SBProgressTestCase(TestBase): - def test_with_external_bit_set(self): - """Test SBProgress events are listened to when the external bit is set.""" - - progress = lldb.SBProgress("Test SBProgress", "Test progress", self.dbg) - listener = lldb.SBListener("Test listener") - broadcaster = self.dbg.GetBroadcaster() - broadcaster.AddListener(listener, lldb.eBroadcastBitExternalProgress) - event = lldb.SBEvent() - - expected_string = "Test progress first increment" - progress.Increment(1, expected_string) - self.assertTrue(listener.PeekAtNextEvent(event)) - stream = lldb.SBStream() - event.GetDescription(stream) - self.assertIn(expected_string, stream.GetData()) - - def test_without_external_bit_set(self): - """Test SBProgress events are not listened to on the internal progress bit.""" - - progress = lldb.SBProgress("Test SBProgress", "Test progress", self.dbg) - listener = lldb.SBListener("Test listener") - broadcaster = self.dbg.GetBroadcaster() - broadcaster.AddListener(listener, lldb.eBroadcastBitProgress) - event = lldb.SBEvent() - - expected_string = "Test progress first increment" - progress.Increment(1, expected_string) - self.assertFalse(listener.PeekAtNextEvent(event)) - def test_with_external_bit_set(self): """Test SBProgress can handle null events.""" @@ -65,3 +36,17 @@ def test_with_external_bit_set(self): stream = lldb.SBStream() event.GetDescription(stream) self.assertIn("Step 3", stream.GetData()) + + def test_progress_finalize(self): + """Test SBProgress finalize sends the progressEnd event""" + + progress = lldb.SBProgress("Test SBProgress", "Test finalize", self.dbg) + listener = lldb.SBListener("Test listener") + broadcaster = self.dbg.GetBroadcaster() + broadcaster.AddListener(listener, lldb.eBroadcastBitExternalProgressCategory) + event = lldb.SBEvent() + progress.Finalize() + self.assertTrue(listener.WaitForEvent(5, event)) + stream = lldb.SBStream() + event.GetDescription(stream) + self.assertIn("type = end", stream.GetData()) >From 143e4dade36a1c1aadfa0bb50bba6219b3da7edb Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Wed, 26 Feb 2025 16:44:29 -0800 Subject: [PATCH 2/4] Add a split test case of progress with a total and without a total ending on finalize --- lldb/source/API/SBProgress.cpp | 8 +++++--- .../python_api/sbprogress/TestSBProgress.py | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lldb/source/API/SBProgress.cpp b/lldb/source/API/SBProgress.cpp index 9b3f8acc27b00..e3318624c5fd1 100644 --- a/lldb/source/API/SBProgress.cpp +++ b/lldb/source/API/SBProgress.cpp @@ -50,9 +50,11 @@ void SBProgress::Increment(uint64_t amount, const char *description) { } void SBProgress::Finalize() { - if (!m_opaque_up) - return; - + // The lldb_private::Progress object is designed to be RAII and send the end + // progress event when it gets destroyed. So force our contained object to be + // destroyed and send the progress end event. Clearing this object also allows + // all other methods to quickly return without doing any work if they are + // called after this method. m_opaque_up.reset(); } diff --git a/lldb/test/API/python_api/sbprogress/TestSBProgress.py b/lldb/test/API/python_api/sbprogress/TestSBProgress.py index b043ce9c4bf89..2a0689a52a185 100644 --- a/lldb/test/API/python_api/sbprogress/TestSBProgress.py +++ b/lldb/test/API/python_api/sbprogress/TestSBProgress.py @@ -37,7 +37,7 @@ def test_with_external_bit_set(self): event.GetDescription(stream) self.assertIn("Step 3", stream.GetData()) - def test_progress_finalize(self): + def test_progress_finalize_non_deterministic_progress(self): """Test SBProgress finalize sends the progressEnd event""" progress = lldb.SBProgress("Test SBProgress", "Test finalize", self.dbg) @@ -50,3 +50,19 @@ def test_progress_finalize(self): stream = lldb.SBStream() event.GetDescription(stream) self.assertIn("type = end", stream.GetData()) + + def test_progress_finalize_deterministic_progress(self): + """Test SBProgress finalize sends the progressEnd event""" + + progress = lldb.SBProgress("Test SBProgress", "Test finalize", 13, self.dbg) + listener = lldb.SBListener("Test listener") + broadcaster = self.dbg.GetBroadcaster() + broadcaster.AddListener(listener, lldb.eBroadcastBitExternalProgressCategory) + event = lldb.SBEvent() + progress.Finalize() + self.assertTrue(listener.WaitForEvent(5, event)) + stream = lldb.SBStream() + event.GetDescription(stream) + # Note even for progresses with a total, the total isn't + # sent in the end message. + self.assertIn("type = end", stream.GetData()) >From 213d6856fba13bc0eb2ed5d4a074c4b9cac0571a Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Thu, 27 Feb 2025 11:36:37 -0800 Subject: [PATCH 3/4] Add docstring about increment --- lldb/bindings/interface/SBProgressDocstrings.i | 4 ++++ lldb/include/lldb/API/SBProgress.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lldb/bindings/interface/SBProgressDocstrings.i b/lldb/bindings/interface/SBProgressDocstrings.i index 50648b62411f8..8386822887855 100644 --- a/lldb/bindings/interface/SBProgressDocstrings.i +++ b/lldb/bindings/interface/SBProgressDocstrings.i @@ -19,3 +19,7 @@ without waiting for your language or language implementations non-deterministic of the SBProgress object. Note once finalized, no further increments will be processed.") lldb::SBProgress::Finalize; + +%feature("docstring", +"Increment the progress by a given number of units, optionally with a message. Not all progress events are guaraunteed +to be sent, but incrementing to the total will always guarauntee a progress end event being sent.") lldb::SBProcess::Increment; diff --git a/lldb/include/lldb/API/SBProgress.h b/lldb/include/lldb/API/SBProgress.h index 1558cdc08e080..e5e8196bcaa81 100644 --- a/lldb/include/lldb/API/SBProgress.h +++ b/lldb/include/lldb/API/SBProgress.h @@ -61,7 +61,7 @@ class LLDB_API SBProgress { /// Explicitly finalize an SBProgress, this can be used to terminate a /// progress on command instead of waiting for a garbage collection or other - /// finalizer. + /// RAII to destroy the contained progress object. void Finalize(); protected: >From ae9e91fb604bba44d3c0696454f4bccfc3117590 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Thu, 27 Feb 2025 12:46:42 -0800 Subject: [PATCH 4/4] Reword closer to Jonas's recommendation --- lldb/bindings/interface/SBProgressDocstrings.i | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/bindings/interface/SBProgressDocstrings.i b/lldb/bindings/interface/SBProgressDocstrings.i index 8386822887855..5459d1af5155c 100644 --- a/lldb/bindings/interface/SBProgressDocstrings.i +++ b/lldb/bindings/interface/SBProgressDocstrings.i @@ -14,9 +14,9 @@ completed update is reported even if the user doesn't explicitly cause one to be sent.") lldb::SBProgress; %feature("docstring", -"Explicitly end an SBProgress, this is a utility to send the progressEnd event -without waiting for your language or language implementations non-deterministic destruction -of the SBProgress object. +"Finalize the SBProgress, which will cause a progress end event to be emitted. This +happens automatically when the SBProcess object is destroyed, but can be done explicitly +with Finalize to avoid having to rely on the language semantics for destruction. Note once finalized, no further increments will be processed.") lldb::SBProgress::Finalize; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits