summaryrefslogtreecommitdiff
path: root/lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp
diff options
context:
space:
mode:
authorjeffreytan81 <jeffreytan@meta.com>2024-08-06 18:08:55 -0700
committerGitHub <noreply@github.com>2024-08-06 18:08:55 -0700
commit128ef9eb533afd00da2d3d2cfeab16de6abf2640 (patch)
treedc3abd7250170f0f079729e68021a37ed2e92986 /lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp
parent874890c68241f500501c42730c2829a5d51f2100 (diff)
Fix ASAN failure in TestSingleThreadStepTimeout.py (#102208)
This PR fixes the ASAN failure in https://github.com/llvm/llvm-project/pull/90930. The original PR made the assumption that parent `ThreadPlanStepOverRange`'s lifetime will always be longer than `ThreadPlanSingleThreadTimeout` leaf plan so it passes the `m_timeout_info` as reference to it. From the ASAN failure, it seems that this assumption may not be true (likely the thread stack is holding a strong reference to the leaf plan). This PR fixes this lifetime issue by using shared pointer instead of passing by reference. --------- Co-authored-by: jeffreytan81 <jeffreytan@fb.com>
Diffstat (limited to 'lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp')
-rw-r--r--lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp26
1 files changed, 13 insertions, 13 deletions
diff --git a/lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp b/lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp
index 9cc21bfbb195..40a8af8e7034 100644
--- a/lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp
+++ b/lldb/source/Target/ThreadPlanSingleThreadTimeout.cpp
@@ -24,19 +24,19 @@
using namespace lldb_private;
using namespace lldb;
-ThreadPlanSingleThreadTimeout::ThreadPlanSingleThreadTimeout(Thread &thread,
- TimeoutInfo &info)
+ThreadPlanSingleThreadTimeout::ThreadPlanSingleThreadTimeout(
+ Thread &thread, TimeoutInfoSP &info)
: ThreadPlan(ThreadPlan::eKindSingleThreadTimeout, "Single thread timeout",
thread, eVoteNo, eVoteNoOpinion),
m_info(info), m_state(State::WaitTimeout) {
// TODO: reuse m_timer_thread without recreation.
m_timer_thread = std::thread(TimeoutThreadFunc, this);
- m_info.m_isAlive = true;
- m_state = m_info.m_last_state;
+ m_info->m_isAlive = true;
+ m_state = m_info->m_last_state;
}
ThreadPlanSingleThreadTimeout::~ThreadPlanSingleThreadTimeout() {
- m_info.m_isAlive = false;
+ m_info->m_isAlive = false;
}
uint64_t ThreadPlanSingleThreadTimeout::GetRemainingTimeoutMilliSeconds() {
@@ -66,7 +66,7 @@ std::string ThreadPlanSingleThreadTimeout::StateToString(State state) {
}
void ThreadPlanSingleThreadTimeout::PushNewWithTimeout(Thread &thread,
- TimeoutInfo &info) {
+ TimeoutInfoSP &info) {
uint64_t timeout_in_ms = thread.GetSingleThreadPlanTimeout();
if (timeout_in_ms == 0)
return;
@@ -88,13 +88,13 @@ void ThreadPlanSingleThreadTimeout::PushNewWithTimeout(Thread &thread,
}
void ThreadPlanSingleThreadTimeout::ResumeFromPrevState(Thread &thread,
- TimeoutInfo &info) {
+ TimeoutInfoSP &info) {
uint64_t timeout_in_ms = thread.GetSingleThreadPlanTimeout();
if (timeout_in_ms == 0)
return;
// There is already an instance alive.
- if (info.m_isAlive)
+ if (info->m_isAlive)
return;
// Do not create timeout if we are not stopping other threads.
@@ -118,7 +118,7 @@ bool ThreadPlanSingleThreadTimeout::WillStop() {
LLDB_LOGF(log, "ThreadPlanSingleThreadTimeout::WillStop().");
// Reset the state during stop.
- m_info.m_last_state = State::WaitTimeout;
+ m_info->m_last_state = State::WaitTimeout;
return true;
}
@@ -128,7 +128,7 @@ void ThreadPlanSingleThreadTimeout::DidPop() {
std::lock_guard<std::mutex> lock(m_mutex);
LLDB_LOGF(log, "ThreadPlanSingleThreadTimeout::DidPop().");
// Tell timer thread to exit.
- m_info.m_isAlive = false;
+ m_info->m_isAlive = false;
}
m_wakeup_cv.notify_one();
// Wait for timer thread to exit.
@@ -163,12 +163,12 @@ void ThreadPlanSingleThreadTimeout::TimeoutThreadFunc(
" ms",
timeout_in_ms);
self->m_wakeup_cv.wait_for(lock, std::chrono::milliseconds(timeout_in_ms),
- [self] { return !self->m_info.m_isAlive; });
+ [self] { return !self->m_info->m_isAlive; });
LLDB_LOGF(log,
"ThreadPlanSingleThreadTimeout::TimeoutThreadFunc() wake up with "
"m_isAlive(%d).",
- self->m_info.m_isAlive);
- if (!self->m_info.m_isAlive)
+ self->m_info->m_isAlive);
+ if (!self->m_info->m_isAlive)
return;
self->HandleTimeout();