https://github.com/vogelsgesang updated 
https://github.com/llvm/llvm-project/pull/171482

>From 9468ba49d587febf69e7e1ac673e9cb62ddb4611 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <[email protected]>
Date: Tue, 9 Dec 2025 17:46:05 +0000
Subject: [PATCH 1/2] [lldb] Broadcast `eBroadcastBitStackChanged` when frame
 providers change

We want to reload the call stack whenever the frame providers were
updated. To do so, we now emit a `eBroadcastBitStackChanged` on all
threads whenever any changes to the frame providers take place.

I found this very useful while iterating on a frame provider using
lldb-dap. So far, the new frame provider only took effect after
continuing execution. Now the back trace in VS-Code gets refreshed
immediately upon running `target frame-provider add`
---
 lldb/include/lldb/Target/Target.h |  5 +++
 lldb/source/Target/Target.cpp     | 57 +++++++++++++++++++------------
 2 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/lldb/include/lldb/Target/Target.h 
b/lldb/include/lldb/Target/Target.h
index 812a638910b3b..6d1f5f83d153b 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -776,6 +776,11 @@ class Target : public std::enable_shared_from_this<Target>,
   const llvm::DenseMap<uint32_t, ScriptedFrameProviderDescriptor> &
   GetScriptedFrameProviderDescriptors() const;
 
+protected:
+  /// Notify all threads that the stack traces might have changed.
+  void NotifyThreadsOfChangedFrameProviders();
+
+public:
   // This part handles the breakpoints.
 
   BreakpointList &GetBreakpointList(bool internal = false);
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 2305f1019ea4f..d87e1e0cea95a 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -3725,47 +3725,45 @@ llvm::Expected<uint32_t> 
Target::AddScriptedFrameProviderDescriptor(
   if (!descriptor.IsValid())
     return llvm::createStringError("invalid frame provider descriptor");
 
+  uint32_t descriptor_id = descriptor.GetID();
+
   llvm::StringRef name = descriptor.GetName();
   if (name.empty())
     return llvm::createStringError(
         "frame provider descriptor has no class name");
 
-  std::lock_guard<std::recursive_mutex> guard(
+  {
+    std::unique_lock<std::recursive_mutex> guard(
       m_frame_provider_descriptors_mutex);
+    m_frame_provider_descriptors[descriptor_id] = descriptor;
+  }
 
-  uint32_t descriptor_id = descriptor.GetID();
-  m_frame_provider_descriptors[descriptor_id] = descriptor;
-
-  // Clear frame providers on existing threads so they reload with new config.
-  if (ProcessSP process_sp = GetProcessSP())
-    for (ThreadSP thread_sp : process_sp->Threads())
-      thread_sp->ClearScriptedFrameProvider();
+  NotifyThreadsOfChangedFrameProviders();
 
   return descriptor_id;
 }
 
 bool Target::RemoveScriptedFrameProviderDescriptor(uint32_t id) {
-  std::lock_guard<std::recursive_mutex> guard(
-      m_frame_provider_descriptors_mutex);
-  bool removed = m_frame_provider_descriptors.erase(id);
+  bool removed;
+  {
+    std::lock_guard<std::recursive_mutex> guard(
+        m_frame_provider_descriptors_mutex);
+    removed = m_frame_provider_descriptors.erase(id);
+  }
 
   if (removed)
-    if (ProcessSP process_sp = GetProcessSP())
-      for (ThreadSP thread_sp : process_sp->Threads())
-        thread_sp->ClearScriptedFrameProvider();
-
+    NotifyThreadsOfChangedFrameProviders();
   return removed;
 }
 
 void Target::ClearScriptedFrameProviderDescriptors() {
-  std::lock_guard<std::recursive_mutex> guard(
-      m_frame_provider_descriptors_mutex);
-
-  m_frame_provider_descriptors.clear();
+  {
+    std::lock_guard<std::recursive_mutex> guard(
+        m_frame_provider_descriptors_mutex);
+    m_frame_provider_descriptors.clear();
+  }
 
-  if (ProcessSP process_sp = GetProcessSP())
-    for (ThreadSP thread_sp : process_sp->Threads())
-      thread_sp->ClearScriptedFrameProvider();
+  NotifyThreadsOfChangedFrameProviders();
 }
 
 const llvm::DenseMap<uint32_t, ScriptedFrameProviderDescriptor> &
@@ -3775,6 +3773,21 @@ Target::GetScriptedFrameProviderDescriptors() const {
   return m_frame_provider_descriptors;
 }
 
+void Target::NotifyThreadsOfChangedFrameProviders() {
+  ProcessSP process_sp = GetProcessSP();
+  if (!process_sp)
+    return;
+  for (ThreadSP thread_sp : process_sp->Threads()) {
+    // Clear frame providers on existing threads so they reload with new 
config.
+    thread_sp->ClearScriptedFrameProvider();
+    // Notify threads that the stack traces might have changed.
+    if (EventTypeHasListeners(Thread::eBroadcastBitStackChanged)) {
+      auto data_sp = std::make_shared<Thread::ThreadEventData>(thread_sp);
+      thread_sp->BroadcastEvent(Thread::eBroadcastBitStackChanged, data_sp);
+    }
+  }
+}
+
 void Target::FinalizeFileActions(ProcessLaunchInfo &info) {
   Log *log = GetLog(LLDBLog::Process);
 

>From d4ec168af0c18f2d3b799e3e38d8933635deb271 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <[email protected]>
Date: Tue, 9 Dec 2025 18:26:40 +0000
Subject: [PATCH 2/2] Rename to InvalidateThreadFrameProviders

---
 lldb/include/lldb/Target/Target.h |  2 +-
 lldb/source/Target/Target.cpp     | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/lldb/include/lldb/Target/Target.h 
b/lldb/include/lldb/Target/Target.h
index 6d1f5f83d153b..1e616a4a6d7c7 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -778,7 +778,7 @@ class Target : public std::enable_shared_from_this<Target>,
 
 protected:
   /// Notify all threads that the stack traces might have changed.
-  void NotifyThreadsOfChangedFrameProviders();
+  void InvalidateThreadFrameProviders();
 
 public:
   // This part handles the breakpoints.
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index d87e1e0cea95a..42e739f84480d 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -3734,11 +3734,11 @@ llvm::Expected<uint32_t> 
Target::AddScriptedFrameProviderDescriptor(
 
   {
     std::unique_lock<std::recursive_mutex> guard(
-      m_frame_provider_descriptors_mutex);
+        m_frame_provider_descriptors_mutex);
     m_frame_provider_descriptors[descriptor_id] = descriptor;
   }
 
-  NotifyThreadsOfChangedFrameProviders();
+  InvalidateThreadFrameProviders();
 
   return descriptor_id;
 }
@@ -3752,7 +3752,7 @@ bool 
Target::RemoveScriptedFrameProviderDescriptor(uint32_t id) {
   }
 
   if (removed)
-    NotifyThreadsOfChangedFrameProviders();
+    InvalidateThreadFrameProviders();
   return removed;
 }
 
@@ -3763,7 +3763,7 @@ void Target::ClearScriptedFrameProviderDescriptors() {
     m_frame_provider_descriptors.clear();
   }
 
-  NotifyThreadsOfChangedFrameProviders();
+  InvalidateThreadFrameProviders();
 }
 
 const llvm::DenseMap<uint32_t, ScriptedFrameProviderDescriptor> &
@@ -3773,7 +3773,7 @@ Target::GetScriptedFrameProviderDescriptors() const {
   return m_frame_provider_descriptors;
 }
 
-void Target::NotifyThreadsOfChangedFrameProviders() {
+void Target::InvalidateThreadFrameProviders() {
   ProcessSP process_sp = GetProcessSP();
   if (!process_sp)
     return;

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to