[ProcessWindows] Create a TargetThreadWindows class.
This creates a TargetThreadWindows class and updates the thread
list of the Process with the main thread. Additionally, we
fill out a few more overrides of Process base class methods. We
do not yet update the thread list as threads are created and/or
destroyed, and we do not yet propagate stop reasons to threads as
their states change.
llvm-svn: 222148
diff --git a/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp b/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
new file mode 100644
index 0000000..33b5fd1
--- /dev/null
+++ b/lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
@@ -0,0 +1,95 @@
+//===-- TargetThreadWindows.cpp----------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "TargetThreadWindows.h"
+#include "ProcessWindows.h"
+#include "lldb/Host/HostNativeThreadBase.h"
+#include "lldb/Host/windows/HostThreadWindows.h"
+#include "lldb/Host/windows/windows.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+TargetThreadWindows::TargetThreadWindows(ProcessWindows &process, const HostThread &thread)
+ : Thread(process, ((HostThreadWindows &)thread.GetNativeThread()).GetThreadId())
+ , m_host_thread(thread)
+{
+}
+
+TargetThreadWindows::~TargetThreadWindows()
+{
+ DestroyThread();
+}
+
+void
+TargetThreadWindows::RefreshStateAfterStop()
+{
+}
+
+void
+TargetThreadWindows::WillResume(lldb::StateType resume_state)
+{
+}
+
+void
+TargetThreadWindows::DidStop()
+{
+}
+
+RegisterContextSP
+TargetThreadWindows::GetRegisterContext()
+{
+ return RegisterContextSP();
+}
+
+RegisterContextSP
+TargetThreadWindows::CreateRegisterContextForFrame(StackFrame *frame)
+{
+ return RegisterContextSP();
+}
+
+bool
+TargetThreadWindows::CalculateStopInfo()
+{
+ return false;
+}
+
+bool
+TargetThreadWindows::DoResume()
+{
+ StateType resume_state = GetResumeState();
+ StateType current_state = GetState();
+ if (resume_state == current_state)
+ return true;
+
+ bool success = false;
+ DWORD suspend_count = 0;
+ switch (resume_state)
+ {
+ 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;
+ }
+ return success;
+}