//===-- HostNativeThreadBase.cpp --------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Host/HostNativeThreadBase.h"
#include "lldb/Core/Log.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Host/ThisThread.h"
#include "lldb/Host/ThreadLauncher.h"
#include "llvm/ADT/StringExtras.h"

using namespace lldb;
using namespace lldb_private;

HostNativeThreadBase::HostNativeThreadBase()
    : m_thread(LLDB_INVALID_HOST_THREAD), m_result(0) {}

HostNativeThreadBase::HostNativeThreadBase(thread_t thread)
    : m_thread(thread), m_result(0) {}

lldb::thread_t HostNativeThreadBase::GetSystemHandle() const {
  return m_thread;
}

lldb::thread_result_t HostNativeThreadBase::GetResult() const {
  return m_result;
}

bool HostNativeThreadBase::IsJoinable() const {
  return m_thread != LLDB_INVALID_HOST_THREAD;
}

void HostNativeThreadBase::Reset() {
  m_thread = LLDB_INVALID_HOST_THREAD;
  m_result = 0;
}

lldb::thread_t HostNativeThreadBase::Release() {
  lldb::thread_t result = m_thread;
  m_thread = LLDB_INVALID_HOST_THREAD;
  m_result = 0;

  return result;
}

lldb::thread_result_t
HostNativeThreadBase::ThreadCreateTrampoline(lldb::thread_arg_t arg) {
  ThreadLauncher::HostThreadCreateInfo *info =
      (ThreadLauncher::HostThreadCreateInfo *)arg;
  ThisThread::SetName(info->thread_name, HostInfo::GetMaxThreadNameLength());

  thread_func_t thread_fptr = info->thread_fptr;
  thread_arg_t thread_arg = info->thread_arg;

  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
  if (log)
    log->Printf("thread created");

  delete info;
  return thread_fptr(thread_arg);
}
