]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/API/SBHostOS.cpp
Merge ^/head r305892 through r306302.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / API / SBHostOS.cpp
1 //===-- SBHostOS.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 #include "lldb/API/SBHostOS.h"
11 #include "lldb/API/SBError.h"
12 #include "lldb/Host/FileSpec.h"
13 #include "lldb/Core/Log.h"
14 #include "lldb/Host/Host.h"
15 #include "lldb/Host/HostInfo.h"
16 #include "lldb/Host/HostNativeThread.h"
17 #include "lldb/Host/HostThread.h"
18 #include "lldb/Host/ThreadLauncher.h"
19
20 #include "llvm/Support/Path.h"
21 #include "llvm/ADT/SmallString.h"
22
23 using namespace lldb;
24 using namespace lldb_private;
25
26
27
28 SBFileSpec
29 SBHostOS::GetProgramFileSpec ()
30 {
31     SBFileSpec sb_filespec;
32     sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
33     return sb_filespec;
34 }
35
36 SBFileSpec
37 SBHostOS::GetLLDBPythonPath ()
38 {
39     SBFileSpec sb_lldb_python_filespec;
40     FileSpec lldb_python_spec;
41     if (HostInfo::GetLLDBPath(ePathTypePythonDir, lldb_python_spec))
42     {
43         sb_lldb_python_filespec.SetFileSpec (lldb_python_spec);
44     }
45     return sb_lldb_python_filespec;
46 }
47
48
49 SBFileSpec
50 SBHostOS::GetLLDBPath (lldb::PathType path_type)
51 {
52     SBFileSpec sb_fspec;
53     FileSpec fspec;
54     if (HostInfo::GetLLDBPath(path_type, fspec))
55         sb_fspec.SetFileSpec (fspec);
56     return sb_fspec;
57 }
58
59 SBFileSpec
60 SBHostOS::GetUserHomeDirectory ()
61 {
62     SBFileSpec sb_fspec;
63
64     llvm::SmallString<64> home_dir_path;
65     llvm::sys::path::home_directory (home_dir_path);
66     FileSpec homedir (home_dir_path.c_str(), true);
67
68     sb_fspec.SetFileSpec (homedir);
69     return sb_fspec;
70 }
71
72 lldb::thread_t
73 SBHostOS::ThreadCreate
74 (
75     const char *name,
76     lldb::thread_func_t thread_function,
77     void *thread_arg,
78     SBError *error_ptr
79 )
80 {
81     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
82
83     if (log)
84         log->Printf ("SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, thread_arg=%p, error_ptr=%p)",
85                      name, reinterpret_cast<void*>(reinterpret_cast<intptr_t>(thread_function)),
86                      static_cast<void*>(thread_arg),
87                      static_cast<void*>(error_ptr));
88
89     // FIXME: You should log the return value?
90
91     HostThread thread(ThreadLauncher::LaunchThread(name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL));
92     return thread.Release();
93 }
94
95 void
96 SBHostOS::ThreadCreated (const char *name)
97 {
98 }
99
100 bool
101 SBHostOS::ThreadCancel (lldb::thread_t thread, SBError *error_ptr)
102 {
103     Error error;
104     HostThread host_thread(thread);
105     error = host_thread.Cancel();
106     if (error_ptr)
107         error_ptr->SetError(error);
108     host_thread.Release();
109     return error.Success();
110 }
111
112 bool
113 SBHostOS::ThreadDetach (lldb::thread_t thread, SBError *error_ptr)
114 {
115     Error error;
116 #if defined(_WIN32)
117     if (error_ptr)
118         error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
119 #else
120     HostThread host_thread(thread);
121     error = host_thread.GetNativeThread().Detach();
122     if (error_ptr)
123         error_ptr->SetError(error);
124     host_thread.Release();
125 #endif
126     return error.Success();
127 }
128
129 bool
130 SBHostOS::ThreadJoin (lldb::thread_t thread, lldb::thread_result_t *result, SBError *error_ptr)
131 {
132     Error error;
133     HostThread host_thread(thread);
134     error = host_thread.Join(result);
135     if (error_ptr)
136         error_ptr->SetError(error);
137     host_thread.Release();
138     return error.Success();
139 }
140
141