[Lldb-commits] [lldb] [lldb] Guard SBFrame/SBThread methods against running processes (PR #152020)
Felipe de Azevedo Piovezan via lldb-commits
lldb-commits at lists.llvm.org
Mon Aug 11 07:57:50 PDT 2025
felipepiovezan wrote:
I was thinking a bit more about the `Destroy` method, which I was not too too happy with, and thought about just changing it to be a "Resume" method. Something like the below, what do you think?
```
diff --git a/lldb/include/lldb/Target/ExecutionContext.h b/lldb/include/lldb/Target/ExecutionContext.h
index a0b064a51cec..e82be46e89a5 100644
--- a/lldb/include/lldb/Target/ExecutionContext.h
+++ b/lldb/include/lldb/Target/ExecutionContext.h
@@ -13,6 +13,7 @@
#include "lldb/Host/ProcessRunLock.h"
#include "lldb/Target/StackID.h"
+#include "lldb/Utility/Status.h"
#include "lldb/lldb-private.h"
namespace lldb_private {
@@ -591,10 +592,9 @@ struct StoppedExecutionContext : ExecutionContext {
other.Clear();
}
- /// Clears this context, unlocking the ProcessRunLock and returning the
- /// locked API lock. Like after a move operation, this object is no longer
- /// usable.
- [[nodiscard]] std::unique_lock<std::recursive_mutex> Destroy();
+ /// Resumes the process, unlocking all locks and destroying the context. Like
+ /// after a move operation, this object is no longer usable.
+ [[nodiscard]] Status ResumeProcessAndDestroyContext();
private:
std::unique_lock<std::recursive_mutex> m_api_lock;
diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp
index b07611d388fb..b19efaacc656 100644
--- a/lldb/source/API/SBThread.cpp
+++ b/lldb/source/API/SBThread.cpp
@@ -524,11 +524,7 @@ static Status ResumeNewPlan(StoppedExecutionContext exe_ctx,
Process *process = exe_ctx.GetProcessPtr();
process->GetThreadList().SetSelectedThreadByID(thread->GetID());
- // Release the run lock but keep the API lock.
- std::unique_lock<std::recursive_mutex> api_lock = exe_ctx.Destroy();
- if (process->GetTarget().GetDebugger().GetAsyncExecution())
- return process->Resume();
- return process->ResumeSynchronous(nullptr);
+ return exe_ctx.ResumeProcessAndDestroyContext();
}
void SBThread::StepOver(lldb::RunMode stop_other_threads) {
diff --git a/lldb/source/Target/ExecutionContext.cpp b/lldb/source/Target/ExecutionContext.cpp
index 7dc847e097bf..436c68099b0e 100644
--- a/lldb/source/Target/ExecutionContext.cpp
+++ b/lldb/source/Target/ExecutionContext.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/Target/ExecutionContext.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/Target/ExecutionContextScope.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/StackFrame.h"
@@ -164,10 +165,14 @@ lldb_private::GetStoppedExecutionContext(
std::move(api_lock), std::move(stop_locker));
}
-std::unique_lock<std::recursive_mutex> StoppedExecutionContext::Destroy() {
+Status StoppedExecutionContext::ResumeProcessAndDestroyContext() {
+ lldb::ProcessSP process = GetProcessSP();
Clear();
- m_stop_locker = ProcessRunLock::ProcessRunLocker();
- return std::move(m_api_lock);
+ std::unique_lock<std::recursive_mutex> unlock_api = std::move(m_api_lock);
+ m_stop_locker = Process::StopLocker();
+ if (process->GetTarget().GetDebugger().GetAsyncExecution())
+ return process->Resume();
+ return process->ResumeSynchronous(nullptr);
}
ExecutionContext::ExecutionContext(ExecutionContextScope *exe_scope_ptr)
```
https://github.com/llvm/llvm-project/pull/152020
More information about the lldb-commits
mailing list