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/HostThread.h"
17 #include "lldb/Host/ThreadLauncher.h"
18 
19 #if !defined(_WIN32)
20 #include "lldb/Host/HostNativeThread.h"
21 #endif
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 lldb::thread_t
60 SBHostOS::ThreadCreate
61 (
62     const char *name,
63     lldb::thread_func_t thread_function,
64     void *thread_arg,
65     SBError *error_ptr
66 )
67 {
68     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
69 
70     if (log)
71         log->Printf ("SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, thread_arg=%p, error_ptr=%p)",
72                      name, reinterpret_cast<void*>(reinterpret_cast<intptr_t>(thread_function)),
73                      static_cast<void*>(thread_arg),
74                      static_cast<void*>(error_ptr));
75 
76     // FIXME: You should log the return value?
77 
78     HostThread thread(ThreadLauncher::LaunchThread(name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL));
79     return thread.Release();
80 }
81 
82 void
83 SBHostOS::ThreadCreated (const char *name)
84 {
85 }
86 
87 bool
88 SBHostOS::ThreadCancel (lldb::thread_t thread, SBError *error_ptr)
89 {
90     Error error;
91     HostThread host_thread(thread);
92     error = host_thread.Cancel();
93     if (error_ptr)
94         error_ptr->SetError(error);
95     host_thread.Release();
96     return error.Success();
97 }
98 
99 bool
100 SBHostOS::ThreadDetach (lldb::thread_t thread, SBError *error_ptr)
101 {
102     Error error;
103 #if defined(_WIN32)
104     if (error_ptr)
105         error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
106 #else
107     HostThread host_thread(thread);
108     error = ((HostThreadPosix &)host_thread.GetNativeThread()).Detach();
109     if (error_ptr)
110         error_ptr->SetError(error);
111     host_thread.Release();
112 #endif
113     return error.Success();
114 }
115 
116 bool
117 SBHostOS::ThreadJoin (lldb::thread_t thread, lldb::thread_result_t *result, SBError *error_ptr)
118 {
119     Error error;
120     HostThread host_thread(thread);
121     error = host_thread.Join(result);
122     if (error_ptr)
123         error_ptr->SetError(error);
124     host_thread.Release();
125     return error.Success();
126 }
127 
128 
129