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