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" 12b9c1b51eSKate Stone #include "lldb/Host/FileSpec.h" 1330fdc8d8SChris Lattner #include "lldb/Host/Host.h" 1442ff0ad8SZachary Turner #include "lldb/Host/HostInfo.h" 15c3018992SZachary Turner #include "lldb/Host/HostNativeThread.h" 1639de3110SZachary Turner #include "lldb/Host/HostThread.h" 1739de3110SZachary Turner #include "lldb/Host/ThreadLauncher.h" 18*6f9e6901SZachary Turner #include "lldb/Utility/Log.h" 1939de3110SZachary Turner 207eafdcedSPavel Labath #include "llvm/ADT/SmallString.h" 21b9c1b51eSKate Stone #include "llvm/Support/Path.h" 22878ae018SJason Molenda 2330fdc8d8SChris Lattner using namespace lldb; 2430fdc8d8SChris Lattner using namespace lldb_private; 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBFileSpec SBHostOS::GetProgramFileSpec() { 2730fdc8d8SChris Lattner SBFileSpec sb_filespec; 28a21fee0eSZachary Turner sb_filespec.SetFileSpec(HostInfo::GetProgramFileSpec()); 2930fdc8d8SChris Lattner return sb_filespec; 3030fdc8d8SChris Lattner } 3130fdc8d8SChris Lattner 32b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPythonPath() { 33e2231ac7SJim Ingham SBFileSpec sb_lldb_python_filespec; 34e2231ac7SJim Ingham FileSpec lldb_python_spec; 35b9c1b51eSKate Stone if (HostInfo::GetLLDBPath(ePathTypePythonDir, lldb_python_spec)) { 36e2231ac7SJim Ingham sb_lldb_python_filespec.SetFileSpec(lldb_python_spec); 37e2231ac7SJim Ingham } 38e2231ac7SJim Ingham return sb_lldb_python_filespec; 39e2231ac7SJim Ingham } 40e2231ac7SJim Ingham 41b9c1b51eSKate Stone SBFileSpec SBHostOS::GetLLDBPath(lldb::PathType path_type) { 4206357c93SGreg Clayton SBFileSpec sb_fspec; 4306357c93SGreg Clayton FileSpec fspec; 4442ff0ad8SZachary Turner if (HostInfo::GetLLDBPath(path_type, fspec)) 4506357c93SGreg Clayton sb_fspec.SetFileSpec(fspec); 4606357c93SGreg Clayton return sb_fspec; 4706357c93SGreg Clayton } 4806357c93SGreg Clayton 49b9c1b51eSKate Stone SBFileSpec SBHostOS::GetUserHomeDirectory() { 50878ae018SJason Molenda SBFileSpec sb_fspec; 51878ae018SJason Molenda 52878ae018SJason Molenda llvm::SmallString<64> home_dir_path; 53878ae018SJason Molenda llvm::sys::path::home_directory(home_dir_path); 54878ae018SJason Molenda FileSpec homedir(home_dir_path.c_str(), true); 55878ae018SJason Molenda 56878ae018SJason Molenda sb_fspec.SetFileSpec(homedir); 57878ae018SJason Molenda return sb_fspec; 58878ae018SJason Molenda } 59878ae018SJason Molenda 60b9c1b51eSKate Stone lldb::thread_t SBHostOS::ThreadCreate(const char *name, 6199fbc076SDeepak Panickal lldb::thread_func_t thread_function, 62b9c1b51eSKate Stone void *thread_arg, SBError *error_ptr) { 635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 64ceb6b139SCaroline Tice 65ceb6b139SCaroline Tice if (log) 66b9c1b51eSKate Stone log->Printf( 67b9c1b51eSKate Stone "SBHostOS::ThreadCreate (name=\"%s\", thread_function=%p, " 68b9c1b51eSKate Stone "thread_arg=%p, error_ptr=%p)", 69b9c1b51eSKate Stone name, 70b9c1b51eSKate Stone reinterpret_cast<void *>(reinterpret_cast<intptr_t>(thread_function)), 71b9c1b51eSKate Stone static_cast<void *>(thread_arg), static_cast<void *>(error_ptr)); 72ceb6b139SCaroline Tice 73c1338e8dSCaroline Tice // FIXME: You should log the return value? 74ceb6b139SCaroline Tice 75b9c1b51eSKate Stone HostThread thread(ThreadLauncher::LaunchThread( 76b9c1b51eSKate Stone name, thread_function, thread_arg, error_ptr ? error_ptr->get() : NULL)); 7739de3110SZachary Turner return thread.Release(); 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 80b9c1b51eSKate Stone void SBHostOS::ThreadCreated(const char *name) {} 8130fdc8d8SChris Lattner 82b9c1b51eSKate Stone bool SBHostOS::ThreadCancel(lldb::thread_t thread, SBError *error_ptr) { 8339de3110SZachary Turner Error error; 8439de3110SZachary Turner HostThread host_thread(thread); 8539de3110SZachary Turner error = host_thread.Cancel(); 8639de3110SZachary Turner if (error_ptr) 8739de3110SZachary Turner error_ptr->SetError(error); 8839de3110SZachary Turner host_thread.Release(); 8939de3110SZachary Turner return error.Success(); 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 92b9c1b51eSKate Stone bool SBHostOS::ThreadDetach(lldb::thread_t thread, SBError *error_ptr) { 9339de3110SZachary Turner Error error; 9439de3110SZachary Turner #if defined(_WIN32) 9539de3110SZachary Turner if (error_ptr) 9639de3110SZachary Turner error_ptr->SetErrorString("ThreadDetach is not supported on this platform"); 9739de3110SZachary Turner #else 9839de3110SZachary Turner HostThread host_thread(thread); 99c3018992SZachary Turner error = host_thread.GetNativeThread().Detach(); 10039de3110SZachary Turner if (error_ptr) 10139de3110SZachary Turner error_ptr->SetError(error); 10239de3110SZachary Turner host_thread.Release(); 10339de3110SZachary Turner #endif 10439de3110SZachary Turner return error.Success(); 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 107b9c1b51eSKate Stone bool SBHostOS::ThreadJoin(lldb::thread_t thread, lldb::thread_result_t *result, 108b9c1b51eSKate Stone SBError *error_ptr) { 10939de3110SZachary Turner Error error; 11039de3110SZachary Turner HostThread host_thread(thread); 11139de3110SZachary Turner error = host_thread.Join(result); 11239de3110SZachary Turner if (error_ptr) 11339de3110SZachary Turner error_ptr->SetError(error); 11439de3110SZachary Turner host_thread.Release(); 11539de3110SZachary Turner return error.Success(); 11630fdc8d8SChris Lattner } 117