summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
diff options
context:
space:
mode:
authorStella Stamenova <stilis@microsoft.com>2018-05-17 21:34:24 +0000
committerStella Stamenova <stilis@microsoft.com>2018-05-17 21:34:24 +0000
commit0fd67b537bdf5afe09dff10ff3fe325c1a949efe (patch)
treea854d755c1428033e8fe0cb13d206247c25c3d17 /lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
parent3c4c8a09374d9d8ee0e31301e26daa40ff71a3b4 (diff)
downloadbcm5719-llvm-0fd67b537bdf5afe09dff10ff3fe325c1a949efe.tar.gz
bcm5719-llvm-0fd67b537bdf5afe09dff10ff3fe325c1a949efe.zip
[Windows, Process] Fix an issue in windows thread handling that was causing LLDB to hang
Summary: The function ResumeThread on Windows returns a DWORD which is an unsigned int. In TargetThreadWindows::DoResume, there's code that determines how many times to call ResumeThread based on whether the return value is greater than 0. Since the function returns -1 (as an unsigned int) on failure, this was getting stuck in an infinite loop if ResumeThread failed for any reason. The correct thing to do is check whether the return value is -1 and then return the appropriate error instead of ignoring the return value. Reviewers: asmith, zturner, labath Reviewed By: zturner Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D47020 llvm-svn: 332670
Diffstat (limited to 'lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp')
-rw-r--r--lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
index a4d60303877..3341451c2ee 100644
--- a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
@@ -98,11 +98,11 @@ Unwind *TargetThreadWindows::GetUnwinder() {
return m_unwinder_ap.get();
}
-bool TargetThreadWindows::DoResume() {
+Status TargetThreadWindows::DoResume() {
StateType resume_state = GetTemporaryResumeState();
StateType current_state = GetState();
if (resume_state == current_state)
- return true;
+ return Status();
if (resume_state == eStateStepping) {
uint32_t flags_index =
@@ -118,8 +118,16 @@ bool TargetThreadWindows::DoResume() {
DWORD previous_suspend_count = 0;
HANDLE thread_handle = m_host_thread.GetNativeThread().GetSystemHandle();
do {
+ // ResumeThread returns -1 on error, or the thread's *previous* suspend count on success.
+ // This means that the return value is 1 when the thread was restarted.
+ // Note that DWORD is an unsigned int, so we need to explicitly compare with -1.
previous_suspend_count = ::ResumeThread(thread_handle);
- } while (previous_suspend_count > 0);
+
+ if (previous_suspend_count == (DWORD)-1)
+ return Status(::GetLastError(), eErrorTypeWin32);
+
+ } while (previous_suspend_count > 1);
}
- return true;
+
+ return Status();
}
OpenPOWER on IntegriCloud