139de3110SZachary Turner //===-- HostNativeThreadBase.cpp --------------------------------*- C++ -*-===//
239de3110SZachary Turner //
339de3110SZachary Turner //                     The LLVM Compiler Infrastructure
439de3110SZachary Turner //
539de3110SZachary Turner // This file is distributed under the University of Illinois Open Source
639de3110SZachary Turner // License. See LICENSE.TXT for details.
739de3110SZachary Turner //
839de3110SZachary Turner //===----------------------------------------------------------------------===//
939de3110SZachary Turner 
10b9c1b51eSKate Stone #include "lldb/Host/HostNativeThreadBase.h"
1139de3110SZachary Turner #include "lldb/Host/HostInfo.h"
1239de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
136f9e6901SZachary Turner #include "lldb/Utility/Log.h"
14*ed96be99SZachary Turner 
1539de3110SZachary Turner #include "llvm/ADT/StringExtras.h"
16*ed96be99SZachary Turner #include "llvm/Support/Threading.h"
1739de3110SZachary Turner 
1839de3110SZachary Turner using namespace lldb;
1939de3110SZachary Turner using namespace lldb_private;
2039de3110SZachary Turner 
2139de3110SZachary Turner HostNativeThreadBase::HostNativeThreadBase()
22b9c1b51eSKate Stone     : m_thread(LLDB_INVALID_HOST_THREAD), m_result(0) {}
2339de3110SZachary Turner 
2439de3110SZachary Turner HostNativeThreadBase::HostNativeThreadBase(thread_t thread)
25b9c1b51eSKate Stone     : m_thread(thread), m_result(0) {}
2639de3110SZachary Turner 
27b9c1b51eSKate Stone lldb::thread_t HostNativeThreadBase::GetSystemHandle() const {
2839de3110SZachary Turner   return m_thread;
2939de3110SZachary Turner }
3039de3110SZachary Turner 
31b9c1b51eSKate Stone lldb::thread_result_t HostNativeThreadBase::GetResult() const {
3239de3110SZachary Turner   return m_result;
3339de3110SZachary Turner }
3439de3110SZachary Turner 
35b9c1b51eSKate Stone bool HostNativeThreadBase::IsJoinable() const {
36acee96aeSZachary Turner   return m_thread != LLDB_INVALID_HOST_THREAD;
37acee96aeSZachary Turner }
38acee96aeSZachary Turner 
39b9c1b51eSKate Stone void HostNativeThreadBase::Reset() {
4039de3110SZachary Turner   m_thread = LLDB_INVALID_HOST_THREAD;
4139de3110SZachary Turner   m_result = 0;
4239de3110SZachary Turner }
4339de3110SZachary Turner 
44b9c1b51eSKate Stone lldb::thread_t HostNativeThreadBase::Release() {
4539de3110SZachary Turner   lldb::thread_t result = m_thread;
4639de3110SZachary Turner   m_thread = LLDB_INVALID_HOST_THREAD;
4739de3110SZachary Turner   m_result = 0;
4839de3110SZachary Turner 
4939de3110SZachary Turner   return result;
5039de3110SZachary Turner }
5139de3110SZachary Turner 
5239de3110SZachary Turner lldb::thread_result_t
53b9c1b51eSKate Stone HostNativeThreadBase::ThreadCreateTrampoline(lldb::thread_arg_t arg) {
54b9c1b51eSKate Stone   ThreadLauncher::HostThreadCreateInfo *info =
55b9c1b51eSKate Stone       (ThreadLauncher::HostThreadCreateInfo *)arg;
56*ed96be99SZachary Turner   llvm::set_thread_name(info->thread_name);
5739de3110SZachary Turner 
5839de3110SZachary Turner   thread_func_t thread_fptr = info->thread_fptr;
5939de3110SZachary Turner   thread_arg_t thread_arg = info->thread_arg;
6039de3110SZachary Turner 
6139de3110SZachary Turner   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
6239de3110SZachary Turner   if (log)
6339de3110SZachary Turner     log->Printf("thread created");
6439de3110SZachary Turner 
6539de3110SZachary Turner   delete info;
6639de3110SZachary Turner   return thread_fptr(thread_arg);
6739de3110SZachary Turner }
68