[Lldb-commits] [lldb] r181501 - Changed the formerly pure virtual function:
Greg Clayton
gclayton at apple.com
Wed May 8 18:55:29 PDT 2013
Author: gclayton
Date: Wed May 8 20:55:29 2013
New Revision: 181501
URL: http://llvm.org/viewvc/llvm-project?rev=181501&view=rev
Log:
Changed the formerly pure virtual function:
namespace lldb_private {
class Thread
{
virtual lldb::StopInfoSP
GetPrivateStopReason() = 0;
};
}
To not be virtual. The lldb_private::Thread now handles the correct caching and will call a new pure virtual function:
namespace lldb_private {
class Thread
{
virtual bool
CalculateStopInfo() = 0;
}
}
This function must be overridden by thead lldb_private::Thread subclass and the only thing it needs to do is to set the Thread::StopInfo() with the current stop reason and return true, or return false if there is no stop reason. The lldb_private::Thread class will take care of calling this function only when it is required. This allows lldb_private::Thread subclasses to be a bit simpler and not all need to duplicate the cache and invalidation settings.
Also renamed:
lldb::StopInfoSP
lldb_private::Thread::GetPrivateStopReason();
To:
lldb::StopInfoSP
lldb_private::Thread::GetPrivateStopInfo();
Also cleaned up a case where the ThreadPlanStepOverBreakpoint might not re-set its breakpoint if the thread disappears (which was happening due to a bug when using the OperatingSystem plug-ins with memory threads and real threads).
Modified:
lldb/trunk/include/lldb/Target/Thread.h
lldb/trunk/include/lldb/Target/ThreadPlan.h
lldb/trunk/include/lldb/Target/ThreadPlanStepOverBreakpoint.h
lldb/trunk/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp
lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h
lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h
lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp
lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.cpp
lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.h
lldb/trunk/source/Target/Thread.cpp
lldb/trunk/source/Target/ThreadList.cpp
lldb/trunk/source/Target/ThreadPlanStepOverBreakpoint.cpp
Modified: lldb/trunk/include/lldb/Target/Thread.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Thread.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Thread.h (original)
+++ lldb/trunk/include/lldb/Target/Thread.h Wed May 8 20:55:29 2013
@@ -848,13 +848,7 @@ public:
virtual lldb::user_id_t
GetProtocolID () const
{
- return m_protocol_tid.GetID();
- }
-
- virtual void
- SetProtocolID (lldb::user_id_t api_tid)
- {
- return m_protocol_tid.SetID(api_tid);
+ return GetID();
}
//------------------------------------------------------------------
@@ -905,7 +899,19 @@ public:
// valid. The stop info may be a "checkpointed and restored" stop info, so if it is still around it is right
// even if you have not calculated this yourself, or if it disagrees with what you might have calculated.
virtual lldb::StopInfoSP
- GetPrivateStopReason () = 0;
+ GetPrivateStopInfo ();
+
+ //----------------------------------------------------------------------
+ // Ask the thread subclass to set its stop info.
+ //
+ // Thread subclasses should call Thread::SetStopInfo(...) with the
+ // reason the thread stopped.
+ //
+ // @return
+ // True if Thread::SetStopInfo(...) was called, false otherwise.
+ //----------------------------------------------------------------------
+ virtual bool
+ CalculateStopInfo () = 0;
//----------------------------------------------------------------------
// Gets the temporary resume state for a thread.
@@ -1002,9 +1008,10 @@ protected:
// Classes that inherit from Process can see and modify these
//------------------------------------------------------------------
lldb::ProcessWP m_process_wp; ///< The process that owns this thread.
- lldb::StopInfoSP m_actual_stop_info_sp; ///< The private stop reason for this thread
+ lldb::StopInfoSP m_stop_info_sp; ///< The private stop reason for this thread
+ uint32_t m_stop_info_stop_id; // This is the stop id for which the StopInfo is valid. Can use this so you know that
+ // the thread's m_stop_info_sp is current and you don't have to fetch it again
const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread for easy UI/command line access.
- UserID m_protocol_tid; ///< The thread ID used in the system level debugging or protocol functions calls. This is usually the same as the Thread::GetID(), but not always.
lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this thread's current register state.
lldb::StateType m_state; ///< The state of our process.
mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state.
@@ -1020,8 +1027,6 @@ protected:
/// It gets set in Thread::ShoudResume.
std::unique_ptr<lldb_private::Unwind> m_unwinder_ap;
bool m_destroy_called; // This is used internally to make sure derived Thread classes call DestroyThread.
- uint32_t m_thread_stop_reason_stop_id; // This is the stop id for which the StopInfo is valid. Can use this so you know that
- // the thread's m_actual_stop_info_sp is current and you don't have to fetch it again
LazyBool m_override_should_notify;
private:
//------------------------------------------------------------------
Modified: lldb/trunk/include/lldb/Target/ThreadPlan.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlan.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ThreadPlan.h (original)
+++ lldb/trunk/include/lldb/Target/ThreadPlan.h Wed May 8 20:55:29 2013
@@ -410,6 +410,13 @@ public:
virtual bool
MischiefManaged ();
+ virtual void
+ ThreadDestroyed ()
+ {
+ // Any cleanup that a plan might want to do in case the thread goes away
+ // in the middle of the plan being queued on a thread can be done here.
+ }
+
bool
GetPrivate ()
{
@@ -537,7 +544,7 @@ protected:
lldb::StopInfoSP
GetPrivateStopReason()
{
- return m_thread.GetPrivateStopReason ();
+ return m_thread.GetPrivateStopInfo ();
}
void
Modified: lldb/trunk/include/lldb/Target/ThreadPlanStepOverBreakpoint.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlanStepOverBreakpoint.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ThreadPlanStepOverBreakpoint.h (original)
+++ lldb/trunk/include/lldb/Target/ThreadPlanStepOverBreakpoint.h Wed May 8 20:55:29 2013
@@ -32,6 +32,7 @@ public:
virtual lldb::StateType GetPlanRunState ();
virtual bool WillStop ();
virtual bool MischiefManaged ();
+ virtual void ThreadDestroyed ();
void SetAutoContinue (bool do_it);
virtual bool ShouldAutoContinue(Event *event_ptr);
@@ -39,11 +40,13 @@ protected:
virtual bool DoPlanExplainsStop (Event *event_ptr);
virtual bool DoWillResume (lldb::StateType resume_state, bool current_plan);
+ void ReenableBreakpointSite ();
private:
lldb::addr_t m_breakpoint_addr;
lldb::user_id_t m_breakpoint_site_id;
bool m_auto_continue;
+ bool m_reenabled_breakpoint_site;
DISALLOW_COPY_AND_ASSIGN (ThreadPlanStepOverBreakpoint);
Modified: lldb/trunk/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp (original)
+++ lldb/trunk/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp Wed May 8 20:55:29 2013
@@ -198,36 +198,39 @@ OperatingSystemPython::UpdateThreadList
{
uint32_t i;
const uint32_t num_threads = threads_list.GetSize();
- for (i=0; i<num_threads; ++i)
+ if (num_threads > 0)
{
- PythonDictionary thread_dict(threads_list.GetItemAtIndex(i));
- if (thread_dict)
+ for (i=0; i<num_threads; ++i)
{
- if (thread_dict.GetItemForKey("core"))
+ PythonDictionary thread_dict(threads_list.GetItemAtIndex(i));
+ if (thread_dict)
{
- // We have some threads that are saying they are on a "core", which means
- // they map the threads that are gotten from the lldb_private::Process subclass
- // so clear the new threads list so the core threads don't show up
- new_thread_list.Clear();
- break;
+ if (thread_dict.GetItemForKey("core"))
+ {
+ // We have some threads that are saying they are on a "core", which means
+ // they map the threads that are gotten from the lldb_private::Process subclass
+ // so clear the new threads list so the core threads don't show up
+ new_thread_list.Clear();
+ break;
+ }
}
}
- }
- for (i=0; i<num_threads; ++i)
- {
- PythonDictionary thread_dict(threads_list.GetItemAtIndex(i));
- if (thread_dict)
+ for (i=0; i<num_threads; ++i)
{
- ThreadSP thread_sp (CreateThreadFromThreadInfo (thread_dict, core_thread_list, old_thread_list, NULL));
- if (thread_sp)
- new_thread_list.AddThread(thread_sp);
+ PythonDictionary thread_dict(threads_list.GetItemAtIndex(i));
+ if (thread_dict)
+ {
+ ThreadSP thread_sp (CreateThreadFromThreadInfo (thread_dict, core_thread_list, old_thread_list, NULL));
+ if (thread_sp)
+ new_thread_list.AddThread(thread_sp);
+ }
}
}
}
- else
- {
+
+ if (new_thread_list.GetSize(false) == 0)
new_thread_list = old_thread_list;
- }
+
return new_thread_list.GetSize(false) > 0;
}
Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp Wed May 8 20:55:29 2013
@@ -385,11 +385,16 @@ ProcessKDP::DoResume ()
if (kernel_thread_sp)
{
const StateType thread_resume_state = kernel_thread_sp->GetTemporaryResumeState();
+
+ if (log)
+ log->Printf ("ProcessKDP::DoResume() thread_resume_state = %s", StateAsCString(thread_resume_state));
switch (thread_resume_state)
{
case eStateSuspended:
// Nothing to do here when a thread will stay suspended
// we just leave the CPU mask bit set to zero for the thread
+ if (log)
+ log->Printf ("ProcessKDP::DoResume() = suspended???");
break;
case eStateStepping:
@@ -398,6 +403,8 @@ ProcessKDP::DoResume ()
if (reg_ctx_sp)
{
+ if (log)
+ log->Printf ("ProcessKDP::DoResume () reg_ctx_sp->HardwareSingleStep (true);");
reg_ctx_sp->HardwareSingleStep (true);
resume = true;
}
@@ -412,15 +419,17 @@ ProcessKDP::DoResume ()
{
lldb::RegisterContextSP reg_ctx_sp (kernel_thread_sp->GetRegisterContext());
- if (reg_ctx_sp)
- {
- reg_ctx_sp->HardwareSingleStep (false);
- resume = true;
- }
- else
- {
- error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID());
- }
+ if (reg_ctx_sp)
+ {
+ if (log)
+ log->Printf ("ProcessKDP::DoResume () reg_ctx_sp->HardwareSingleStep (false);");
+ reg_ctx_sp->HardwareSingleStep (false);
+ resume = true;
+ }
+ else
+ {
+ error.SetErrorStringWithFormat("KDP thread 0x%llx has no register context", kernel_thread_sp->GetID());
+ }
}
break;
@@ -540,22 +549,15 @@ ProcessKDP::DoDetach(bool keep_stopped)
// If we are going to keep the target stopped, then don't send the disconnect message.
if (!keep_stopped && m_comm.IsConnected())
{
-
- bool disconnect_success = m_comm.SendRequestDisconnect();
- if (!disconnect_success)
- {
- if (log)
- log->PutCString ("ProcessKDP::DoDetach(): send disconnect request failed");
- }
-
- ConnectionStatus comm_disconnect_result = m_comm.Disconnect ();
+ const bool success = m_comm.SendRequestDisconnect();
if (log)
{
- if (comm_disconnect_result == eConnectionStatusSuccess)
- log->PutCString ("ProcessKDP::DoDetach() conncection channel shutdown successfully");
+ if (success)
+ log->PutCString ("ProcessKDP::DoDetach() detach packet sent successfully");
else
log->PutCString ("ProcessKDP::DoDetach() connection channel shutdown failed");
}
+ m_comm.Disconnect ();
}
}
StopAsyncThread ();
Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.cpp Wed May 8 20:55:29 2013
@@ -148,26 +148,23 @@ ThreadKDP::CreateRegisterContextForFrame
return reg_ctx_sp;
}
-lldb::StopInfoSP
-ThreadKDP::GetPrivateStopReason ()
+bool
+ThreadKDP::CalculateStopInfo ()
{
ProcessSP process_sp (GetProcess());
if (process_sp)
{
- const uint32_t process_stop_id = process_sp->GetStopID();
- if (m_thread_stop_reason_stop_id != process_stop_id ||
- (m_actual_stop_info_sp && !m_actual_stop_info_sp->IsValid()))
+ if (m_cached_stop_info_sp)
{
- if (IsStillAtLastBreakpointHit())
- return m_actual_stop_info_sp;
-
- if (m_cached_stop_info_sp)
- SetStopInfo (m_cached_stop_info_sp);
- else
- SetStopInfo(StopInfo::CreateStopReasonWithSignal (*this, SIGSTOP));
+ SetStopInfo (m_cached_stop_info_sp);
+ }
+ else
+ {
+ SetStopInfo(StopInfo::CreateStopReasonWithSignal (*this, SIGSTOP));
}
+ return true;
}
- return m_actual_stop_info_sp;
+ return false;
}
void
Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/ThreadKDP.h Wed May 8 20:55:29 2013
@@ -89,13 +89,10 @@ protected:
lldb::addr_t m_thread_dispatch_qaddr;
lldb::StopInfoSP m_cached_stop_info_sp;
//------------------------------------------------------------------
- // Member variables.
+ // Protected member functions.
//------------------------------------------------------------------
-
- virtual lldb::StopInfoSP
- GetPrivateStopReason ();
-
-
+ virtual bool
+ CalculateStopInfo ();
};
#endif // liblldb_ThreadKDP_h_
Modified: lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp Wed May 8 20:55:29 2013
@@ -138,10 +138,11 @@ POSIXThread::CreateRegisterContextForFra
return reg_ctx_sp;
}
-lldb::StopInfoSP
-POSIXThread::GetPrivateStopReason()
+bool
+POSIXThread::CalculateStopInfo()
{
- return m_actual_stop_info_sp;
+ SetStopInfo (m_actual_stop_info_sp);
+ return true;
}
Unwind *
Modified: lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.h Wed May 8 20:55:29 2013
@@ -97,8 +97,8 @@ private:
ProcessMonitor &
GetMonitor();
- lldb::StopInfoSP
- GetPrivateStopReason();
+ virtual bool
+ CalculateStopInfo();
void BreakNotify(const ProcessMessage &message);
void WatchNotify(const ProcessMessage &message);
Modified: lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.cpp Wed May 8 20:55:29 2013
@@ -99,209 +99,34 @@ ThreadMemory::CreateRegisterContextForFr
return reg_ctx_sp;
}
-
-//class StopInfoThreadMemory : public StopInfo
-//{
-//public:
-// //------------------------------------------------------------------
-// // Constructors and Destructors
-// //------------------------------------------------------------------
-// StopInfoThreadMemory (Thread &thread,
-// uint64_t value,
-// StopInfoSP &backing_stop_info_sp) :
-// StopInfo (thread, value),
-// m_backing_stop_info_sp (backing_stop_info_sp)
-// {
-// }
-//
-// virtual
-// ~StopInfoThreadMemory()
-// {
-// }
-//
-// virtual bool
-// IsValid () const
-// {
-// ThreadSP backing_thread_sp (m_thread.GetBackingThread());
-// if (backing_thread_sp)
-// return backing_thread_sp->IsValid();
-// return StopInfo::IsValid();
-// }
-//
-// virtual Thread &
-// GetThread()
-// {
-// return m_thread;
-// }
-//
-// virtual const Thread &
-// GetThread() const
-// {
-// return m_thread;
-// }
-//
-// virtual uint64_t
-// GetValue() const
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->GetValue();
-// return StopInfo::GetValue();
-// }
-//
-// virtual lldb::StopReason
-// GetStopReason () const
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->GetStopReason();
-// return eStopReasonNone;
-// }
-//
-// // ShouldStopSynchronous will get called before any thread plans are consulted, and if it says we should
-// // resume the target, then we will just immediately resume. This should not run any code in or resume the
-// // target.
-//
-// virtual bool
-// ShouldStopSynchronous (Event *event_ptr)
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->ShouldStopSynchronous(event_ptr);
-// return StopInfo::ShouldStopSynchronous (event_ptr);
-// }
-//
-// // If should stop returns false, check if we should notify of this event
-// virtual bool
-// ShouldNotify (Event *event_ptr)
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->ShouldNotify(event_ptr);
-// return StopInfo::ShouldNotify (event_ptr);
-// }
-//
-// virtual void
-// WillResume (lldb::StateType resume_state)
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->WillResume(resume_state);
-// return StopInfo::WillResume (resume_state);
-// }
-//
-// virtual const char *
-// GetDescription ()
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->GetDescription();
-// return StopInfo::GetDescription();
-// }
-//
-// virtual void
-// SetDescription (const char *desc_cstr)
-// {
-// if (m_backing_stop_info_sp)
-// m_backing_stop_info_sp->SetDescription(desc_cstr);
-// StopInfo::SetDescription(desc_cstr);
-// }
-//
-// // Sometimes the thread plan logic will know that it wants a given stop to stop or not,
-// // regardless of what the ordinary logic for that StopInfo would dictate. The main example
-// // of this is the ThreadPlanCallFunction, which for instance knows - based on how that particular
-// // expression was executed - whether it wants all breakpoints to auto-continue or not.
-// // Use OverrideShouldStop on the StopInfo to implement this.
-//
-// virtual void
-// OverrideShouldStop (bool override_value)
-// {
-// if (m_backing_stop_info_sp)
-// m_backing_stop_info_sp->OverrideShouldStop(override_value);
-// StopInfo::OverrideShouldStop (override_value);
-// }
-//
-// virtual bool
-// GetOverrideShouldStop()
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->GetOverrideShouldStop();
-// return StopInfo::GetOverrideShouldStop();
-// }
-//
-// virtual bool
-// GetOverriddenShouldStopValue ()
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->GetOverriddenShouldStopValue();
-// return StopInfo::GetOverriddenShouldStopValue();
-// }
-//
-// virtual void
-// PerformAction (Event *event_ptr)
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->PerformAction(event_ptr);
-// return StopInfo::PerformAction(event_ptr);
-// }
-//
-// virtual bool
-// ShouldStop (Event *event_ptr)
-// {
-// if (m_backing_stop_info_sp)
-// return m_backing_stop_info_sp->ShouldStop(event_ptr);
-// return StopInfo::ShouldStop(event_ptr);
-// }
-//
-//
-//protected:
-// StopInfoSP m_backing_stop_info_sp;
-//
-//private:
-// DISALLOW_COPY_AND_ASSIGN (StopInfoThreadMemory);
-//};
-
-
-lldb::StopInfoSP
-ThreadMemory::GetPrivateStopReason ()
+bool
+ThreadMemory::CalculateStopInfo ()
{
- if (m_actual_stop_info_sp)
- return m_actual_stop_info_sp;
-
if (m_backing_thread_sp)
{
- lldb::StopInfoSP backing_stop_info_sp (m_backing_thread_sp->GetPrivateStopReason());
+ lldb::StopInfoSP backing_stop_info_sp (m_backing_thread_sp->GetPrivateStopInfo());
if (backing_stop_info_sp)
{
- m_actual_stop_info_sp = backing_stop_info_sp;
- m_actual_stop_info_sp->SetThread (shared_from_this());
- return m_actual_stop_info_sp;
+ backing_stop_info_sp->SetThread (shared_from_this());
+ SetStopInfo (backing_stop_info_sp);
+ return true;
}
}
-
- ProcessSP process_sp (GetProcess());
-
- if (process_sp)
+ else
{
- const uint32_t process_stop_id = process_sp->GetStopID();
- if (m_thread_stop_reason_stop_id != process_stop_id ||
- (m_actual_stop_info_sp && !m_actual_stop_info_sp->IsValid()))
- {
- if (IsStillAtLastBreakpointHit())
- return m_actual_stop_info_sp;
+ ProcessSP process_sp (GetProcess());
- // If GetGDBProcess().SetThreadStopInfo() doesn't find a stop reason
- // for this thread, then m_actual_stop_info_sp will not ever contain
- // a valid stop reason and the "m_actual_stop_info_sp->IsValid() == false"
- // check will never be able to tell us if we have the correct stop info
- // for this thread and we will continually send qThreadStopInfo packets
- // down to the remote GDB server, so we need to keep our own notion
- // of the stop ID that m_actual_stop_info_sp is valid for (even if it
- // contains nothing). We use m_thread_stop_reason_stop_id for this below.
- m_thread_stop_reason_stop_id = process_stop_id;
- m_actual_stop_info_sp.reset();
-
+ if (process_sp)
+ {
OperatingSystem *os = process_sp->GetOperatingSystem ();
if (os)
- m_actual_stop_info_sp = os->CreateThreadStopReason (this);
+ {
+ SetStopInfo (os->CreateThreadStopReason (this));
+ return true;
+ }
}
}
- return m_actual_stop_info_sp;
-
+ return false;
}
void
@@ -309,4 +134,7 @@ ThreadMemory::RefreshStateAfterStop()
{
if (m_backing_thread_sp)
return m_backing_thread_sp->RefreshStateAfterStop();
+
+ if (m_reg_context_sp)
+ m_reg_context_sp->InvalidateAllRegisters();
}
Modified: lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/ThreadMemory.h Wed May 8 20:55:29 2013
@@ -39,8 +39,8 @@ public:
virtual lldb::RegisterContextSP
CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
- virtual lldb::StopInfoSP
- GetPrivateStopReason ();
+ virtual bool
+ CalculateStopInfo ();
virtual const char *
GetInfo ()
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Wed May 8 20:55:29 2013
@@ -1770,7 +1770,7 @@ ProcessGDBRemote::DoDestroy ()
for (size_t i = 0; i < num_threads; i++)
{
ThreadSP thread_sp = threads.GetThreadAtIndex(i);
- StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
+ StopInfoSP stop_info_sp = thread_sp->GetPrivateStopInfo();
StopReason reason = eStopReasonInvalid;
if (stop_info_sp)
reason = stop_info_sp->GetStopReason();
@@ -1805,7 +1805,7 @@ ProcessGDBRemote::DoDestroy ()
for (size_t i = 0; i < num_threads; i++)
{
ThreadSP thread_sp = threads.GetThreadAtIndex(i);
- StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
+ StopInfoSP stop_info_sp = thread_sp->GetPrivateStopInfo();
StopReason reason = eStopReasonInvalid;
if (stop_info_sp)
reason = stop_info_sp->GetStopReason();
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp Wed May 8 20:55:29 2013
@@ -197,56 +197,18 @@ ThreadGDBRemote::PrivateSetRegisterValue
return gdb_reg_ctx->PrivateSetRegisterValue (reg, response);
}
-lldb::StopInfoSP
-ThreadGDBRemote::GetPrivateStopReason ()
+bool
+ThreadGDBRemote::CalculateStopInfo ()
{
ProcessSP process_sp (GetProcess());
if (process_sp)
{
- const uint32_t process_stop_id = process_sp->GetStopID();
- if (m_thread_stop_reason_stop_id == process_stop_id)
- {
- // Our stop info is up to date even if it is empty...
- return m_actual_stop_info_sp;
- }
-
- if (m_actual_stop_info_sp && m_actual_stop_info_sp->IsValid())
- {
- // The stop info is up to date, reset it so everything updates
- SetStopInfo (m_actual_stop_info_sp);
- }
- else
- {
- if (IsStillAtLastBreakpointHit())
- {
- SetStopInfo(m_actual_stop_info_sp);
- }
- else
- {
- // If GetGDBProcess().SetThreadStopInfo() doesn't find a stop reason
- // for this thread, then m_actual_stop_info_sp will not ever contain
- // a valid stop reason and the "m_actual_stop_info_sp->IsValid() == false"
- // check will never be able to tell us if we have the correct stop info
- // for this thread and we will continually send qThreadStopInfo packets
- // down to the remote GDB server, so we need to keep our own notion
- // of the stop ID that m_actual_stop_info_sp is valid for (even if it
- // contains nothing). We use m_thread_stop_reason_stop_id for this below.
- m_actual_stop_info_sp.reset();
-
- StringExtractorGDBRemote stop_packet;
- ProcessGDBRemote *gdb_process = static_cast<ProcessGDBRemote *>(process_sp.get());
- if (gdb_process->GetGDBRemote().GetThreadStopInfo(GetProtocolID(), stop_packet))
- {
- gdb_process->SetThreadStopInfo (stop_packet);
- }
- else
- {
- SetStopInfo (StopInfoSP());
- }
- }
- }
+ StringExtractorGDBRemote stop_packet;
+ ProcessGDBRemote *gdb_process = static_cast<ProcessGDBRemote *>(process_sp.get());
+ if (gdb_process->GetGDBRemote().GetThreadStopInfo(GetProtocolID(), stop_packet))
+ return gdb_process->SetThreadStopInfo (stop_packet) == eStateStopped;
}
- return m_actual_stop_info_sp;
+ return false;
}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h Wed May 8 20:55:29 2013
@@ -98,8 +98,8 @@ protected:
void
SetStopInfoFromPacket (StringExtractor &stop_packet, uint32_t stop_id);
- virtual lldb::StopInfoSP
- GetPrivateStopReason ();
+ virtual bool
+ CalculateStopInfo ();
};
Modified: lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.cpp Wed May 8 20:55:29 2013
@@ -117,39 +117,16 @@ ThreadMachCore::CreateRegisterContextFor
return reg_ctx_sp;
}
-lldb::StopInfoSP
-ThreadMachCore::GetPrivateStopReason ()
+bool
+ThreadMachCore::CalculateStopInfo ()
{
ProcessSP process_sp (GetProcess());
-
if (process_sp)
{
- const uint32_t process_stop_id = process_sp->GetStopID();
- if (m_thread_stop_reason_stop_id != process_stop_id ||
- (m_actual_stop_info_sp && !m_actual_stop_info_sp->IsValid()))
- {
- if (IsStillAtLastBreakpointHit())
- return m_actual_stop_info_sp;
-
- // TODO: can we query the initial state of the thread here?
- // For now I am just going to pretend that a SIGSTOP happened.
-
- SetStopInfo(StopInfo::CreateStopReasonWithSignal (*this, SIGSTOP));
-
- // If GetKDPProcess().SetThreadStopInfo() doesn't find a stop reason
- // for this thread, then m_actual_stop_info_sp will not ever contain
- // a valid stop reason and the "m_actual_stop_info_sp->IsValid() == false"
- // check will never be able to tell us if we have the correct stop info
- // for this thread and we will continually send qThreadStopInfo packets
- // down to the remote KDP server, so we need to keep our own notion
- // of the stop ID that m_actual_stop_info_sp is valid for (even if it
- // contains nothing). We use m_thread_stop_reason_stop_id for this below.
- // m_thread_stop_reason_stop_id = process_stop_id;
- // m_actual_stop_info_sp.reset();
-
- }
+ SetStopInfo(StopInfo::CreateStopReasonWithSignal (*this, SIGSTOP));
+ return true;
}
- return m_actual_stop_info_sp;
+ return false;
}
Modified: lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.h?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.h (original)
+++ lldb/trunk/source/Plugins/Process/mach-core/ThreadMachCore.h Wed May 8 20:55:29 2013
@@ -79,11 +79,10 @@ protected:
lldb::addr_t m_thread_dispatch_qaddr;
lldb::RegisterContextSP m_thread_reg_ctx_sp;
//------------------------------------------------------------------
- // Member variables.
+ // Protected member functions.
//------------------------------------------------------------------
-
- virtual lldb::StopInfoSP
- GetPrivateStopReason ();
+ virtual bool
+ CalculateStopInfo ();
};
#endif // liblldb_ThreadMachCore_h_
Modified: lldb/trunk/source/Target/Thread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Target/Thread.cpp (original)
+++ lldb/trunk/source/Target/Thread.cpp Wed May 8 20:55:29 2013
@@ -243,9 +243,9 @@ Thread::Thread (Process &process, lldb::
UserID (tid),
Broadcaster(&process.GetTarget().GetDebugger(), Thread::GetStaticBroadcasterClass().AsCString()),
m_process_wp (process.shared_from_this()),
- m_actual_stop_info_sp (),
+ m_stop_info_sp (),
+ m_stop_info_stop_id (0),
m_index_id (process.GetNextThreadIndexID(tid)),
- m_protocol_tid (tid),
m_reg_context_sp (),
m_state (eStateUnloaded),
m_state_mutex (Mutex::eMutexTypeRecursive),
@@ -259,7 +259,6 @@ Thread::Thread (Process &process, lldb::
m_temporary_resume_state (eStateRunning),
m_unwinder_ap (),
m_destroy_called (false),
- m_thread_stop_reason_stop_id (0),
m_override_should_notify (eLazyBoolCalculate)
{
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
@@ -283,11 +282,17 @@ Thread::~Thread()
void
Thread::DestroyThread ()
{
+ // Tell any plans on the plan stack that the thread is being destroyed since
+ // any active plans that have a thread go away in the middle of might need
+ // to do cleanup.
+ for (auto plan : m_plan_stack)
+ plan->ThreadDestroyed();
+
m_destroy_called = true;
m_plan_stack.clear();
m_discarded_plan_stack.clear();
m_completed_plan_stack.clear();
- m_actual_stop_info_sp.reset();
+ m_stop_info_sp.reset();
m_reg_context_sp.reset();
m_unwinder_ap.reset();
Mutex::Locker locker(m_frame_mutex);
@@ -366,19 +371,58 @@ Thread::GetStopInfo ()
}
else
{
- if ((m_thread_stop_reason_stop_id == stop_id) || // Stop info is valid, just return what we have (even if empty)
- (m_actual_stop_info_sp && m_actual_stop_info_sp->IsValid())) // Stop info is valid, just return what we have
+ if ((m_stop_info_stop_id == stop_id) || // Stop info is valid, just return what we have (even if empty)
+ (m_stop_info_sp && m_stop_info_sp->IsValid())) // Stop info is valid, just return what we have
{
- return m_actual_stop_info_sp;
+ return m_stop_info_sp;
}
else
{
- GetPrivateStopReason ();
- return m_actual_stop_info_sp;
+ GetPrivateStopInfo ();
+ return m_stop_info_sp;
+ }
+ }
+}
+
+lldb::StopInfoSP
+Thread::GetPrivateStopInfo ()
+{
+ ProcessSP process_sp (GetProcess());
+ if (process_sp)
+ {
+ ProcessSP process_sp (GetProcess());
+ if (process_sp)
+ {
+ const uint32_t process_stop_id = process_sp->GetStopID();
+ if (m_stop_info_stop_id != process_stop_id)
+ {
+ if (m_stop_info_sp)
+ {
+ if (m_stop_info_sp->IsValid())
+ {
+ SetStopInfo (m_stop_info_sp);
+ }
+ else
+ {
+ if (IsStillAtLastBreakpointHit())
+ SetStopInfo(m_stop_info_sp);
+ else
+ m_stop_info_sp.reset();
+ }
+ }
+
+ if (!m_stop_info_sp)
+ {
+ if (CalculateStopInfo() == false)
+ SetStopInfo (StopInfoSP());
+ }
+ }
}
}
+ return m_stop_info_sp;
}
+
lldb::StopReason
Thread::GetStopReason()
{
@@ -393,20 +437,20 @@ Thread::GetStopReason()
void
Thread::SetStopInfo (const lldb::StopInfoSP &stop_info_sp)
{
- m_actual_stop_info_sp = stop_info_sp;
- if (m_actual_stop_info_sp)
+ m_stop_info_sp = stop_info_sp;
+ if (m_stop_info_sp)
{
- m_actual_stop_info_sp->MakeStopInfoValid();
+ m_stop_info_sp->MakeStopInfoValid();
// If we are overriding the ShouldReportStop, do that here:
if (m_override_should_notify != eLazyBoolCalculate)
- m_actual_stop_info_sp->OverrideShouldNotify (m_override_should_notify == eLazyBoolYes);
+ m_stop_info_sp->OverrideShouldNotify (m_override_should_notify == eLazyBoolYes);
}
ProcessSP process_sp (GetProcess());
if (process_sp)
- m_thread_stop_reason_stop_id = process_sp->GetStopID();
+ m_stop_info_stop_id = process_sp->GetStopID();
else
- m_thread_stop_reason_stop_id = UINT32_MAX;
+ m_stop_info_stop_id = UINT32_MAX;
}
void
@@ -417,8 +461,8 @@ Thread::SetShouldReportStop (Vote vote)
else
{
m_override_should_notify = (vote == eVoteYes ? eLazyBoolYes : eLazyBoolNo);
- if (m_actual_stop_info_sp)
- m_actual_stop_info_sp->OverrideShouldNotify (m_override_should_notify == eLazyBoolYes);
+ if (m_stop_info_sp)
+ m_stop_info_sp->OverrideShouldNotify (m_override_should_notify == eLazyBoolYes);
}
}
@@ -433,7 +477,7 @@ Thread::SetStopInfoToNothing()
bool
Thread::ThreadStoppedForAReason (void)
{
- return (bool) GetPrivateStopReason ();
+ return (bool) GetPrivateStopInfo ();
}
bool
@@ -554,18 +598,22 @@ Thread::ShouldResume (StateType resume_s
m_temporary_resume_state = resume_state;
- // Make sure m_actual_stop_info_sp is valid
- GetPrivateStopReason();
+ lldb::ThreadSP backing_thread_sp (GetBackingThread ());
+ if (backing_thread_sp)
+ backing_thread_sp->m_temporary_resume_state = resume_state;
+
+ // Make sure m_stop_info_sp is valid
+ GetPrivateStopInfo();
// This is a little dubious, but we are trying to limit how often we actually fetch stop info from
// the target, 'cause that slows down single stepping. So assume that if we got to the point where
// we're about to resume, and we haven't yet had to fetch the stop reason, then it doesn't need to know
// about the fact that we are resuming...
const uint32_t process_stop_id = GetProcess()->GetStopID();
- if (m_thread_stop_reason_stop_id == process_stop_id &&
- (m_actual_stop_info_sp && m_actual_stop_info_sp->IsValid()))
+ if (m_stop_info_stop_id == process_stop_id &&
+ (m_stop_info_sp && m_stop_info_sp->IsValid()))
{
- StopInfo *stop_info = GetPrivateStopReason().get();
+ StopInfo *stop_info = GetPrivateStopInfo().get();
if (stop_info)
stop_info->WillResume (resume_state);
}
@@ -590,7 +638,7 @@ Thread::ShouldResume (StateType resume_s
if (need_to_resume && resume_state != eStateSuspended)
{
- m_actual_stop_info_sp.reset();
+ m_stop_info_sp.reset();
}
}
@@ -676,7 +724,7 @@ Thread::ShouldStop (Event* event_ptr)
// First query the stop info's ShouldStopSynchronous. This handles "synchronous" stop reasons, for example the breakpoint
// command on internal breakpoints. If a synchronous stop reason says we should not stop, then we don't have to
// do any more work on this stop.
- StopInfoSP private_stop_info (GetPrivateStopReason());
+ StopInfoSP private_stop_info (GetPrivateStopInfo());
if (private_stop_info && private_stop_info->ShouldStopSynchronous(event_ptr) == false)
{
if (log)
@@ -1906,10 +1954,10 @@ Thread::IsStillAtLastBreakpointHit ()
// If we are currently stopped at a breakpoint, always return that stopinfo and don't reset it.
// This allows threads to maintain their breakpoint stopinfo, such as when thread-stepping in
// multithreaded programs.
- if (m_actual_stop_info_sp) {
- StopReason stop_reason = m_actual_stop_info_sp->GetStopReason();
+ if (m_stop_info_sp) {
+ StopReason stop_reason = m_stop_info_sp->GetStopReason();
if (stop_reason == lldb::eStopReasonBreakpoint) {
- uint64_t value = m_actual_stop_info_sp->GetValue();
+ uint64_t value = m_stop_info_sp->GetValue();
lldb::RegisterContextSP reg_ctx_sp (GetRegisterContext());
if (reg_ctx_sp)
{
Modified: lldb/trunk/source/Target/ThreadList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadList.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadList.cpp (original)
+++ lldb/trunk/source/Target/ThreadList.cpp Wed May 8 20:55:29 2013
@@ -505,6 +505,8 @@ ThreadList::WillResume ()
if ((*pos)->GetResumeState() != eStateSuspended &&
(*pos)->GetCurrentPlan()->StopOthers())
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
wants_solo_run = true;
break;
}
@@ -535,6 +537,8 @@ ThreadList::WillResume ()
if ((*pos)->GetResumeState() != eStateSuspended
&& (!wants_solo_run || (*pos)->GetCurrentPlan()->StopOthers()))
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
(*pos)->SetupForResume ();
}
}
@@ -546,7 +550,6 @@ ThreadList::WillResume ()
run_me_only_list.SetStopID(m_process->GetStopID());
- ThreadSP immediate_thread_sp;
bool run_only_current_thread = false;
for (pos = m_threads.begin(); pos != end; ++pos)
@@ -555,6 +558,9 @@ ThreadList::WillResume ()
if (thread_sp->GetResumeState() != eStateSuspended &&
thread_sp->GetCurrentPlan()->StopOthers())
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
+
// You can't say "stop others" and also want yourself to be suspended.
assert (thread_sp->GetCurrentPlan()->RunState() != eStateSuspended);
@@ -573,18 +579,7 @@ ThreadList::WillResume ()
bool need_to_resume = true;
- if (immediate_thread_sp)
- {
- for (pos = m_threads.begin(); pos != end; ++pos)
- {
- ThreadSP thread_sp(*pos);
- if (thread_sp.get() == immediate_thread_sp.get())
- thread_sp->ShouldResume(thread_sp->GetCurrentPlan()->RunState());
- else
- thread_sp->ShouldResume (eStateSuspended);
- }
- }
- else if (run_me_only_list.GetSize (false) == 0)
+ if (run_me_only_list.GetSize (false) == 0)
{
// Everybody runs as they wish:
for (pos = m_threads.begin(); pos != end; ++pos)
Modified: lldb/trunk/source/Target/ThreadPlanStepOverBreakpoint.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanStepOverBreakpoint.cpp?rev=181501&r1=181500&r2=181501&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadPlanStepOverBreakpoint.cpp (original)
+++ lldb/trunk/source/Target/ThreadPlanStepOverBreakpoint.cpp Wed May 8 20:55:29 2013
@@ -34,7 +34,8 @@ ThreadPlanStepOverBreakpoint::ThreadPlan
// first in the thread plan stack when stepping
// over a breakpoint
m_breakpoint_addr (LLDB_INVALID_ADDRESS),
- m_auto_continue(false)
+ m_auto_continue(false),
+ m_reenabled_breakpoint_site (false)
{
m_breakpoint_addr = m_thread.GetRegisterContext()->GetPC();
@@ -105,9 +106,7 @@ ThreadPlanStepOverBreakpoint::DoWillResu
bool
ThreadPlanStepOverBreakpoint::WillStop ()
{
- BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr));
- if (bp_site_sp)
- m_thread.GetProcess()->EnableBreakpointSite (bp_site_sp.get());
+ ReenableBreakpointSite ();
return true;
}
@@ -128,13 +127,30 @@ ThreadPlanStepOverBreakpoint::MischiefMa
if (log)
log->Printf("Completed step over breakpoint plan.");
// Otherwise, re-enable the breakpoint we were stepping over, and we're done.
+ ReenableBreakpointSite ();
+ ThreadPlan::MischiefManaged ();
+ return true;
+ }
+}
+
+void
+ThreadPlanStepOverBreakpoint::ReenableBreakpointSite ()
+{
+ if (!m_reenabled_breakpoint_site)
+ {
+ m_reenabled_breakpoint_site = true;
BreakpointSiteSP bp_site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByAddress (m_breakpoint_addr));
if (bp_site_sp)
+ {
m_thread.GetProcess()->EnableBreakpointSite (bp_site_sp.get());
- ThreadPlan::MischiefManaged ();
- return true;
+ }
}
}
+void
+ThreadPlanStepOverBreakpoint::ThreadDestroyed ()
+{
+ ReenableBreakpointSite ();
+}
void
ThreadPlanStepOverBreakpoint::SetAutoContinue (bool do_it)
More information about the lldb-commits
mailing list