blob: d9fe21e1bc594b1d0e3c4ae41b1dd57ed1098cf6 [file] [log] [blame]
Zachary Turner39de3112014-09-09 20:54:56 +00001//===-- ThreadLauncher.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// lldb Includes
11#include "lldb/Core/Log.h"
12#include "lldb/Host/HostNativeThread.h"
13#include "lldb/Host/HostThread.h"
14#include "lldb/Host/ThisThread.h"
15#include "lldb/Host/ThreadLauncher.h"
16
17#if defined(_WIN32)
18#include "lldb/Host/windows/windows.h"
19#endif
20
21using namespace lldb;
22using namespace lldb_private;
23
24HostThread
Greg Clayton807b6b32014-10-15 18:03:59 +000025ThreadLauncher::LaunchThread(llvm::StringRef name, lldb::thread_func_t thread_function, lldb::thread_arg_t thread_arg, Error *error_ptr, size_t min_stack_byte_size)
Zachary Turner39de3112014-09-09 20:54:56 +000026{
27 Error error;
28 if (error_ptr)
29 error_ptr->Clear();
30
31 // Host::ThreadCreateTrampoline will delete this pointer for us.
32 HostThreadCreateInfo *info_ptr = new HostThreadCreateInfo(name.data(), thread_function, thread_arg);
33 lldb::thread_t thread;
34#ifdef _WIN32
35 thread = (lldb::thread_t)::_beginthreadex(0, 0, HostNativeThread::ThreadCreateTrampoline, info_ptr, 0, NULL);
36 if (thread == (lldb::thread_t)(-1L))
37 error.SetError(::GetLastError(), eErrorTypeWin32);
38#else
Greg Clayton807b6b32014-10-15 18:03:59 +000039
40 pthread_attr_t *thread_attr_ptr = NULL;
41 pthread_attr_t thread_attr;
42 bool destroy_attr = false;
43 if (min_stack_byte_size > 0)
44 {
45 if (::pthread_attr_init (&thread_attr) == 0)
46 {
47 destroy_attr = true;
48 size_t default_min_stack_byte_size = 0;
49 if (::pthread_attr_getstacksize(&thread_attr, &default_min_stack_byte_size) == 0)
50 {
51 if (default_min_stack_byte_size < min_stack_byte_size)
52 {
53 if (::pthread_attr_setstacksize (&thread_attr, min_stack_byte_size) == 0)
54 thread_attr_ptr = &thread_attr;
55 }
56 }
57
58 }
59 }
60 int err = ::pthread_create(&thread, thread_attr_ptr, HostNativeThread::ThreadCreateTrampoline, info_ptr);
61
62 if (destroy_attr)
63 ::pthread_attr_destroy(&thread_attr);
64
Zachary Turner39de3112014-09-09 20:54:56 +000065 error.SetError(err, eErrorTypePOSIX);
66#endif
67 if (error_ptr)
68 *error_ptr = error;
69 if (!error.Success())
70 thread = LLDB_INVALID_HOST_THREAD;
71
72 return HostThread(thread);
73}