HostThreadMacOSX.mm
1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//===-- 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);
}