blob: 5c60caa33e6f4de818ba5aa9c3bdc011e2cf6c2f [file] [log] [blame]
//===-- 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:
MacOSXDarwinThread(const MacOSXDarwinThread &) = delete;
const MacOSXDarwinThread &operator=(const MacOSXDarwinThread &) = delete;
};
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);
}