//===-- 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 #include #include 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(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); }