Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Host/common/ThreadLauncher.cpp
39606 views
1
//===-- ThreadLauncher.cpp ------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
// lldb Includes
10
#include "lldb/Host/ThreadLauncher.h"
11
#include "lldb/Host/HostNativeThread.h"
12
#include "lldb/Host/HostThread.h"
13
#include "lldb/Utility/Log.h"
14
15
#if defined(_WIN32)
16
#include "lldb/Host/windows/windows.h"
17
#endif
18
19
#include "llvm/Support/WindowsError.h"
20
21
using namespace lldb;
22
using namespace lldb_private;
23
24
llvm::Expected<HostThread>
25
ThreadLauncher::LaunchThread(llvm::StringRef name,
26
std::function<thread_result_t()> impl,
27
size_t min_stack_byte_size) {
28
// Host::ThreadCreateTrampoline will take ownership if thread creation is
29
// successful.
30
auto info_up = std::make_unique<HostThreadCreateInfo>(name.str(), impl);
31
lldb::thread_t thread;
32
#ifdef _WIN32
33
thread = (lldb::thread_t)::_beginthreadex(
34
0, (unsigned)min_stack_byte_size,
35
HostNativeThread::ThreadCreateTrampoline, info_up.get(), 0, NULL);
36
if (thread == LLDB_INVALID_HOST_THREAD)
37
return llvm::errorCodeToError(llvm::mapWindowsError(GetLastError()));
38
#else
39
40
// ASAN instrumentation adds a lot of bookkeeping overhead on stack frames.
41
#if __has_feature(address_sanitizer)
42
const size_t eight_megabytes = 8 * 1024 * 1024;
43
if (min_stack_byte_size < eight_megabytes) {
44
min_stack_byte_size += eight_megabytes;
45
}
46
#endif
47
48
pthread_attr_t *thread_attr_ptr = nullptr;
49
pthread_attr_t thread_attr;
50
bool destroy_attr = false;
51
if (min_stack_byte_size > 0) {
52
if (::pthread_attr_init(&thread_attr) == 0) {
53
destroy_attr = true;
54
size_t default_min_stack_byte_size = 0;
55
if (::pthread_attr_getstacksize(&thread_attr,
56
&default_min_stack_byte_size) == 0) {
57
if (default_min_stack_byte_size < min_stack_byte_size) {
58
if (::pthread_attr_setstacksize(&thread_attr, min_stack_byte_size) ==
59
0)
60
thread_attr_ptr = &thread_attr;
61
}
62
}
63
}
64
}
65
int err =
66
::pthread_create(&thread, thread_attr_ptr,
67
HostNativeThread::ThreadCreateTrampoline, info_up.get());
68
69
if (destroy_attr)
70
::pthread_attr_destroy(&thread_attr);
71
72
if (err)
73
return llvm::errorCodeToError(
74
std::error_code(err, std::generic_category()));
75
#endif
76
77
info_up.release();
78
return HostThread(thread);
79
}
80
81