130fdc8d8SChris Lattner //===-- SBProcess.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 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1330fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1430fdc8d8SChris Lattner 1540af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 17ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 181f746071SGreg Clayton #include "lldb/Core/Module.h" 1930fdc8d8SChris Lattner #include "lldb/Core/State.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 246611103cSGreg Clayton #include "lldb/Target/Target.h" 256611103cSGreg Clayton #include "lldb/Target/Thread.h" 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner // Project includes 2830fdc8d8SChris Lattner 294c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 304c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 310e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 324c5de699SEli Friedman #include "lldb/API/SBEvent.h" 330e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 344c5de699SEli Friedman #include "lldb/API/SBThread.h" 35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 364c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 4230fdc8d8SChris Lattner SBProcess::SBProcess () : 434e0fe8abSGreg Clayton m_opaque_wp() 4430fdc8d8SChris Lattner { 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner //---------------------------------------------------------------------- 4930fdc8d8SChris Lattner // SBProcess constructor 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 534e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 594e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 63efabb123SGreg Clayton const SBProcess& 64efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 65efabb123SGreg Clayton { 66efabb123SGreg Clayton if (this != &rhs) 674e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 68efabb123SGreg Clayton return *this; 69efabb123SGreg Clayton } 70efabb123SGreg Clayton 7130fdc8d8SChris Lattner //---------------------------------------------------------------------- 7230fdc8d8SChris Lattner // Destructor 7330fdc8d8SChris Lattner //---------------------------------------------------------------------- 7430fdc8d8SChris Lattner SBProcess::~SBProcess() 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 784bddaeb5SJim Ingham const char * 794bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 804bddaeb5SJim Ingham { 814bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 824bddaeb5SJim Ingham } 834bddaeb5SJim Ingham 84d7b30ef9SJim Ingham const char * 85d7b30ef9SJim Ingham SBProcess::GetPluginName () 86d7b30ef9SJim Ingham { 87d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 88d7b30ef9SJim Ingham if (process_sp) 89d7b30ef9SJim Ingham { 90d7b30ef9SJim Ingham return process_sp->GetPluginName(); 91d7b30ef9SJim Ingham } 92d7b30ef9SJim Ingham return "<Unknown>"; 93d7b30ef9SJim Ingham } 94d7b30ef9SJim Ingham 95d7b30ef9SJim Ingham const char * 96d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 97d7b30ef9SJim Ingham { 98d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 99d7b30ef9SJim Ingham if (process_sp) 100d7b30ef9SJim Ingham { 101d7b30ef9SJim Ingham return process_sp->GetShortPluginName(); 102d7b30ef9SJim Ingham } 103d7b30ef9SJim Ingham return "<Unknown>"; 104d7b30ef9SJim Ingham } 105d7b30ef9SJim Ingham 106d7b30ef9SJim Ingham 107b9556accSGreg Clayton lldb::ProcessSP 108b9556accSGreg Clayton SBProcess::GetSP() const 109b9556accSGreg Clayton { 1104e0fe8abSGreg Clayton return m_opaque_wp.lock(); 111b9556accSGreg Clayton } 112b9556accSGreg Clayton 11330fdc8d8SChris Lattner void 114b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 11530fdc8d8SChris Lattner { 1164e0fe8abSGreg Clayton m_opaque_wp = process_sp; 11730fdc8d8SChris Lattner } 11830fdc8d8SChris Lattner 11930fdc8d8SChris Lattner void 12030fdc8d8SChris Lattner SBProcess::Clear () 12130fdc8d8SChris Lattner { 1224e0fe8abSGreg Clayton m_opaque_wp.reset(); 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner bool 12730fdc8d8SChris Lattner SBProcess::IsValid() const 12830fdc8d8SChris Lattner { 1294fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1304fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 1339631aae2SJames McIlree bool 1349631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1359631aae2SJames McIlree char const **envp, 1369631aae2SJames McIlree const char *stdin_path, 1379631aae2SJames McIlree const char *stdout_path, 1389631aae2SJames McIlree const char *stderr_path, 1399631aae2SJames McIlree const char *working_directory, 1409631aae2SJames McIlree uint32_t launch_flags, 1419631aae2SJames McIlree bool stop_at_entry, 1429631aae2SJames McIlree lldb::SBError& error) 1439631aae2SJames McIlree { 1449631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1459631aae2SJames McIlree if (log) { 1469631aae2SJames McIlree log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 1474e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1489631aae2SJames McIlree argv, 1499631aae2SJames McIlree envp, 1509631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1519631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1529631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1539631aae2SJames McIlree working_directory ? working_directory : "NULL", 1549631aae2SJames McIlree launch_flags, 1559631aae2SJames McIlree stop_at_entry, 1569631aae2SJames McIlree error.get()); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree 159acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 160acdbe816SGreg Clayton if (process_sp) 1619631aae2SJames McIlree { 162acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 163acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1649631aae2SJames McIlree { 165982c9762SGreg Clayton if (stop_at_entry) 166982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 167982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 168982c9762SGreg Clayton stdout_path, 169982c9762SGreg Clayton stderr_path, 170982c9762SGreg Clayton working_directory, 171982c9762SGreg Clayton launch_flags); 172acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 173982c9762SGreg Clayton if (exe_module) 174982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 175982c9762SGreg Clayton if (argv) 176982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 177982c9762SGreg Clayton if (envp) 178982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 179acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1809631aae2SJames McIlree } 1819631aae2SJames McIlree else 1829631aae2SJames McIlree { 1839631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1849631aae2SJames McIlree } 1859631aae2SJames McIlree } 1869631aae2SJames McIlree else 1879631aae2SJames McIlree { 1889631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree 1919631aae2SJames McIlree if (log) { 1929631aae2SJames McIlree SBStream sstr; 1939631aae2SJames McIlree error.GetDescription (sstr); 194acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1959631aae2SJames McIlree } 1969631aae2SJames McIlree 1979631aae2SJames McIlree return error.Success(); 1989631aae2SJames McIlree } 1999631aae2SJames McIlree 2009631aae2SJames McIlree bool 2019631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2029631aae2SJames McIlree { 203acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 204acdbe816SGreg Clayton if (process_sp) 2059631aae2SJames McIlree { 206acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 207acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2089631aae2SJames McIlree { 209144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 210144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 211acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2129631aae2SJames McIlree } 2139631aae2SJames McIlree else 2149631aae2SJames McIlree { 2159631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2169631aae2SJames McIlree } 2179631aae2SJames McIlree } 2189631aae2SJames McIlree else 2199631aae2SJames McIlree { 2209631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2219631aae2SJames McIlree } 2229631aae2SJames McIlree 2239631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2249631aae2SJames McIlree if (log) { 2259631aae2SJames McIlree SBStream sstr; 2269631aae2SJames McIlree error.GetDescription (sstr); 227*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2289631aae2SJames McIlree } 2299631aae2SJames McIlree 2309631aae2SJames McIlree return error.Success(); 2319631aae2SJames McIlree } 2329631aae2SJames McIlree 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner uint32_t 23530fdc8d8SChris Lattner SBProcess::GetNumThreads () 23630fdc8d8SChris Lattner { 2372d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 238ceb6b139SCaroline Tice 239ceb6b139SCaroline Tice uint32_t num_threads = 0; 240acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 241acdbe816SGreg Clayton if (process_sp) 24230fdc8d8SChris Lattner { 2437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2447fdf9ef1SGreg Clayton 2457fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 246acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 247acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 24830fdc8d8SChris Lattner } 249ceb6b139SCaroline Tice 250ceb6b139SCaroline Tice if (log) 251acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 252ceb6b139SCaroline Tice 253ceb6b139SCaroline Tice return num_threads; 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 25630fdc8d8SChris Lattner SBThread 2572976d00aSJim Ingham SBProcess::GetSelectedThread () const 25830fdc8d8SChris Lattner { 2592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 260ceb6b139SCaroline Tice 26130fdc8d8SChris Lattner SBThread sb_thread; 26217a6ad05SGreg Clayton ThreadSP thread_sp; 263acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 264acdbe816SGreg Clayton if (process_sp) 265af67cecdSGreg Clayton { 266acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 267acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 26817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 269af67cecdSGreg Clayton } 270ceb6b139SCaroline Tice 271ceb6b139SCaroline Tice if (log) 272ceb6b139SCaroline Tice { 273acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 274ceb6b139SCaroline Tice } 275ceb6b139SCaroline Tice 27630fdc8d8SChris Lattner return sb_thread; 27730fdc8d8SChris Lattner } 27830fdc8d8SChris Lattner 27930fdc8d8SChris Lattner SBTarget 28030fdc8d8SChris Lattner SBProcess::GetTarget() const 28130fdc8d8SChris Lattner { 2822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 283ceb6b139SCaroline Tice 28430fdc8d8SChris Lattner SBTarget sb_target; 285b9556accSGreg Clayton TargetSP target_sp; 286acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 287acdbe816SGreg Clayton if (process_sp) 288b9556accSGreg Clayton { 289acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 290b9556accSGreg Clayton sb_target.SetSP (target_sp); 291b9556accSGreg Clayton } 292ceb6b139SCaroline Tice 293ceb6b139SCaroline Tice if (log) 294acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 295ceb6b139SCaroline Tice 29630fdc8d8SChris Lattner return sb_target; 29730fdc8d8SChris Lattner } 29830fdc8d8SChris Lattner 29930fdc8d8SChris Lattner 30030fdc8d8SChris Lattner size_t 30130fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 30230fdc8d8SChris Lattner { 3032d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 304ceb6b139SCaroline Tice 305ceb6b139SCaroline Tice size_t ret_val = 0; 306acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 307acdbe816SGreg Clayton if (process_sp) 30830fdc8d8SChris Lattner { 30930fdc8d8SChris Lattner Error error; 310acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 31130fdc8d8SChris Lattner } 312ceb6b139SCaroline Tice 313ceb6b139SCaroline Tice if (log) 314fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 315acdbe816SGreg Clayton process_sp.get(), 31693aa84e8SGreg Clayton src, 31793aa84e8SGreg Clayton (uint32_t) src_len, 31893aa84e8SGreg Clayton ret_val); 319ceb6b139SCaroline Tice 320ceb6b139SCaroline Tice return ret_val; 32130fdc8d8SChris Lattner } 32230fdc8d8SChris Lattner 32330fdc8d8SChris Lattner size_t 32430fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 32530fdc8d8SChris Lattner { 326cfd1acedSGreg Clayton size_t bytes_read = 0; 327acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 328acdbe816SGreg Clayton if (process_sp) 32930fdc8d8SChris Lattner { 33030fdc8d8SChris Lattner Error error; 331acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 33230fdc8d8SChris Lattner } 333ceb6b139SCaroline Tice 3342d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 335ceb6b139SCaroline Tice if (log) 336*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 33743e0af06SGreg Clayton process_sp.get(), 33843e0af06SGreg Clayton (int) bytes_read, 33943e0af06SGreg Clayton dst, 34043e0af06SGreg Clayton (uint64_t)dst_len, 34143e0af06SGreg Clayton (uint64_t)bytes_read); 342ceb6b139SCaroline Tice 343cfd1acedSGreg Clayton return bytes_read; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner size_t 34730fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 34830fdc8d8SChris Lattner { 349cfd1acedSGreg Clayton size_t bytes_read = 0; 350acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 351acdbe816SGreg Clayton if (process_sp) 35230fdc8d8SChris Lattner { 35330fdc8d8SChris Lattner Error error; 354acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 35530fdc8d8SChris Lattner } 356ceb6b139SCaroline Tice 3572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 358ceb6b139SCaroline Tice if (log) 359*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 36043e0af06SGreg Clayton process_sp.get(), 36143e0af06SGreg Clayton (int) bytes_read, 36243e0af06SGreg Clayton dst, 36343e0af06SGreg Clayton (uint64_t)dst_len, 36443e0af06SGreg Clayton (uint64_t)bytes_read); 365ceb6b139SCaroline Tice 366cfd1acedSGreg Clayton return bytes_read; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369ab3b8b22SHan Ming Ong size_t 370ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 371ab3b8b22SHan Ming Ong { 372ab3b8b22SHan Ming Ong size_t bytes_read = 0; 373ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 374ab3b8b22SHan Ming Ong if (process_sp) 375ab3b8b22SHan Ming Ong { 376ab3b8b22SHan Ming Ong Error error; 377ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 378ab3b8b22SHan Ming Ong } 379ab3b8b22SHan Ming Ong 380ab3b8b22SHan Ming Ong LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 381ab3b8b22SHan Ming Ong if (log) 382*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 383ab3b8b22SHan Ming Ong process_sp.get(), 384ab3b8b22SHan Ming Ong (int) bytes_read, 385ab3b8b22SHan Ming Ong dst, 386ab3b8b22SHan Ming Ong (uint64_t)dst_len, 387ab3b8b22SHan Ming Ong (uint64_t)bytes_read); 388ab3b8b22SHan Ming Ong 389ab3b8b22SHan Ming Ong return bytes_read; 390ab3b8b22SHan Ming Ong } 391ab3b8b22SHan Ming Ong 39230fdc8d8SChris Lattner void 3932976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 39430fdc8d8SChris Lattner { 39530fdc8d8SChris Lattner if (out == NULL) 39630fdc8d8SChris Lattner return; 39730fdc8d8SChris Lattner 398acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 399acdbe816SGreg Clayton if (process_sp) 40030fdc8d8SChris Lattner { 40130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 40230fdc8d8SChris Lattner char message[1024]; 40330fdc8d8SChris Lattner int message_len = ::snprintf (message, 40430fdc8d8SChris Lattner sizeof (message), 405*d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 406acdbe816SGreg Clayton process_sp->GetID(), 40730fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner if (message_len > 0) 41030fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner 41430fdc8d8SChris Lattner void 4152976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 41630fdc8d8SChris Lattner { 417acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 418acdbe816SGreg Clayton if (process_sp) 41930fdc8d8SChris Lattner { 42030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 42130fdc8d8SChris Lattner char message[1024]; 42230fdc8d8SChris Lattner ::snprintf (message, 42330fdc8d8SChris Lattner sizeof (message), 424*d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 425acdbe816SGreg Clayton process_sp->GetID(), 42630fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner result.AppendMessage (message); 42930fdc8d8SChris Lattner } 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner bool 4332976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 43430fdc8d8SChris Lattner { 435acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 436acdbe816SGreg Clayton if (process_sp) 437af67cecdSGreg Clayton { 438acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 439acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 440af67cecdSGreg Clayton } 44130fdc8d8SChris Lattner return false; 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner bool 445ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 446ea561dcfSGreg Clayton { 4472d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 448ceb6b139SCaroline Tice 449ceb6b139SCaroline Tice bool ret_val = false; 450acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 451acdbe816SGreg Clayton if (process_sp) 452af67cecdSGreg Clayton { 453acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 454acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 455af67cecdSGreg Clayton } 456ceb6b139SCaroline Tice 457ceb6b139SCaroline Tice if (log) 458*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 459acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 460ceb6b139SCaroline Tice 461ceb6b139SCaroline Tice return ret_val; 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner 46418b46896SJim Ingham bool 46518b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 46618b46896SJim Ingham { 46718b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46818b46896SJim Ingham 46918b46896SJim Ingham bool ret_val = false; 47018b46896SJim Ingham ProcessSP process_sp(GetSP()); 47118b46896SJim Ingham if (process_sp) 47218b46896SJim Ingham { 47318b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 47418b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 47518b46896SJim Ingham } 47618b46896SJim Ingham 47718b46896SJim Ingham if (log) 47818b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 47918b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 48018b46896SJim Ingham 48118b46896SJim Ingham return ret_val; 48218b46896SJim Ingham } 48318b46896SJim Ingham 48430fdc8d8SChris Lattner SBThread 48530fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 48630fdc8d8SChris Lattner { 4872d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 488ceb6b139SCaroline Tice 48917a6ad05SGreg Clayton SBThread sb_thread; 49017a6ad05SGreg Clayton ThreadSP thread_sp; 491acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 492acdbe816SGreg Clayton if (process_sp) 493af67cecdSGreg Clayton { 4947fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4957fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 496acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4977fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 49817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 499af67cecdSGreg Clayton } 500ceb6b139SCaroline Tice 501ceb6b139SCaroline Tice if (log) 502ceb6b139SCaroline Tice { 50393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 504acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 505ceb6b139SCaroline Tice } 506ceb6b139SCaroline Tice 50717a6ad05SGreg Clayton return sb_thread; 50830fdc8d8SChris Lattner } 50930fdc8d8SChris Lattner 51030fdc8d8SChris Lattner StateType 51130fdc8d8SChris Lattner SBProcess::GetState () 51230fdc8d8SChris Lattner { 513ceb6b139SCaroline Tice 514ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 515acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 516acdbe816SGreg Clayton if (process_sp) 517af67cecdSGreg Clayton { 518acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 519acdbe816SGreg Clayton ret_val = process_sp->GetState(); 520af67cecdSGreg Clayton } 521ceb6b139SCaroline Tice 5222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 523ceb6b139SCaroline Tice if (log) 524cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 525acdbe816SGreg Clayton process_sp.get(), 526750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 527ceb6b139SCaroline Tice 528ceb6b139SCaroline Tice return ret_val; 52930fdc8d8SChris Lattner } 53030fdc8d8SChris Lattner 53130fdc8d8SChris Lattner 53230fdc8d8SChris Lattner int 53330fdc8d8SChris Lattner SBProcess::GetExitStatus () 53430fdc8d8SChris Lattner { 5354838131bSGreg Clayton int exit_status = 0; 536acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 537acdbe816SGreg Clayton if (process_sp) 538af67cecdSGreg Clayton { 539acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 540acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 541af67cecdSGreg Clayton } 5422d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5434838131bSGreg Clayton if (log) 5444838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 545acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5464838131bSGreg Clayton 5474838131bSGreg Clayton return exit_status; 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner 55030fdc8d8SChris Lattner const char * 55130fdc8d8SChris Lattner SBProcess::GetExitDescription () 55230fdc8d8SChris Lattner { 5534838131bSGreg Clayton const char *exit_desc = NULL; 554acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 555acdbe816SGreg Clayton if (process_sp) 556af67cecdSGreg Clayton { 557acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 558acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 559af67cecdSGreg Clayton } 5602d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5614838131bSGreg Clayton if (log) 5624838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 563acdbe816SGreg Clayton process_sp.get(), exit_desc); 5644838131bSGreg Clayton return exit_desc; 56530fdc8d8SChris Lattner } 56630fdc8d8SChris Lattner 56730fdc8d8SChris Lattner lldb::pid_t 56830fdc8d8SChris Lattner SBProcess::GetProcessID () 56930fdc8d8SChris Lattner { 570ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 571acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 572acdbe816SGreg Clayton if (process_sp) 573acdbe816SGreg Clayton ret_val = process_sp->GetID(); 574ceb6b139SCaroline Tice 5752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 576ceb6b139SCaroline Tice if (log) 577*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val); 578ceb6b139SCaroline Tice 579ceb6b139SCaroline Tice return ret_val; 58030fdc8d8SChris Lattner } 58130fdc8d8SChris Lattner 582cf386e24SJohnny Chen ByteOrder 583cf386e24SJohnny Chen SBProcess::GetByteOrder () const 584cf386e24SJohnny Chen { 585cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 586acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 587acdbe816SGreg Clayton if (process_sp) 588acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 589cf386e24SJohnny Chen 590cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 591cf386e24SJohnny Chen if (log) 592acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 593cf386e24SJohnny Chen 594cf386e24SJohnny Chen return byteOrder; 595cf386e24SJohnny Chen } 596cf386e24SJohnny Chen 59730fdc8d8SChris Lattner uint32_t 59830fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 59930fdc8d8SChris Lattner { 600ceb6b139SCaroline Tice uint32_t size = 0; 601acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 602acdbe816SGreg Clayton if (process_sp) 603acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 604ceb6b139SCaroline Tice 6052d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 606ceb6b139SCaroline Tice if (log) 607acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 608ceb6b139SCaroline Tice 609ceb6b139SCaroline Tice return size; 61030fdc8d8SChris Lattner } 61130fdc8d8SChris Lattner 61230fdc8d8SChris Lattner SBError 61330fdc8d8SChris Lattner SBProcess::Continue () 61430fdc8d8SChris Lattner { 6152d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 616ceb6b139SCaroline Tice 61730fdc8d8SChris Lattner SBError sb_error; 618acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6190c74e78dSGreg Clayton 620acdbe816SGreg Clayton if (log) 621acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 622acdbe816SGreg Clayton 623acdbe816SGreg Clayton if (process_sp) 624acdbe816SGreg Clayton { 625acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 626acdbe816SGreg Clayton 627acdbe816SGreg Clayton Error error (process_sp->Resume()); 6285d5028b5SGreg Clayton if (error.Success()) 6295d5028b5SGreg Clayton { 630acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 6314838131bSGreg Clayton { 6324838131bSGreg Clayton if (log) 633acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 634acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 6355d5028b5SGreg Clayton } 6364838131bSGreg Clayton } 6375d5028b5SGreg Clayton sb_error.SetError(error); 6385d5028b5SGreg Clayton } 63930fdc8d8SChris Lattner else 64030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 64130fdc8d8SChris Lattner 642ceb6b139SCaroline Tice if (log) 643ceb6b139SCaroline Tice { 644ceb6b139SCaroline Tice SBStream sstr; 645ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 646acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 647ceb6b139SCaroline Tice } 648ceb6b139SCaroline Tice 64930fdc8d8SChris Lattner return sb_error; 65030fdc8d8SChris Lattner } 65130fdc8d8SChris Lattner 65230fdc8d8SChris Lattner 65330fdc8d8SChris Lattner SBError 65430fdc8d8SChris Lattner SBProcess::Destroy () 65530fdc8d8SChris Lattner { 65630fdc8d8SChris Lattner SBError sb_error; 657acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 658acdbe816SGreg Clayton if (process_sp) 6596779606aSGreg Clayton { 660acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 661acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6626779606aSGreg Clayton } 66330fdc8d8SChris Lattner else 66430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 66530fdc8d8SChris Lattner 6662d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6674838131bSGreg Clayton if (log) 6684838131bSGreg Clayton { 6694838131bSGreg Clayton SBStream sstr; 6704838131bSGreg Clayton sb_error.GetDescription (sstr); 6716779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 672acdbe816SGreg Clayton process_sp.get(), 6736779606aSGreg Clayton sb_error.get(), 6746779606aSGreg Clayton sstr.GetData()); 6754838131bSGreg Clayton } 6764838131bSGreg Clayton 67730fdc8d8SChris Lattner return sb_error; 67830fdc8d8SChris Lattner } 67930fdc8d8SChris Lattner 68030fdc8d8SChris Lattner 68130fdc8d8SChris Lattner SBError 68230fdc8d8SChris Lattner SBProcess::Stop () 68330fdc8d8SChris Lattner { 68430fdc8d8SChris Lattner SBError sb_error; 685acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 686acdbe816SGreg Clayton if (process_sp) 687af67cecdSGreg Clayton { 688acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 689acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 690af67cecdSGreg Clayton } 69130fdc8d8SChris Lattner else 69230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 693ceb6b139SCaroline Tice 6942d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 695ceb6b139SCaroline Tice if (log) 696ceb6b139SCaroline Tice { 697ceb6b139SCaroline Tice SBStream sstr; 698ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 69993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 700acdbe816SGreg Clayton process_sp.get(), 70193aa84e8SGreg Clayton sb_error.get(), 702750cd175SCaroline Tice sstr.GetData()); 703ceb6b139SCaroline Tice } 704ceb6b139SCaroline Tice 70530fdc8d8SChris Lattner return sb_error; 70630fdc8d8SChris Lattner } 70730fdc8d8SChris Lattner 70830fdc8d8SChris Lattner SBError 70930fdc8d8SChris Lattner SBProcess::Kill () 71030fdc8d8SChris Lattner { 71130fdc8d8SChris Lattner SBError sb_error; 712acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 713acdbe816SGreg Clayton if (process_sp) 714af67cecdSGreg Clayton { 715acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 716acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 717af67cecdSGreg Clayton } 71830fdc8d8SChris Lattner else 71930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 720ceb6b139SCaroline Tice 7212d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 722ceb6b139SCaroline Tice if (log) 723ceb6b139SCaroline Tice { 724ceb6b139SCaroline Tice SBStream sstr; 725ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 72693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 727acdbe816SGreg Clayton process_sp.get(), 72893aa84e8SGreg Clayton sb_error.get(), 729750cd175SCaroline Tice sstr.GetData()); 730ceb6b139SCaroline Tice } 731ceb6b139SCaroline Tice 73230fdc8d8SChris Lattner return sb_error; 73330fdc8d8SChris Lattner } 73430fdc8d8SChris Lattner 73530fdc8d8SChris Lattner SBError 73630fdc8d8SChris Lattner SBProcess::Detach () 73730fdc8d8SChris Lattner { 73830fdc8d8SChris Lattner SBError sb_error; 739acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 740acdbe816SGreg Clayton if (process_sp) 741af67cecdSGreg Clayton { 742acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 743acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 744af67cecdSGreg Clayton } 74530fdc8d8SChris Lattner else 74630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 74730fdc8d8SChris Lattner 74830fdc8d8SChris Lattner return sb_error; 74930fdc8d8SChris Lattner } 75030fdc8d8SChris Lattner 75130fdc8d8SChris Lattner SBError 7524838131bSGreg Clayton SBProcess::Signal (int signo) 75330fdc8d8SChris Lattner { 75430fdc8d8SChris Lattner SBError sb_error; 755acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 756acdbe816SGreg Clayton if (process_sp) 757af67cecdSGreg Clayton { 758acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 759acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 760af67cecdSGreg Clayton } 76130fdc8d8SChris Lattner else 76230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7632d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7644838131bSGreg Clayton if (log) 7654838131bSGreg Clayton { 7664838131bSGreg Clayton SBStream sstr; 7674838131bSGreg Clayton sb_error.GetDescription (sstr); 7684838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 769acdbe816SGreg Clayton process_sp.get(), 7704838131bSGreg Clayton signo, 7714838131bSGreg Clayton sb_error.get(), 7724838131bSGreg Clayton sstr.GetData()); 7734838131bSGreg Clayton } 77430fdc8d8SChris Lattner return sb_error; 77530fdc8d8SChris Lattner } 77630fdc8d8SChris Lattner 777cfc0935eSJim Ingham void 778cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 779cfc0935eSJim Ingham { 780cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 781cfc0935eSJim Ingham if (process_sp) 782cfc0935eSJim Ingham { 783cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 784cfc0935eSJim Ingham } 785cfc0935eSJim Ingham } 786cfc0935eSJim Ingham 78730fdc8d8SChris Lattner SBThread 7884838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 78930fdc8d8SChris Lattner { 7904838131bSGreg Clayton SBThread sb_thread; 79117a6ad05SGreg Clayton ThreadSP thread_sp; 792acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 793acdbe816SGreg Clayton if (process_sp) 794af67cecdSGreg Clayton { 795acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7977fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7987fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 79917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 800af67cecdSGreg Clayton } 8014838131bSGreg Clayton 8022d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8034838131bSGreg Clayton if (log) 8044838131bSGreg Clayton { 805*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 806acdbe816SGreg Clayton process_sp.get(), 8074838131bSGreg Clayton tid, 80817a6ad05SGreg Clayton thread_sp.get()); 8094838131bSGreg Clayton } 8104838131bSGreg Clayton 8114838131bSGreg Clayton return sb_thread; 81230fdc8d8SChris Lattner } 81330fdc8d8SChris Lattner 81418b46896SJim Ingham SBThread 81518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 81618b46896SJim Ingham { 81718b46896SJim Ingham SBThread sb_thread; 81818b46896SJim Ingham ThreadSP thread_sp; 81918b46896SJim Ingham ProcessSP process_sp(GetSP()); 82018b46896SJim Ingham if (process_sp) 82118b46896SJim Ingham { 82218b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 82318b46896SJim Ingham Process::StopLocker stop_locker; 82418b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 82518b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 82618b46896SJim Ingham sb_thread.SetThread (thread_sp); 82718b46896SJim Ingham } 82818b46896SJim Ingham 82918b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 83018b46896SJim Ingham if (log) 83118b46896SJim Ingham { 83218b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 83318b46896SJim Ingham process_sp.get(), 83418b46896SJim Ingham index_id, 83518b46896SJim Ingham thread_sp.get()); 83618b46896SJim Ingham } 83718b46896SJim Ingham 83818b46896SJim Ingham return sb_thread; 83918b46896SJim Ingham } 84018b46896SJim Ingham 84130fdc8d8SChris Lattner StateType 84230fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 84330fdc8d8SChris Lattner { 8442d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 845ceb6b139SCaroline Tice 846ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 847ceb6b139SCaroline Tice 848ceb6b139SCaroline Tice if (log) 849cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 850750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 851ceb6b139SCaroline Tice 852ceb6b139SCaroline Tice return ret_val; 85330fdc8d8SChris Lattner } 85430fdc8d8SChris Lattner 85530fdc8d8SChris Lattner bool 85630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 85730fdc8d8SChris Lattner { 8586611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 85930fdc8d8SChris Lattner } 86030fdc8d8SChris Lattner 86130fdc8d8SChris Lattner SBProcess 86230fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 86330fdc8d8SChris Lattner { 8646611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 86530fdc8d8SChris Lattner return process; 86630fdc8d8SChris Lattner } 86730fdc8d8SChris Lattner 868e6bc6cb9SJim Ingham bool 869e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 870e6bc6cb9SJim Ingham { 8714bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 872e6bc6cb9SJim Ingham } 87330fdc8d8SChris Lattner 87430fdc8d8SChris Lattner SBBroadcaster 87530fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 87630fdc8d8SChris Lattner { 8772d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 878ceb6b139SCaroline Tice 879acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 880acdbe816SGreg Clayton 881acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 882ceb6b139SCaroline Tice 883ceb6b139SCaroline Tice if (log) 884acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 885750cd175SCaroline Tice broadcaster.get()); 886ceb6b139SCaroline Tice 88730fdc8d8SChris Lattner return broadcaster; 88830fdc8d8SChris Lattner } 88930fdc8d8SChris Lattner 8904bddaeb5SJim Ingham const char * 8914bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8924bddaeb5SJim Ingham { 8934bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8944bddaeb5SJim Ingham } 8954bddaeb5SJim Ingham 89630fdc8d8SChris Lattner size_t 89730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 89830fdc8d8SChris Lattner { 8992d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 900ceb6b139SCaroline Tice 90130fdc8d8SChris Lattner size_t bytes_read = 0; 90230fdc8d8SChris Lattner 903acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 904acdbe816SGreg Clayton 9054838131bSGreg Clayton if (log) 9064838131bSGreg Clayton { 907*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 908acdbe816SGreg Clayton process_sp.get(), 9094838131bSGreg Clayton addr, 9104838131bSGreg Clayton dst, 91143e0af06SGreg Clayton (uint64_t)dst_len, 9124838131bSGreg Clayton sb_error.get()); 9134838131bSGreg Clayton } 9144838131bSGreg Clayton 915acdbe816SGreg Clayton if (process_sp) 91630fdc8d8SChris Lattner { 9177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9187fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9197fdf9ef1SGreg Clayton { 920acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9217fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9227fdf9ef1SGreg Clayton } 9237fdf9ef1SGreg Clayton else 9247fdf9ef1SGreg Clayton { 925c9858e4dSGreg Clayton if (log) 926c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9277fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9287fdf9ef1SGreg Clayton } 92930fdc8d8SChris Lattner } 93030fdc8d8SChris Lattner else 93130fdc8d8SChris Lattner { 93230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 93330fdc8d8SChris Lattner } 93430fdc8d8SChris Lattner 935ceb6b139SCaroline Tice if (log) 93693aa84e8SGreg Clayton { 93793aa84e8SGreg Clayton SBStream sstr; 93893aa84e8SGreg Clayton sb_error.GetDescription (sstr); 939*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 940acdbe816SGreg Clayton process_sp.get(), 94193aa84e8SGreg Clayton addr, 94293aa84e8SGreg Clayton dst, 94343e0af06SGreg Clayton (uint64_t)dst_len, 94493aa84e8SGreg Clayton sb_error.get(), 94593aa84e8SGreg Clayton sstr.GetData(), 94643e0af06SGreg Clayton (uint64_t)bytes_read); 94793aa84e8SGreg Clayton } 948ceb6b139SCaroline Tice 94930fdc8d8SChris Lattner return bytes_read; 95030fdc8d8SChris Lattner } 95130fdc8d8SChris Lattner 95230fdc8d8SChris Lattner size_t 953e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 954e91b7957SGreg Clayton { 955e91b7957SGreg Clayton size_t bytes_read = 0; 956acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 957acdbe816SGreg Clayton if (process_sp) 958e91b7957SGreg Clayton { 9597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9607fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9617fdf9ef1SGreg Clayton { 962acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9637fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9647fdf9ef1SGreg Clayton } 9657fdf9ef1SGreg Clayton else 9667fdf9ef1SGreg Clayton { 967c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 968c9858e4dSGreg Clayton if (log) 969c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9707fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9717fdf9ef1SGreg Clayton } 972e91b7957SGreg Clayton } 973e91b7957SGreg Clayton else 974e91b7957SGreg Clayton { 975e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 976e91b7957SGreg Clayton } 977e91b7957SGreg Clayton return bytes_read; 978e91b7957SGreg Clayton } 979e91b7957SGreg Clayton 980e91b7957SGreg Clayton uint64_t 981e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 982e91b7957SGreg Clayton { 9837fdf9ef1SGreg Clayton uint64_t value = 0; 984acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 985acdbe816SGreg Clayton if (process_sp) 986e91b7957SGreg Clayton { 9877fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9887fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9897fdf9ef1SGreg Clayton { 990acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9917fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9927fdf9ef1SGreg Clayton } 9937fdf9ef1SGreg Clayton else 9947fdf9ef1SGreg Clayton { 995c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 996c9858e4dSGreg Clayton if (log) 997c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9987fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9997fdf9ef1SGreg Clayton } 1000e91b7957SGreg Clayton } 1001e91b7957SGreg Clayton else 1002e91b7957SGreg Clayton { 1003e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1004e91b7957SGreg Clayton } 10057fdf9ef1SGreg Clayton return value; 1006e91b7957SGreg Clayton } 1007e91b7957SGreg Clayton 1008e91b7957SGreg Clayton lldb::addr_t 1009e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1010e91b7957SGreg Clayton { 1011e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1012acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1013acdbe816SGreg Clayton if (process_sp) 1014e91b7957SGreg Clayton { 10157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10177fdf9ef1SGreg Clayton { 1018acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10197fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10207fdf9ef1SGreg Clayton } 10217fdf9ef1SGreg Clayton else 10227fdf9ef1SGreg Clayton { 1023c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1024c9858e4dSGreg Clayton if (log) 1025c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10267fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10277fdf9ef1SGreg Clayton } 1028e91b7957SGreg Clayton } 1029e91b7957SGreg Clayton else 1030e91b7957SGreg Clayton { 1031e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1032e91b7957SGreg Clayton } 1033e91b7957SGreg Clayton return ptr; 1034e91b7957SGreg Clayton } 1035e91b7957SGreg Clayton 1036e91b7957SGreg Clayton size_t 103730fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 103830fdc8d8SChris Lattner { 103930fdc8d8SChris Lattner size_t bytes_written = 0; 104030fdc8d8SChris Lattner 10412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1042acdbe816SGreg Clayton 1043acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1044acdbe816SGreg Clayton 10454838131bSGreg Clayton if (log) 10464838131bSGreg Clayton { 1047*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1048acdbe816SGreg Clayton process_sp.get(), 10494838131bSGreg Clayton addr, 10504838131bSGreg Clayton src, 105143e0af06SGreg Clayton (uint64_t)src_len, 10524838131bSGreg Clayton sb_error.get()); 10534838131bSGreg Clayton } 10544838131bSGreg Clayton 1055acdbe816SGreg Clayton if (process_sp) 105630fdc8d8SChris Lattner { 10577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10587fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10597fdf9ef1SGreg Clayton { 1060acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10617fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10627fdf9ef1SGreg Clayton } 10637fdf9ef1SGreg Clayton else 10647fdf9ef1SGreg Clayton { 1065c9858e4dSGreg Clayton if (log) 1066c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10677fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10687fdf9ef1SGreg Clayton } 106930fdc8d8SChris Lattner } 107030fdc8d8SChris Lattner 10714838131bSGreg Clayton if (log) 10724838131bSGreg Clayton { 10734838131bSGreg Clayton SBStream sstr; 10744838131bSGreg Clayton sb_error.GetDescription (sstr); 1075*d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1076acdbe816SGreg Clayton process_sp.get(), 10774838131bSGreg Clayton addr, 10784838131bSGreg Clayton src, 107943e0af06SGreg Clayton (uint64_t)src_len, 10804838131bSGreg Clayton sb_error.get(), 10814838131bSGreg Clayton sstr.GetData(), 108243e0af06SGreg Clayton (uint64_t)bytes_written); 10834838131bSGreg Clayton } 10844838131bSGreg Clayton 108530fdc8d8SChris Lattner return bytes_written; 108630fdc8d8SChris Lattner } 108730fdc8d8SChris Lattner 1088dde9cff3SCaroline Tice bool 1089dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1090dde9cff3SCaroline Tice { 1091da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1092da7bc7d0SGreg Clayton 1093acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1094acdbe816SGreg Clayton if (process_sp) 1095dde9cff3SCaroline Tice { 1096dde9cff3SCaroline Tice char path[PATH_MAX]; 1097dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1098acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10991d273166SGreg Clayton const char *exe_name = NULL; 11001d273166SGreg Clayton if (exe_module) 11011d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11021d273166SGreg Clayton 1103*d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1104acdbe816SGreg Clayton process_sp->GetID(), 1105ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11061d273166SGreg Clayton GetNumThreads(), 110705faeb71SGreg Clayton exe_name ? ", executable = " : "", 11081d273166SGreg Clayton exe_name ? exe_name : ""); 1109dde9cff3SCaroline Tice } 1110dde9cff3SCaroline Tice else 1111da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1112dde9cff3SCaroline Tice 1113dde9cff3SCaroline Tice return true; 1114dde9cff3SCaroline Tice } 11158f343b09SGreg Clayton 11168f343b09SGreg Clayton uint32_t 1117f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1118f9ef60d2SJohnny Chen { 1119f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1120f9ef60d2SJohnny Chen 1121f9ef60d2SJohnny Chen uint32_t num = 0; 1122f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1123f9ef60d2SJohnny Chen if (process_sp) 1124f9ef60d2SJohnny Chen { 1125f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1126f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1127f9ef60d2SJohnny Chen if (log) 1128f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1129f9ef60d2SJohnny Chen process_sp.get(), num); 1130f9ef60d2SJohnny Chen } 1131f9ef60d2SJohnny Chen else 1132f9ef60d2SJohnny Chen { 1133f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1134f9ef60d2SJohnny Chen } 1135f9ef60d2SJohnny Chen return num; 1136f9ef60d2SJohnny Chen } 1137f9ef60d2SJohnny Chen 1138f9ef60d2SJohnny Chen uint32_t 11398f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 11408f343b09SGreg Clayton { 1141acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1142acdbe816SGreg Clayton if (process_sp) 1143af67cecdSGreg Clayton { 11447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11457fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11467fdf9ef1SGreg Clayton { 1147acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1148acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1149af67cecdSGreg Clayton } 11507fdf9ef1SGreg Clayton else 11517fdf9ef1SGreg Clayton { 1152c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1153c9858e4dSGreg Clayton if (log) 1154c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11557fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11567fdf9ef1SGreg Clayton } 11577fdf9ef1SGreg Clayton } 11588f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11598f343b09SGreg Clayton } 11608f343b09SGreg Clayton 11618f343b09SGreg Clayton lldb::SBError 11628f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11638f343b09SGreg Clayton { 11648f343b09SGreg Clayton lldb::SBError sb_error; 1165acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1166acdbe816SGreg Clayton if (process_sp) 1167af67cecdSGreg Clayton { 11687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11697fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11707fdf9ef1SGreg Clayton { 1171acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1172acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1173af67cecdSGreg Clayton } 11748f343b09SGreg Clayton else 11757fdf9ef1SGreg Clayton { 1176c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1177c9858e4dSGreg Clayton if (log) 1178c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11797fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11807fdf9ef1SGreg Clayton } 11817fdf9ef1SGreg Clayton } 11827fdf9ef1SGreg Clayton else 11838f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11848f343b09SGreg Clayton return sb_error; 11858f343b09SGreg Clayton } 1186