130fdc8d8SChris Lattner //===-- SBHostOS.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBHostOS.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBError.h"
1253239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
13ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1430fdc8d8SChris Lattner #include "lldb/Host/Host.h"
1542ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h"
16c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h"
1739de3110SZachary Turner #include "lldb/Host/HostThread.h"
1839de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h"
1939de3110SZachary Turner 
20878ae018SJason Molenda #include "llvm/Support/Path.h"
21*7eafdcedSPavel Labath #include "llvm/ADT/SmallString.h"
22878ae018SJason Molenda 
2330fdc8d8SChris Lattner using namespace lldb;
2430fdc8d8SChris Lattner using namespace lldb_private;
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBFileSpec
2930fdc8d8SChris Lattner SBHostOS::GetProgramFileSpec ()
3030fdc8d8SChris Lattner {
3130fdc8d8SChris Lattner     SBFileSpec sb_filespec;
32a21fee0eSZachary Turner     sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec());
3330fdc8d8SChris Lattner     return sb_filespec;
3430fdc8d8SChris Lattner }
3530fdc8d8SChris Lattner 
36e2231ac7SJim Ingham SBFileSpec
37e2231ac7SJim Ingham SBHostOS::GetLLDBPythonPath ()
38e2231ac7SJim Ingham {
39e2231ac7SJim Ingham     SBFileSpec sb_lldb_python_filespec;
40e2231ac7SJim Ingham     FileSpec lldb_python_spec;
4142ff0ad8SZachary Turner     if (HostInfo::GetLLDBPath(ePathTypePythonDir, lldb_python_spec))
42e2231ac7SJim Ingham     {
43e2231ac7SJim Ingham         sb_lldb_python_filespec.SetFileSpec (lldb_python_spec);
44e2231ac7SJim Ingham     }
45e2231ac7SJim Ingham     return sb_lldb_python_filespec;
46e2231ac7SJim Ingham }
47e2231ac7SJim Ingham 
4806357c93SGreg Clayton 
4906357c93SGreg Clayton SBFileSpec
5006357c93SGreg Clayton SBHostOS::GetLLDBPath (lldb::PathType path_type)
5106357c93SGreg Clayton {
5206357c93SGreg Clayton     SBFileSpec sb_fspec;
5306357c93SGreg Clayton     FileSpec fspec;
5442ff0ad8SZachary Turner     if (HostInfo::GetLLDBPath(path_type, fspec))
5506357c93SGreg Clayton         sb_fspec.SetFileSpec (fspec);
5606357c93SGreg Clayton     return sb_fspec;
5706357c93SGreg Clayton }
5806357c93SGreg Clayton 
59878ae018SJason Molenda SBFileSpec
60878ae018SJason Molenda SBHostOS::GetUserHomeDirectory ()
61878ae018SJason Molenda {
62878ae018SJason Molenda     SBFileSpec sb_fspec;
63878ae018SJason Molenda 
64878ae018SJason Molenda     llvm::SmallString<64> home_dir_path;
65878ae018SJason Molenda     llvm::sys::path::home_directory (home_dir_path);
66878ae018SJason Molenda     FileSpec homedir (home_dir_path.c_str(), true);
67878ae018SJason Molenda 
68878ae018SJason Molenda     sb_fspec.SetFileSpec (homedir);
69878ae018SJason Molenda     return sb_fspec;
70878ae018SJason Molenda }
71878ae018SJason Molenda 
7230fdc8d8SChris Lattner lldb::thread_t
7330fdc8d8SChris Lattner SBHostOS::ThreadCreate
7430fdc8d8SChris Lattner (
7530fdc8d8SChris Lattner     const char *name,
7699fbc076SDeepak Panickal     lldb::thread_func_t thread_function,
7730fdc8d8SChris Lattner     void *thread_arg,
7830fdc8d8SChris Lattner     SBError *error_ptr
7930fdc8d8SChris Lattner )
8030fdc8d8SChris Lattner {
815160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
82ceb6b139SCaroline Tice 
83ceb6b139SCaroline Tice     if (log)
84324a1036SSaleem Abdulrasool         log->Printf ("SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, thread_arg=%p, error_ptr=%p)",
85702c1d09SDavid Majnemer                      name, reinterpret_cast<void*>(reinterpret_cast<intptr_t>(thread_function)),
86324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_arg),
87324a1036SSaleem Abdulrasool                      static_cast<void*>(error_ptr));
88ceb6b139SCaroline Tice 
89c1338e8dSCaroline Tice     // FIXME: You should log the return value?
90ceb6b139SCaroline Tice 
9139de3110SZachary Turner     HostThread thread(ThreadLauncher::LaunchThread(name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL));
9239de3110SZachary Turner     return thread.Release();
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
9530fdc8d8SChris Lattner void
9630fdc8d8SChris Lattner SBHostOS::ThreadCreated (const char *name)
9730fdc8d8SChris Lattner {
9830fdc8d8SChris Lattner }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner bool
10130fdc8d8SChris Lattner SBHostOS::ThreadCancel (lldb::thread_t thread, SBError *error_ptr)
10230fdc8d8SChris Lattner {
10339de3110SZachary Turner     Error error;
10439de3110SZachary Turner     HostThread host_thread(thread);
10539de3110SZachary Turner     error = host_thread.Cancel();
10639de3110SZachary Turner     if (error_ptr)
10739de3110SZachary Turner         error_ptr->SetError(error);
10839de3110SZachary Turner     host_thread.Release();
10939de3110SZachary Turner     return error.Success();
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner bool
11330fdc8d8SChris Lattner SBHostOS::ThreadDetach (lldb::thread_t thread, SBError *error_ptr)
11430fdc8d8SChris Lattner {
11539de3110SZachary Turner     Error error;
11639de3110SZachary Turner #if defined(_WIN32)
11739de3110SZachary Turner     if (error_ptr)
11839de3110SZachary Turner         error_ptr->SetErrorString("ThreadDetach is not supported on this platform");
11939de3110SZachary Turner #else
12039de3110SZachary Turner     HostThread host_thread(thread);
121c3018992SZachary Turner     error = host_thread.GetNativeThread().Detach();
12239de3110SZachary Turner     if (error_ptr)
12339de3110SZachary Turner         error_ptr->SetError(error);
12439de3110SZachary Turner     host_thread.Release();
12539de3110SZachary Turner #endif
12639de3110SZachary Turner     return error.Success();
12730fdc8d8SChris Lattner }
12830fdc8d8SChris Lattner 
12930fdc8d8SChris Lattner bool
13099fbc076SDeepak Panickal SBHostOS::ThreadJoin (lldb::thread_t thread, lldb::thread_result_t *result, SBError *error_ptr)
13130fdc8d8SChris Lattner {
13239de3110SZachary Turner     Error error;
13339de3110SZachary Turner     HostThread host_thread(thread);
13439de3110SZachary Turner     error = host_thread.Join(result);
13539de3110SZachary Turner     if (error_ptr)
13639de3110SZachary Turner         error_ptr->SetError(error);
13739de3110SZachary Turner     host_thread.Release();
13839de3110SZachary Turner     return error.Success();
13930fdc8d8SChris Lattner }
14030fdc8d8SChris Lattner 
14130fdc8d8SChris Lattner 
142