[Lldb-commits] [lldb] afe8f20 - Revert "[lldb] Rate limit progress reports -- different approach [WIP-ish]"

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri Jun 16 00:10:34 PDT 2023


Author: Pavel Labath
Date: 2023-06-16T09:09:56+02:00
New Revision: afe8f20bb8dd1808cae542eb7ba0fc11a7886918

URL: https://github.com/llvm/llvm-project/commit/afe8f20bb8dd1808cae542eb7ba0fc11a7886918
DIFF: https://github.com/llvm/llvm-project/commit/afe8f20bb8dd1808cae542eb7ba0fc11a7886918.diff

LOG: Revert "[lldb] Rate limit progress reports -- different approach [WIP-ish]"

This reverts commit c30853460da7446f92bc1e516f9cbe2c5df6e136, which I
pushed accidentally -- sorry.

Added: 
    

Modified: 
    lldb/include/lldb/Core/Progress.h
    lldb/source/Core/Progress.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/include/lldb/Core/Progress.h b/lldb/include/lldb/Core/Progress.h
index 3bafd3d4b34ea..b2b8781a43b05 100644
--- a/lldb/include/lldb/Core/Progress.h
+++ b/lldb/include/lldb/Core/Progress.h
@@ -9,11 +9,9 @@
 #ifndef LLDB_CORE_PROGRESS_H
 #define LLDB_CORE_PROGRESS_H
 
-#include "lldb/Host/HostThread.h"
 #include "lldb/Utility/ConstString.h"
 #include "lldb/lldb-types.h"
 #include <atomic>
-#include <future>
 #include <mutex>
 #include <optional>
 
@@ -94,26 +92,24 @@ class Progress {
   void Increment(uint64_t amount = 1, std::string update = {});
 
 private:
-  void SendPeriodicReports(std::shared_future<void> done);
-  void ReportProgress(std::string update);
+  void ReportProgress(std::string update = {});
   static std::atomic<uint64_t> g_id;
   /// The title of the progress activity.
   std::string m_title;
+  std::mutex m_mutex;
   /// A unique integer identifier for progress reporting.
   const uint64_t m_id;
   /// How much work ([0...m_total]) that has been completed.
-  std::atomic<uint64_t> m_completed;
+  uint64_t m_completed;
   /// Total amount of work, UINT64_MAX for non deterministic progress.
   const uint64_t m_total;
   /// The optional debugger ID to report progress to. If this has no value then
   /// all debuggers will receive this event.
   std::optional<lldb::user_id_t> m_debugger_id;
-
-  std::mutex m_update_mutex;
-  std::string m_update;
-
-  std::promise<void> m_stop_reporting_thread;
-  HostThread m_reporting_thread;
+  /// Set to true when progress has been reported where m_completed == m_total
+  /// to ensure that we don't send progress updates after progress has
+  /// completed.
+  bool m_complete = false;
 };
 
 } // namespace lldb_private

diff  --git a/lldb/source/Core/Progress.cpp b/lldb/source/Core/Progress.cpp
index a531b9b70437e..08be73f1470f3 100644
--- a/lldb/source/Core/Progress.cpp
+++ b/lldb/source/Core/Progress.cpp
@@ -9,8 +9,6 @@
 #include "lldb/Core/Progress.h"
 
 #include "lldb/Core/Debugger.h"
-#include "lldb/Host/ThreadLauncher.h"
-#include "lldb/Utility/LLDBLog.h"
 #include "lldb/Utility/StreamString.h"
 
 using namespace lldb;
@@ -24,67 +22,39 @@ Progress::Progress(std::string title, uint64_t total,
   assert(total > 0);
   if (debugger)
     m_debugger_id = debugger->GetID();
-
-  // Using a shared_future because std::function needs to be copyable.
-  if (llvm::Expected<HostThread> reporting_thread =
-          ThreadLauncher::LaunchThread(
-              "<lldb.progress>",
-              [this, future = std::shared_future<void>(
-                         m_stop_reporting_thread.get_future())]() {
-                SendPeriodicReports(future);
-                return lldb::thread_result_t();
-              })) {
-    m_reporting_thread = std::move(*reporting_thread);
-  } else {
-    LLDB_LOG_ERROR(GetLog(LLDBLog::Host), reporting_thread.takeError(),
-                   "failed to launch host thread: {}");
-  }
+  std::lock_guard<std::mutex> guard(m_mutex);
+  ReportProgress();
 }
 
 Progress::~Progress() {
-  m_stop_reporting_thread.set_value();
-  if (m_reporting_thread.IsJoinable()) {
-    m_reporting_thread.Join(nullptr);
+  // 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;
+    ReportProgress();
   }
 }
 
-void Progress::SendPeriodicReports(std::shared_future<void> done) {
-  uint64_t last_completed = 0;
-  Debugger::ReportProgress(m_id, m_title, "", last_completed, m_total,
-                           m_debugger_id);
-
-  while (last_completed != m_total &&
-         done.wait_for(std::chrono::milliseconds(100)) ==
-             std::future_status::timeout) {
-    uint64_t current_completed = m_completed.load();
-    if (current_completed == last_completed)
-      continue;
-
-    if (current_completed == m_total ||
-        current_completed < last_completed /*overflow*/) {
-      break;
-    }
-
-    std::string current_update;
-    {
-      std::lock_guard<std::mutex> guard(m_update_mutex);
-      current_update = std::move(m_update);
-      m_update.clear();
-    }
-    Debugger::ReportProgress(m_id, m_title, std::move(current_update),
-                             current_completed, m_total, m_debugger_id);
-    last_completed = current_completed;
+void Progress::Increment(uint64_t amount, std::string update) {
+  if (amount > 0) {
+    std::lock_guard<std::mutex> guard(m_mutex);
+    // Watch out for unsigned overflow and make sure we don't increment too
+    // much and exceed m_total.
+    if (amount > (m_total - m_completed))
+      m_completed = m_total;
+    else
+      m_completed += amount;
+    ReportProgress(update);
   }
-
-  Debugger::ReportProgress(m_id, m_title, "", m_total, m_total, m_debugger_id);
 }
 
-void Progress::Increment(uint64_t amount, std::string update) {
-  if (amount == 0)
-    return;
-  if (!update.empty()) {
-    std::lock_guard<std::mutex> guard(m_update_mutex);
-    m_update = std::move(update);
+void Progress::ReportProgress(std::string update) {
+  if (!m_complete) {
+    // Make sure we only send one notification that indicates the progress is
+    // complete.
+    m_complete = m_completed == m_total;
+    Debugger::ReportProgress(m_id, m_title, std::move(update), m_completed,
+                             m_total, m_debugger_id);
   }
-  m_completed += amount;
 }


        


More information about the lldb-commits mailing list