Threaded inferior support for FreeBSD

Modelled in part on GDBRemoteCommunicationClient.

Review: http://llvm-reviews.chandlerc.com/D2267
llvm-svn: 196787
diff --git a/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp b/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp
new file mode 100644
index 0000000..493f36c
--- /dev/null
+++ b/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.cpp
@@ -0,0 +1,69 @@
+//===-- FreeBSDThread.cpp ---------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+#include "lldb/Core/State.h"
+
+// Project includes
+#include "FreeBSDThread.h"
+#include "ProcessFreeBSD.h"
+#include "ProcessPOSIXLog.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//------------------------------------------------------------------------------
+// Constructors and destructors.
+
+FreeBSDThread::FreeBSDThread(Process &process, lldb::tid_t tid)
+    : POSIXThread(process, tid)
+{
+}
+
+FreeBSDThread::~FreeBSDThread()
+{
+}
+
+//------------------------------------------------------------------------------
+// ProcessInterface protocol.
+
+void
+FreeBSDThread::WillResume(lldb::StateType resume_state)
+{
+    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
+    if (log)
+        log->Printf("tid %lu resume_state = %s", GetID(),
+                    lldb_private::StateAsCString(resume_state));
+    ProcessSP process_sp(GetProcess());
+    ProcessFreeBSD *process = static_cast<ProcessFreeBSD *>(process_sp.get());
+    int signo = GetResumeSignal();
+    bool signo_valid = process->GetUnixSignals().SignalIsValid(signo);
+
+    switch (resume_state)
+    {
+    case eStateSuspended:
+    case eStateStopped:
+        process->m_suspend_tids.push_back(GetID());
+        break;
+    case eStateRunning:
+        process->m_run_tids.push_back(GetID());
+        if (signo_valid)
+            process->m_resume_signo = signo;
+        break;
+    case eStateStepping:
+        process->m_step_tids.push_back(GetID());
+        if (signo_valid)
+            process->m_resume_signo = signo;
+        break; 
+    default:
+        break;
+    }
+}