[Lldb-commits] [lldb] [lldb] Emit a progress event from the source manager (PR #165802)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 31 12:40:51 PDT 2025
https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/165802
>From bf237ee76fad9426d89aedec3c9dc15c46aa2c66 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Thu, 30 Oct 2025 16:25:14 -0700
Subject: [PATCH 1/2] [lldb] Emit a progress event from the source manager
Reading a source file might take a while, for example because it's
located on a virtual file system that's fetching the data on demand.
This PR emits a progress event to convey this to the user when reading
the file exceeds a certain threshold (250ms). Although it doesn't speed
up the operation, it still greatly improves the user experience by
helping them understand what's going on.
rdar://163750392
---
lldb/include/lldb/Core/SourceManager.h | 2 ++
lldb/source/Core/SourceManager.cpp | 26 ++++++++++++++++++++++++--
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/lldb/include/lldb/Core/SourceManager.h b/lldb/include/lldb/Core/SourceManager.h
index 1244291596b73..83dc74768733d 100644
--- a/lldb/include/lldb/Core/SourceManager.h
+++ b/lldb/include/lldb/Core/SourceManager.h
@@ -109,6 +109,8 @@ class SourceManager {
private:
void CommonInitializer(lldb::SupportFileSP support_file_sp,
lldb::TargetSP target_sp);
+ void CommonInitializerImpl(lldb::SupportFileSP support_file_sp,
+ lldb::TargetSP target_sp);
};
typedef std::shared_ptr<File> FileSP;
diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp
index f786866a18137..9ad483d8a9232 100644
--- a/lldb/source/Core/SourceManager.cpp
+++ b/lldb/source/Core/SourceManager.cpp
@@ -34,6 +34,7 @@
#include "llvm/ADT/Twine.h"
+#include <future>
#include <memory>
#include <optional>
#include <utility>
@@ -54,8 +55,7 @@ using namespace lldb_private;
static inline bool is_newline_char(char ch) { return ch == '\n' || ch == '\r'; }
static void resolve_tilde(FileSpec &file_spec) {
- if (!FileSystem::Instance().Exists(file_spec) &&
- file_spec.GetDirectory() &&
+ if (!FileSystem::Instance().Exists(file_spec) && file_spec.GetDirectory() &&
file_spec.GetDirectory().GetCString()[0] == '~') {
FileSystem::Instance().Resolve(file_spec);
}
@@ -477,6 +477,28 @@ SourceManager::File::File(SupportFileSP support_file_sp, TargetSP target_sp)
void SourceManager::File::CommonInitializer(SupportFileSP support_file_sp,
TargetSP target_sp) {
+ // It might take a while to read a source file, for example because it's
+ // coming from a virtual file system that's fetching the data on demand. When
+ // reading the data exceeds a certain threshold, show a progress event to let
+ // the user know what's going on.
+ static constexpr auto g_progress_delay = std::chrono::milliseconds(500);
+
+ std::future<void> future = std::async(std::launch::async, [&]() {
+ CommonInitializer(support_file_sp, target_sp);
+ });
+
+ std::optional<Progress> progress;
+ if (future.wait_for(g_progress_delay) == std::future_status::timeout) {
+ Debugger *debugger = target_sp ? &target_sp->GetDebugger() : nullptr;
+ progress.emplace("Loading source file",
+ support_file_sp->GetSpecOnly().GetFilename().GetString(),
+ 1, debugger);
+ }
+ future.wait();
+}
+
+void SourceManager::File::CommonInitializerImpl(SupportFileSP support_file_sp,
+ TargetSP target_sp) {
// Set the file and update the modification time.
SetSupportFile(support_file_sp);
>From 7058a8c8af9679c50921f3e730146e7caf836fbf Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Fri, 31 Oct 2025 09:25:39 -0700
Subject: [PATCH 2/2] Fix typo, capture by value
---
lldb/source/Core/SourceManager.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lldb/source/Core/SourceManager.cpp b/lldb/source/Core/SourceManager.cpp
index 9ad483d8a9232..097173ffe678e 100644
--- a/lldb/source/Core/SourceManager.cpp
+++ b/lldb/source/Core/SourceManager.cpp
@@ -483,8 +483,8 @@ void SourceManager::File::CommonInitializer(SupportFileSP support_file_sp,
// the user know what's going on.
static constexpr auto g_progress_delay = std::chrono::milliseconds(500);
- std::future<void> future = std::async(std::launch::async, [&]() {
- CommonInitializer(support_file_sp, target_sp);
+ std::future<void> future = std::async(std::launch::async, [=]() {
+ CommonInitializerImpl(support_file_sp, target_sp);
});
std::optional<Progress> progress;
More information about the lldb-commits
mailing list