diff options
Diffstat (limited to 'lldb/source/Host/common/ThreadLauncher.cpp')
| -rw-r--r-- | lldb/source/Host/common/ThreadLauncher.cpp | 77 | 
1 files changed, 77 insertions, 0 deletions
diff --git a/lldb/source/Host/common/ThreadLauncher.cpp b/lldb/source/Host/common/ThreadLauncher.cpp new file mode 100644 index 000000000000..6e3c8b6a13a4 --- /dev/null +++ b/lldb/source/Host/common/ThreadLauncher.cpp @@ -0,0 +1,77 @@ +//===-- ThreadLauncher.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 +// +//===----------------------------------------------------------------------===// + +// lldb Includes +#include "lldb/Host/ThreadLauncher.h" +#include "lldb/Host/HostNativeThread.h" +#include "lldb/Host/HostThread.h" +#include "lldb/Utility/Log.h" + +#if defined(_WIN32) +#include "lldb/Host/windows/windows.h" +#endif + +#include "llvm/Support/WindowsError.h" + +using namespace lldb; +using namespace lldb_private; + +llvm::Expected<HostThread> ThreadLauncher::LaunchThread( +    llvm::StringRef name, lldb::thread_func_t thread_function, +    lldb::thread_arg_t thread_arg, size_t min_stack_byte_size) { +  // Host::ThreadCreateTrampoline will delete this pointer for us. +  HostThreadCreateInfo *info_ptr = +      new HostThreadCreateInfo(name.data(), thread_function, thread_arg); +  lldb::thread_t thread; +#ifdef _WIN32 +  thread = (lldb::thread_t)::_beginthreadex( +      0, (unsigned)min_stack_byte_size, +      HostNativeThread::ThreadCreateTrampoline, info_ptr, 0, NULL); +  if (thread == LLDB_INVALID_HOST_THREAD) +    return llvm::errorCodeToError(llvm::mapWindowsError(GetLastError())); +#else + +// ASAN instrumentation adds a lot of bookkeeping overhead on stack frames. +#if __has_feature(address_sanitizer) +  const size_t eight_megabytes = 8 * 1024 * 1024; +  if (min_stack_byte_size < eight_megabytes) { +    min_stack_byte_size += eight_megabytes; +  } +#endif + +  pthread_attr_t *thread_attr_ptr = nullptr; +  pthread_attr_t thread_attr; +  bool destroy_attr = false; +  if (min_stack_byte_size > 0) { +    if (::pthread_attr_init(&thread_attr) == 0) { +      destroy_attr = true; +      size_t default_min_stack_byte_size = 0; +      if (::pthread_attr_getstacksize(&thread_attr, +                                      &default_min_stack_byte_size) == 0) { +        if (default_min_stack_byte_size < min_stack_byte_size) { +          if (::pthread_attr_setstacksize(&thread_attr, min_stack_byte_size) == +              0) +            thread_attr_ptr = &thread_attr; +        } +      } +    } +  } +  int err = +      ::pthread_create(&thread, thread_attr_ptr, +                       HostNativeThread::ThreadCreateTrampoline, info_ptr); + +  if (destroy_attr) +    ::pthread_attr_destroy(&thread_attr); + +  if (err) +    return llvm::errorCodeToError( +        std::error_code(err, std::generic_category())); +#endif + +  return HostThread(thread); +}  | 
