1 //===-- 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 
21 using namespace lldb;
22 using namespace lldb_private;
23 
24 HostThread
25 ThreadLauncher::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)
26 {
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
39 
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 
65     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 }
74