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 
1039de3110SZachary Turner #include "lldb/Core/Log.h"
1139de3110SZachary Turner #include "lldb/Host/HostInfo.h"
1239de3110SZachary Turner #include "lldb/Host/HostNativeThreadBase.h"
1339de3110SZachary Turner #include "lldb/Host/ThisThread.h"
1439de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
1539de3110SZachary Turner #include "llvm/ADT/StringExtras.h"
1639de3110SZachary Turner 
1739de3110SZachary Turner using namespace lldb;
1839de3110SZachary Turner using namespace lldb_private;
1939de3110SZachary Turner 
2039de3110SZachary Turner HostNativeThreadBase::HostNativeThreadBase()
2139de3110SZachary Turner     : m_thread(LLDB_INVALID_HOST_THREAD)
2239de3110SZachary Turner     , m_result(0)
2339de3110SZachary Turner {
2439de3110SZachary Turner }
2539de3110SZachary Turner 
2639de3110SZachary Turner HostNativeThreadBase::HostNativeThreadBase(thread_t thread)
2739de3110SZachary Turner     : m_thread(thread)
2839de3110SZachary Turner     , m_result(0)
2939de3110SZachary Turner {
3039de3110SZachary Turner }
3139de3110SZachary Turner 
3239de3110SZachary Turner lldb::thread_t
3339de3110SZachary Turner HostNativeThreadBase::GetSystemHandle() const
3439de3110SZachary Turner {
3539de3110SZachary Turner     return m_thread;
3639de3110SZachary Turner }
3739de3110SZachary Turner 
3839de3110SZachary Turner lldb::thread_result_t
3939de3110SZachary Turner HostNativeThreadBase::GetResult() const
4039de3110SZachary Turner {
4139de3110SZachary Turner     return m_result;
4239de3110SZachary Turner }
4339de3110SZachary Turner 
44*acee96aeSZachary Turner bool
45*acee96aeSZachary Turner HostNativeThreadBase::IsJoinable() const
46*acee96aeSZachary Turner {
47*acee96aeSZachary Turner     return m_thread != LLDB_INVALID_HOST_THREAD;
48*acee96aeSZachary Turner }
49*acee96aeSZachary Turner 
5039de3110SZachary Turner void
5139de3110SZachary Turner HostNativeThreadBase::Reset()
5239de3110SZachary Turner {
5339de3110SZachary Turner     m_thread = LLDB_INVALID_HOST_THREAD;
5439de3110SZachary Turner     m_result = 0;
5539de3110SZachary Turner }
5639de3110SZachary Turner 
5739de3110SZachary Turner lldb::thread_t
5839de3110SZachary Turner HostNativeThreadBase::Release()
5939de3110SZachary Turner {
6039de3110SZachary Turner     lldb::thread_t result = m_thread;
6139de3110SZachary Turner     m_thread = LLDB_INVALID_HOST_THREAD;
6239de3110SZachary Turner     m_result = 0;
6339de3110SZachary Turner 
6439de3110SZachary Turner     return result;
6539de3110SZachary Turner }
6639de3110SZachary Turner 
6739de3110SZachary Turner lldb::thread_result_t
6839de3110SZachary Turner HostNativeThreadBase::ThreadCreateTrampoline(lldb::thread_arg_t arg)
6939de3110SZachary Turner {
7039de3110SZachary Turner     ThreadLauncher::HostThreadCreateInfo *info = (ThreadLauncher::HostThreadCreateInfo *)arg;
7139de3110SZachary Turner     ThisThread::SetName(info->thread_name.c_str(), HostInfo::GetMaxThreadNameLength());
7239de3110SZachary Turner 
7339de3110SZachary Turner     thread_func_t thread_fptr = info->thread_fptr;
7439de3110SZachary Turner     thread_arg_t thread_arg = info->thread_arg;
7539de3110SZachary Turner 
7639de3110SZachary Turner     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
7739de3110SZachary Turner     if (log)
7839de3110SZachary Turner         log->Printf("thread created");
7939de3110SZachary Turner 
8039de3110SZachary Turner     delete info;
8139de3110SZachary Turner     return thread_fptr(thread_arg);
8239de3110SZachary Turner }
83