forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- HostThreadMacOSX.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/macosx/HostThreadMacOSX.h"
 | |
| #include "lldb/Host/Host.h"
 | |
| 
 | |
| #include <CoreFoundation/CoreFoundation.h>
 | |
| #include <Foundation/Foundation.h>
 | |
| 
 | |
| #include <objc/objc-auto.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)
 | |
|     {
 | |
|         // Register our thread with the collector if garbage collection is enabled.
 | |
|         if (objc_collectingEnabled())
 | |
|         {
 | |
| #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
 | |
|             // On Leopard and earlier there is no way objc_registerThreadWithCollector
 | |
|             // function, so we do it manually.
 | |
|             auto_zone_register_thread(auto_zone());
 | |
| #else
 | |
|             // On SnowLeopard and later we just call the thread registration function.
 | |
|             objc_registerThreadWithCollector();
 | |
| #endif
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             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);
 | |
| }
 |