//===-- HostThreadMacOSX.cpp ------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Host/macosx/HostThreadMacOSX.h"
#include "lldb/Host/Host.h"

#include <CoreFoundation/CoreFoundation.h>
#include <Foundation/Foundation.h>

#include <pthread.h>

using namespace lldb_private;

namespace {

pthread_once_t g_thread_create_once = PTHREAD_ONCE_INIT;
pthread_key_t g_thread_create_key = 0;

class MacOSXDarwinThread {
public:
  MacOSXDarwinThread() : m_pool(nil) {
    m_pool = [[NSAutoreleasePool alloc] init];
  }

  ~MacOSXDarwinThread() {
    if (m_pool) {
      [m_pool drain];
      m_pool = nil;
    }
  }

  static void PThreadDestructor(void *v) {
    if (v)
      delete static_cast<MacOSXDarwinThread *>(v);
    ::pthread_setspecific(g_thread_create_key, NULL);
  }

protected:
  NSAutoreleasePool *m_pool;

private:
  DISALLOW_COPY_AND_ASSIGN(MacOSXDarwinThread);
};

void InitThreadCreated() {
  ::pthread_key_create(&g_thread_create_key,
                       MacOSXDarwinThread::PThreadDestructor);
}
} // namespace

HostThreadMacOSX::HostThreadMacOSX() : HostThreadPosix() {}

HostThreadMacOSX::HostThreadMacOSX(lldb::thread_t thread)
    : HostThreadPosix(thread) {}

lldb::thread_result_t
HostThreadMacOSX::ThreadCreateTrampoline(lldb::thread_arg_t arg) {
  ::pthread_once(&g_thread_create_once, InitThreadCreated);
  if (g_thread_create_key) {
    ::pthread_setspecific(g_thread_create_key, new MacOSXDarwinThread());
  }

  return HostThreadPosix::ThreadCreateTrampoline(arg);
}
