summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp')
-rw-r--r--lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp41
1 files changed, 19 insertions, 22 deletions
diff --git a/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp b/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
index 2f5ddc93056..b57f33f0dd5 100644
--- a/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
@@ -38,12 +38,15 @@ TargetThreadWindows::~TargetThreadWindows()
void
TargetThreadWindows::RefreshStateAfterStop()
{
+ DWORD old_suspend_count = ::SuspendThread(m_host_thread.GetNativeThread().GetSystemHandle());
+
GetRegisterContext()->InvalidateIfNeeded(false);
}
void
TargetThreadWindows::WillResume(lldb::StateType resume_state)
{
+ SetResumeState(resume_state);
}
void
@@ -118,28 +121,22 @@ TargetThreadWindows::DoResume()
if (resume_state == current_state)
return true;
- bool success = false;
- DWORD suspend_count = 0;
- switch (resume_state)
+ if (resume_state == eStateStepping)
+ {
+ uint32_t flags_index = GetRegisterContext()->ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
+ uint64_t flags_value = GetRegisterContext()->ReadRegisterAsUnsigned(flags_index, 0);
+ flags_value |= 0x100; // Set the trap flag on the CPU
+ GetRegisterContext()->WriteRegisterFromUnsigned(flags_index, flags_value);
+ }
+
+ if (resume_state == eStateStepping || resume_state == eStateRunning)
{
- case eStateRunning:
- SetState(resume_state);
- do
- {
- suspend_count = ::ResumeThread(m_host_thread.GetNativeThread().GetSystemHandle());
- } while (suspend_count > 1 && suspend_count != (DWORD)-1);
- success = (suspend_count != (DWORD)-1);
- break;
- case eStateStopped:
- case eStateSuspended:
- if (current_state != eStateStopped && current_state != eStateSuspended)
- {
- suspend_count = SuspendThread(m_host_thread.GetNativeThread().GetSystemHandle());
- success = (suspend_count != (DWORD)-1);
- }
- break;
- default:
- success = false;
+ DWORD previous_suspend_count = 0;
+ HANDLE thread_handle = m_host_thread.GetNativeThread().GetSystemHandle();
+ do
+ {
+ previous_suspend_count = ::ResumeThread(thread_handle);
+ } while (previous_suspend_count > 0);
}
- return success;
+ return true;
}
OpenPOWER on IntegriCloud