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 1093a64300SDaniel Malea #include "lldb/lldb-python.h" 1193a64300SDaniel Malea 124c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1330fdc8d8SChris Lattner 1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1740af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 201f746071SGreg Clayton #include "lldb/Core/Module.h" 2130fdc8d8SChris Lattner #include "lldb/Core/State.h" 2230fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2330fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 266611103cSGreg Clayton #include "lldb/Target/Target.h" 276611103cSGreg Clayton #include "lldb/Target/Thread.h" 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner // Project includes 3030fdc8d8SChris Lattner 314c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 330e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 344c5de699SEli Friedman #include "lldb/API/SBEvent.h" 350e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 364c5de699SEli Friedman #include "lldb/API/SBThread.h" 37dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 384c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner using namespace lldb; 4130fdc8d8SChris Lattner using namespace lldb_private; 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner SBProcess::SBProcess () : 454e0fe8abSGreg Clayton m_opaque_wp() 4630fdc8d8SChris Lattner { 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner // SBProcess constructor 5230fdc8d8SChris Lattner //---------------------------------------------------------------------- 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 554e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5630fdc8d8SChris Lattner { 5730fdc8d8SChris Lattner } 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner 6030fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 614e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65efabb123SGreg Clayton const SBProcess& 66efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 67efabb123SGreg Clayton { 68efabb123SGreg Clayton if (this != &rhs) 694e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 70efabb123SGreg Clayton return *this; 71efabb123SGreg Clayton } 72efabb123SGreg Clayton 7330fdc8d8SChris Lattner //---------------------------------------------------------------------- 7430fdc8d8SChris Lattner // Destructor 7530fdc8d8SChris Lattner //---------------------------------------------------------------------- 7630fdc8d8SChris Lattner SBProcess::~SBProcess() 7730fdc8d8SChris Lattner { 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 804bddaeb5SJim Ingham const char * 814bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 824bddaeb5SJim Ingham { 834bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 844bddaeb5SJim Ingham } 854bddaeb5SJim Ingham 86d7b30ef9SJim Ingham const char * 87d7b30ef9SJim Ingham SBProcess::GetPluginName () 88d7b30ef9SJim Ingham { 89d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 90d7b30ef9SJim Ingham if (process_sp) 91d7b30ef9SJim Ingham { 92d7b30ef9SJim Ingham return process_sp->GetPluginName(); 93d7b30ef9SJim Ingham } 94d7b30ef9SJim Ingham return "<Unknown>"; 95d7b30ef9SJim Ingham } 96d7b30ef9SJim Ingham 97d7b30ef9SJim Ingham const char * 98d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 99d7b30ef9SJim Ingham { 100d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 101d7b30ef9SJim Ingham if (process_sp) 102d7b30ef9SJim Ingham { 103d7b30ef9SJim Ingham return process_sp->GetShortPluginName(); 104d7b30ef9SJim Ingham } 105d7b30ef9SJim Ingham return "<Unknown>"; 106d7b30ef9SJim Ingham } 107d7b30ef9SJim Ingham 108d7b30ef9SJim Ingham 109b9556accSGreg Clayton lldb::ProcessSP 110b9556accSGreg Clayton SBProcess::GetSP() const 111b9556accSGreg Clayton { 1124e0fe8abSGreg Clayton return m_opaque_wp.lock(); 113b9556accSGreg Clayton } 114b9556accSGreg Clayton 11530fdc8d8SChris Lattner void 116b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 11730fdc8d8SChris Lattner { 1184e0fe8abSGreg Clayton m_opaque_wp = process_sp; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner void 12230fdc8d8SChris Lattner SBProcess::Clear () 12330fdc8d8SChris Lattner { 1244e0fe8abSGreg Clayton m_opaque_wp.reset(); 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner 12830fdc8d8SChris Lattner bool 12930fdc8d8SChris Lattner SBProcess::IsValid() const 13030fdc8d8SChris Lattner { 1314fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1324fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13330fdc8d8SChris Lattner } 13430fdc8d8SChris Lattner 1359631aae2SJames McIlree bool 1369631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1379631aae2SJames McIlree char const **envp, 1389631aae2SJames McIlree const char *stdin_path, 1399631aae2SJames McIlree const char *stdout_path, 1409631aae2SJames McIlree const char *stderr_path, 1419631aae2SJames McIlree const char *working_directory, 1429631aae2SJames McIlree uint32_t launch_flags, 1439631aae2SJames McIlree bool stop_at_entry, 1449631aae2SJames McIlree lldb::SBError& error) 1459631aae2SJames McIlree { 1469631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1479631aae2SJames McIlree if (log) { 1489631aae2SJames 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))...", 1494e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1509631aae2SJames McIlree argv, 1519631aae2SJames McIlree envp, 1529631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1539631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1549631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1559631aae2SJames McIlree working_directory ? working_directory : "NULL", 1569631aae2SJames McIlree launch_flags, 1579631aae2SJames McIlree stop_at_entry, 1589631aae2SJames McIlree error.get()); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree 161acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 162acdbe816SGreg Clayton if (process_sp) 1639631aae2SJames McIlree { 164acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 165acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1669631aae2SJames McIlree { 167982c9762SGreg Clayton if (stop_at_entry) 168982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 169982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 170982c9762SGreg Clayton stdout_path, 171982c9762SGreg Clayton stderr_path, 172982c9762SGreg Clayton working_directory, 173982c9762SGreg Clayton launch_flags); 174acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 175982c9762SGreg Clayton if (exe_module) 176982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 177982c9762SGreg Clayton if (argv) 178982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 179982c9762SGreg Clayton if (envp) 180982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 181acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1829631aae2SJames McIlree } 1839631aae2SJames McIlree else 1849631aae2SJames McIlree { 1859631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1869631aae2SJames McIlree } 1879631aae2SJames McIlree } 1889631aae2SJames McIlree else 1899631aae2SJames McIlree { 1909631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree 1939631aae2SJames McIlree if (log) { 1949631aae2SJames McIlree SBStream sstr; 1959631aae2SJames McIlree error.GetDescription (sstr); 196acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1979631aae2SJames McIlree } 1989631aae2SJames McIlree 1999631aae2SJames McIlree return error.Success(); 2009631aae2SJames McIlree } 2019631aae2SJames McIlree 2029631aae2SJames McIlree bool 2039631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2049631aae2SJames McIlree { 205acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 206acdbe816SGreg Clayton if (process_sp) 2079631aae2SJames McIlree { 208acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 209acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2109631aae2SJames McIlree { 211144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 212144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 213acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2149631aae2SJames McIlree } 2159631aae2SJames McIlree else 2169631aae2SJames McIlree { 2179631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2189631aae2SJames McIlree } 2199631aae2SJames McIlree } 2209631aae2SJames McIlree else 2219631aae2SJames McIlree { 2229631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2239631aae2SJames McIlree } 2249631aae2SJames McIlree 2259631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2269631aae2SJames McIlree if (log) { 2279631aae2SJames McIlree SBStream sstr; 2289631aae2SJames McIlree error.GetDescription (sstr); 229d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2309631aae2SJames McIlree } 2319631aae2SJames McIlree 2329631aae2SJames McIlree return error.Success(); 2339631aae2SJames McIlree } 2349631aae2SJames McIlree 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner uint32_t 23730fdc8d8SChris Lattner SBProcess::GetNumThreads () 23830fdc8d8SChris Lattner { 2392d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 240ceb6b139SCaroline Tice 241ceb6b139SCaroline Tice uint32_t num_threads = 0; 242acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 243acdbe816SGreg Clayton if (process_sp) 24430fdc8d8SChris Lattner { 2457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2467fdf9ef1SGreg Clayton 2477fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 248acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 249acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25030fdc8d8SChris Lattner } 251ceb6b139SCaroline Tice 252ceb6b139SCaroline Tice if (log) 253acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice return num_threads; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner SBThread 2592976d00aSJim Ingham SBProcess::GetSelectedThread () const 26030fdc8d8SChris Lattner { 2612d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 262ceb6b139SCaroline Tice 26330fdc8d8SChris Lattner SBThread sb_thread; 26417a6ad05SGreg Clayton ThreadSP thread_sp; 265acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 266acdbe816SGreg Clayton if (process_sp) 267af67cecdSGreg Clayton { 268acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 269acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 271af67cecdSGreg Clayton } 272ceb6b139SCaroline Tice 273ceb6b139SCaroline Tice if (log) 274ceb6b139SCaroline Tice { 275acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 276ceb6b139SCaroline Tice } 277ceb6b139SCaroline Tice 27830fdc8d8SChris Lattner return sb_thread; 27930fdc8d8SChris Lattner } 28030fdc8d8SChris Lattner 28130fdc8d8SChris Lattner SBTarget 28230fdc8d8SChris Lattner SBProcess::GetTarget() const 28330fdc8d8SChris Lattner { 2842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 285ceb6b139SCaroline Tice 28630fdc8d8SChris Lattner SBTarget sb_target; 287b9556accSGreg Clayton TargetSP target_sp; 288acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 289acdbe816SGreg Clayton if (process_sp) 290b9556accSGreg Clayton { 291acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 292b9556accSGreg Clayton sb_target.SetSP (target_sp); 293b9556accSGreg Clayton } 294ceb6b139SCaroline Tice 295ceb6b139SCaroline Tice if (log) 296acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 297ceb6b139SCaroline Tice 29830fdc8d8SChris Lattner return sb_target; 29930fdc8d8SChris Lattner } 30030fdc8d8SChris Lattner 30130fdc8d8SChris Lattner 30230fdc8d8SChris Lattner size_t 30330fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 30430fdc8d8SChris Lattner { 3052d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 306ceb6b139SCaroline Tice 307ceb6b139SCaroline Tice size_t ret_val = 0; 308acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 309acdbe816SGreg Clayton if (process_sp) 31030fdc8d8SChris Lattner { 31130fdc8d8SChris Lattner Error error; 312acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 31330fdc8d8SChris Lattner } 314ceb6b139SCaroline Tice 315ceb6b139SCaroline Tice if (log) 316fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 317acdbe816SGreg Clayton process_sp.get(), 31893aa84e8SGreg Clayton src, 31993aa84e8SGreg Clayton (uint32_t) src_len, 32093aa84e8SGreg Clayton ret_val); 321ceb6b139SCaroline Tice 322ceb6b139SCaroline Tice return ret_val; 32330fdc8d8SChris Lattner } 32430fdc8d8SChris Lattner 32530fdc8d8SChris Lattner size_t 32630fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 32730fdc8d8SChris Lattner { 328cfd1acedSGreg Clayton size_t bytes_read = 0; 329acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 330acdbe816SGreg Clayton if (process_sp) 33130fdc8d8SChris Lattner { 33230fdc8d8SChris Lattner Error error; 333acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 33430fdc8d8SChris Lattner } 335ceb6b139SCaroline Tice 3362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 337ceb6b139SCaroline Tice if (log) 338d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 33943e0af06SGreg Clayton process_sp.get(), 34043e0af06SGreg Clayton (int) bytes_read, 34143e0af06SGreg Clayton dst, 34243e0af06SGreg Clayton (uint64_t)dst_len, 34343e0af06SGreg Clayton (uint64_t)bytes_read); 344ceb6b139SCaroline Tice 345cfd1acedSGreg Clayton return bytes_read; 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner size_t 34930fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 35030fdc8d8SChris Lattner { 351cfd1acedSGreg Clayton size_t bytes_read = 0; 352acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 353acdbe816SGreg Clayton if (process_sp) 35430fdc8d8SChris Lattner { 35530fdc8d8SChris Lattner Error error; 356acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 35730fdc8d8SChris Lattner } 358ceb6b139SCaroline Tice 3592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 360ceb6b139SCaroline Tice if (log) 361d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 36243e0af06SGreg Clayton process_sp.get(), 36343e0af06SGreg Clayton (int) bytes_read, 36443e0af06SGreg Clayton dst, 36543e0af06SGreg Clayton (uint64_t)dst_len, 36643e0af06SGreg Clayton (uint64_t)bytes_read); 367ceb6b139SCaroline Tice 368cfd1acedSGreg Clayton return bytes_read; 36930fdc8d8SChris Lattner } 37030fdc8d8SChris Lattner 371ab3b8b22SHan Ming Ong size_t 372ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 373ab3b8b22SHan Ming Ong { 374ab3b8b22SHan Ming Ong size_t bytes_read = 0; 375ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 376ab3b8b22SHan Ming Ong if (process_sp) 377ab3b8b22SHan Ming Ong { 378ab3b8b22SHan Ming Ong Error error; 379ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 380ab3b8b22SHan Ming Ong } 381ab3b8b22SHan Ming Ong 382ab3b8b22SHan Ming Ong LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 383ab3b8b22SHan Ming Ong if (log) 384d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 385ab3b8b22SHan Ming Ong process_sp.get(), 386ab3b8b22SHan Ming Ong (int) bytes_read, 387ab3b8b22SHan Ming Ong dst, 388ab3b8b22SHan Ming Ong (uint64_t)dst_len, 389ab3b8b22SHan Ming Ong (uint64_t)bytes_read); 390ab3b8b22SHan Ming Ong 391ab3b8b22SHan Ming Ong return bytes_read; 392ab3b8b22SHan Ming Ong } 393ab3b8b22SHan Ming Ong 39430fdc8d8SChris Lattner void 3952976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 39630fdc8d8SChris Lattner { 39730fdc8d8SChris Lattner if (out == NULL) 39830fdc8d8SChris Lattner return; 39930fdc8d8SChris Lattner 400acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 401acdbe816SGreg Clayton if (process_sp) 40230fdc8d8SChris Lattner { 40330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 40430fdc8d8SChris Lattner char message[1024]; 40530fdc8d8SChris Lattner int message_len = ::snprintf (message, 40630fdc8d8SChris Lattner sizeof (message), 407d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 408acdbe816SGreg Clayton process_sp->GetID(), 40930fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 41030fdc8d8SChris Lattner 41130fdc8d8SChris Lattner if (message_len > 0) 41230fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 41330fdc8d8SChris Lattner } 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner void 4172976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 41830fdc8d8SChris Lattner { 419acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 420acdbe816SGreg Clayton if (process_sp) 42130fdc8d8SChris Lattner { 42230fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 42330fdc8d8SChris Lattner char message[1024]; 42430fdc8d8SChris Lattner ::snprintf (message, 42530fdc8d8SChris Lattner sizeof (message), 426d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 427acdbe816SGreg Clayton process_sp->GetID(), 42830fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 42930fdc8d8SChris Lattner 43030fdc8d8SChris Lattner result.AppendMessage (message); 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 43430fdc8d8SChris Lattner bool 4352976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 43630fdc8d8SChris Lattner { 437acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 438acdbe816SGreg Clayton if (process_sp) 439af67cecdSGreg Clayton { 440acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 441acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 442af67cecdSGreg Clayton } 44330fdc8d8SChris Lattner return false; 44430fdc8d8SChris Lattner } 44530fdc8d8SChris Lattner 44630fdc8d8SChris Lattner bool 447ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 448ea561dcfSGreg Clayton { 4492d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 450ceb6b139SCaroline Tice 451ceb6b139SCaroline Tice bool ret_val = false; 452acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 453acdbe816SGreg Clayton if (process_sp) 454af67cecdSGreg Clayton { 455acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 456acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 457af67cecdSGreg Clayton } 458ceb6b139SCaroline Tice 459ceb6b139SCaroline Tice if (log) 460d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 461acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 462ceb6b139SCaroline Tice 463ceb6b139SCaroline Tice return ret_val; 46430fdc8d8SChris Lattner } 46530fdc8d8SChris Lattner 46618b46896SJim Ingham bool 46718b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 46818b46896SJim Ingham { 46918b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 47018b46896SJim Ingham 47118b46896SJim Ingham bool ret_val = false; 47218b46896SJim Ingham ProcessSP process_sp(GetSP()); 47318b46896SJim Ingham if (process_sp) 47418b46896SJim Ingham { 47518b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 47618b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 47718b46896SJim Ingham } 47818b46896SJim Ingham 47918b46896SJim Ingham if (log) 48018b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 48118b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 48218b46896SJim Ingham 48318b46896SJim Ingham return ret_val; 48418b46896SJim Ingham } 48518b46896SJim Ingham 48630fdc8d8SChris Lattner SBThread 48730fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 48830fdc8d8SChris Lattner { 4892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 490ceb6b139SCaroline Tice 49117a6ad05SGreg Clayton SBThread sb_thread; 49217a6ad05SGreg Clayton ThreadSP thread_sp; 493acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 494acdbe816SGreg Clayton if (process_sp) 495af67cecdSGreg Clayton { 4967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4977fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 498acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4997fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 50017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 501af67cecdSGreg Clayton } 502ceb6b139SCaroline Tice 503ceb6b139SCaroline Tice if (log) 504ceb6b139SCaroline Tice { 50593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 506acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 507ceb6b139SCaroline Tice } 508ceb6b139SCaroline Tice 50917a6ad05SGreg Clayton return sb_thread; 51030fdc8d8SChris Lattner } 51130fdc8d8SChris Lattner 512bf2956a2SJim Ingham uint32_t 513bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 514bf2956a2SJim Ingham { 515bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 516bf2956a2SJim Ingham if (process_sp) 517bf2956a2SJim Ingham { 518bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 519bf2956a2SJim Ingham if (include_expression_stops) 520bf2956a2SJim Ingham return process_sp->GetStopID(); 521bf2956a2SJim Ingham else 522bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 523bf2956a2SJim Ingham } 524bf2956a2SJim Ingham return 0; 525bf2956a2SJim Ingham } 526bf2956a2SJim Ingham 52730fdc8d8SChris Lattner StateType 52830fdc8d8SChris Lattner SBProcess::GetState () 52930fdc8d8SChris Lattner { 530ceb6b139SCaroline Tice 531ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 532acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 533acdbe816SGreg Clayton if (process_sp) 534af67cecdSGreg Clayton { 535acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 536acdbe816SGreg Clayton ret_val = process_sp->GetState(); 537af67cecdSGreg Clayton } 538ceb6b139SCaroline Tice 5392d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 540ceb6b139SCaroline Tice if (log) 541cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 542acdbe816SGreg Clayton process_sp.get(), 543750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 544ceb6b139SCaroline Tice 545ceb6b139SCaroline Tice return ret_val; 54630fdc8d8SChris Lattner } 54730fdc8d8SChris Lattner 54830fdc8d8SChris Lattner 54930fdc8d8SChris Lattner int 55030fdc8d8SChris Lattner SBProcess::GetExitStatus () 55130fdc8d8SChris Lattner { 5524838131bSGreg Clayton int exit_status = 0; 553acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 554acdbe816SGreg Clayton if (process_sp) 555af67cecdSGreg Clayton { 556acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 557acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 558af67cecdSGreg Clayton } 5592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5604838131bSGreg Clayton if (log) 5614838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 562acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5634838131bSGreg Clayton 5644838131bSGreg Clayton return exit_status; 56530fdc8d8SChris Lattner } 56630fdc8d8SChris Lattner 56730fdc8d8SChris Lattner const char * 56830fdc8d8SChris Lattner SBProcess::GetExitDescription () 56930fdc8d8SChris Lattner { 5704838131bSGreg Clayton const char *exit_desc = NULL; 571acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 572acdbe816SGreg Clayton if (process_sp) 573af67cecdSGreg Clayton { 574acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 575acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 576af67cecdSGreg Clayton } 5772d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5784838131bSGreg Clayton if (log) 5794838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 580acdbe816SGreg Clayton process_sp.get(), exit_desc); 5814838131bSGreg Clayton return exit_desc; 58230fdc8d8SChris Lattner } 58330fdc8d8SChris Lattner 58430fdc8d8SChris Lattner lldb::pid_t 58530fdc8d8SChris Lattner SBProcess::GetProcessID () 58630fdc8d8SChris Lattner { 587ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 588acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 589acdbe816SGreg Clayton if (process_sp) 590acdbe816SGreg Clayton ret_val = process_sp->GetID(); 591ceb6b139SCaroline Tice 5922d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 593ceb6b139SCaroline Tice if (log) 594d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val); 595ceb6b139SCaroline Tice 596ceb6b139SCaroline Tice return ret_val; 59730fdc8d8SChris Lattner } 59830fdc8d8SChris Lattner 599*949e8221SGreg Clayton uint32_t 600*949e8221SGreg Clayton SBProcess::GetUniqueID() 601*949e8221SGreg Clayton { 602*949e8221SGreg Clayton uint32_t ret_val = 0; 603*949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 604*949e8221SGreg Clayton if (process_sp) 605*949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 606*949e8221SGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 607*949e8221SGreg Clayton if (log) 608*949e8221SGreg Clayton log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val); 609*949e8221SGreg Clayton return ret_val; 610*949e8221SGreg Clayton } 611*949e8221SGreg Clayton 612cf386e24SJohnny Chen ByteOrder 613cf386e24SJohnny Chen SBProcess::GetByteOrder () const 614cf386e24SJohnny Chen { 615cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 616acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 617acdbe816SGreg Clayton if (process_sp) 618acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 619cf386e24SJohnny Chen 620cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 621cf386e24SJohnny Chen if (log) 622acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 623cf386e24SJohnny Chen 624cf386e24SJohnny Chen return byteOrder; 625cf386e24SJohnny Chen } 626cf386e24SJohnny Chen 62730fdc8d8SChris Lattner uint32_t 62830fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 62930fdc8d8SChris Lattner { 630ceb6b139SCaroline Tice uint32_t size = 0; 631acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 632acdbe816SGreg Clayton if (process_sp) 633acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 634ceb6b139SCaroline Tice 6352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 636ceb6b139SCaroline Tice if (log) 637acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 638ceb6b139SCaroline Tice 639ceb6b139SCaroline Tice return size; 64030fdc8d8SChris Lattner } 64130fdc8d8SChris Lattner 64230fdc8d8SChris Lattner SBError 64330fdc8d8SChris Lattner SBProcess::Continue () 64430fdc8d8SChris Lattner { 6452d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 646ceb6b139SCaroline Tice 64730fdc8d8SChris Lattner SBError sb_error; 648acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6490c74e78dSGreg Clayton 650acdbe816SGreg Clayton if (log) 651acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 652acdbe816SGreg Clayton 653acdbe816SGreg Clayton if (process_sp) 654acdbe816SGreg Clayton { 655acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 656acdbe816SGreg Clayton 657acdbe816SGreg Clayton Error error (process_sp->Resume()); 6585d5028b5SGreg Clayton if (error.Success()) 6595d5028b5SGreg Clayton { 660acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 6614838131bSGreg Clayton { 6624838131bSGreg Clayton if (log) 663acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 664acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 6655d5028b5SGreg Clayton } 6664838131bSGreg Clayton } 6675d5028b5SGreg Clayton sb_error.SetError(error); 6685d5028b5SGreg Clayton } 66930fdc8d8SChris Lattner else 67030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 67130fdc8d8SChris Lattner 672ceb6b139SCaroline Tice if (log) 673ceb6b139SCaroline Tice { 674ceb6b139SCaroline Tice SBStream sstr; 675ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 676acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 677ceb6b139SCaroline Tice } 678ceb6b139SCaroline Tice 67930fdc8d8SChris Lattner return sb_error; 68030fdc8d8SChris Lattner } 68130fdc8d8SChris Lattner 68230fdc8d8SChris Lattner 68330fdc8d8SChris Lattner SBError 68430fdc8d8SChris Lattner SBProcess::Destroy () 68530fdc8d8SChris Lattner { 68630fdc8d8SChris Lattner SBError sb_error; 687acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 688acdbe816SGreg Clayton if (process_sp) 6896779606aSGreg Clayton { 690acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 691acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6926779606aSGreg Clayton } 69330fdc8d8SChris Lattner else 69430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 69530fdc8d8SChris Lattner 6962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6974838131bSGreg Clayton if (log) 6984838131bSGreg Clayton { 6994838131bSGreg Clayton SBStream sstr; 7004838131bSGreg Clayton sb_error.GetDescription (sstr); 7016779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 702acdbe816SGreg Clayton process_sp.get(), 7036779606aSGreg Clayton sb_error.get(), 7046779606aSGreg Clayton sstr.GetData()); 7054838131bSGreg Clayton } 7064838131bSGreg Clayton 70730fdc8d8SChris Lattner return sb_error; 70830fdc8d8SChris Lattner } 70930fdc8d8SChris Lattner 71030fdc8d8SChris Lattner 71130fdc8d8SChris Lattner SBError 71230fdc8d8SChris Lattner SBProcess::Stop () 71330fdc8d8SChris Lattner { 71430fdc8d8SChris Lattner SBError sb_error; 715acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 716acdbe816SGreg Clayton if (process_sp) 717af67cecdSGreg Clayton { 718acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 719acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 720af67cecdSGreg Clayton } 72130fdc8d8SChris Lattner else 72230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 723ceb6b139SCaroline Tice 7242d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 725ceb6b139SCaroline Tice if (log) 726ceb6b139SCaroline Tice { 727ceb6b139SCaroline Tice SBStream sstr; 728ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 72993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 730acdbe816SGreg Clayton process_sp.get(), 73193aa84e8SGreg Clayton sb_error.get(), 732750cd175SCaroline Tice sstr.GetData()); 733ceb6b139SCaroline Tice } 734ceb6b139SCaroline Tice 73530fdc8d8SChris Lattner return sb_error; 73630fdc8d8SChris Lattner } 73730fdc8d8SChris Lattner 73830fdc8d8SChris Lattner SBError 73930fdc8d8SChris Lattner SBProcess::Kill () 74030fdc8d8SChris Lattner { 74130fdc8d8SChris Lattner SBError sb_error; 742acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 743acdbe816SGreg Clayton if (process_sp) 744af67cecdSGreg Clayton { 745acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 746acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 747af67cecdSGreg Clayton } 74830fdc8d8SChris Lattner else 74930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 750ceb6b139SCaroline Tice 7512d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 752ceb6b139SCaroline Tice if (log) 753ceb6b139SCaroline Tice { 754ceb6b139SCaroline Tice SBStream sstr; 755ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 75693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 757acdbe816SGreg Clayton process_sp.get(), 75893aa84e8SGreg Clayton sb_error.get(), 759750cd175SCaroline Tice sstr.GetData()); 760ceb6b139SCaroline Tice } 761ceb6b139SCaroline Tice 76230fdc8d8SChris Lattner return sb_error; 76330fdc8d8SChris Lattner } 76430fdc8d8SChris Lattner 76530fdc8d8SChris Lattner SBError 76630fdc8d8SChris Lattner SBProcess::Detach () 76730fdc8d8SChris Lattner { 76830fdc8d8SChris Lattner SBError sb_error; 769acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 770acdbe816SGreg Clayton if (process_sp) 771af67cecdSGreg Clayton { 772acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 773acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 774af67cecdSGreg Clayton } 77530fdc8d8SChris Lattner else 77630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 77730fdc8d8SChris Lattner 77830fdc8d8SChris Lattner return sb_error; 77930fdc8d8SChris Lattner } 78030fdc8d8SChris Lattner 78130fdc8d8SChris Lattner SBError 7824838131bSGreg Clayton SBProcess::Signal (int signo) 78330fdc8d8SChris Lattner { 78430fdc8d8SChris Lattner SBError sb_error; 785acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 786acdbe816SGreg Clayton if (process_sp) 787af67cecdSGreg Clayton { 788acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 789acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 790af67cecdSGreg Clayton } 79130fdc8d8SChris Lattner else 79230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7932d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7944838131bSGreg Clayton if (log) 7954838131bSGreg Clayton { 7964838131bSGreg Clayton SBStream sstr; 7974838131bSGreg Clayton sb_error.GetDescription (sstr); 7984838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 799acdbe816SGreg Clayton process_sp.get(), 8004838131bSGreg Clayton signo, 8014838131bSGreg Clayton sb_error.get(), 8024838131bSGreg Clayton sstr.GetData()); 8034838131bSGreg Clayton } 80430fdc8d8SChris Lattner return sb_error; 80530fdc8d8SChris Lattner } 80630fdc8d8SChris Lattner 807cfc0935eSJim Ingham void 808cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 809cfc0935eSJim Ingham { 810cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 811cfc0935eSJim Ingham if (process_sp) 812cfc0935eSJim Ingham { 813cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 814cfc0935eSJim Ingham } 815cfc0935eSJim Ingham } 816cfc0935eSJim Ingham 81730fdc8d8SChris Lattner SBThread 8184838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 81930fdc8d8SChris Lattner { 8204838131bSGreg Clayton SBThread sb_thread; 82117a6ad05SGreg Clayton ThreadSP thread_sp; 822acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 823acdbe816SGreg Clayton if (process_sp) 824af67cecdSGreg Clayton { 825acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8277fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 8287fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 82917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 830af67cecdSGreg Clayton } 8314838131bSGreg Clayton 8322d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8334838131bSGreg Clayton if (log) 8344838131bSGreg Clayton { 835d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 836acdbe816SGreg Clayton process_sp.get(), 8374838131bSGreg Clayton tid, 83817a6ad05SGreg Clayton thread_sp.get()); 8394838131bSGreg Clayton } 8404838131bSGreg Clayton 8414838131bSGreg Clayton return sb_thread; 84230fdc8d8SChris Lattner } 84330fdc8d8SChris Lattner 84418b46896SJim Ingham SBThread 84518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 84618b46896SJim Ingham { 84718b46896SJim Ingham SBThread sb_thread; 84818b46896SJim Ingham ThreadSP thread_sp; 84918b46896SJim Ingham ProcessSP process_sp(GetSP()); 85018b46896SJim Ingham if (process_sp) 85118b46896SJim Ingham { 85218b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 85318b46896SJim Ingham Process::StopLocker stop_locker; 85418b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 85518b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 85618b46896SJim Ingham sb_thread.SetThread (thread_sp); 85718b46896SJim Ingham } 85818b46896SJim Ingham 85918b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 86018b46896SJim Ingham if (log) 86118b46896SJim Ingham { 86218b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 86318b46896SJim Ingham process_sp.get(), 86418b46896SJim Ingham index_id, 86518b46896SJim Ingham thread_sp.get()); 86618b46896SJim Ingham } 86718b46896SJim Ingham 86818b46896SJim Ingham return sb_thread; 86918b46896SJim Ingham } 87018b46896SJim Ingham 87130fdc8d8SChris Lattner StateType 87230fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 87330fdc8d8SChris Lattner { 8742d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 875ceb6b139SCaroline Tice 876ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 877ceb6b139SCaroline Tice 878ceb6b139SCaroline Tice if (log) 879cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 880750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 881ceb6b139SCaroline Tice 882ceb6b139SCaroline Tice return ret_val; 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner 88530fdc8d8SChris Lattner bool 88630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 88730fdc8d8SChris Lattner { 8886611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 88930fdc8d8SChris Lattner } 89030fdc8d8SChris Lattner 89130fdc8d8SChris Lattner SBProcess 89230fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 89330fdc8d8SChris Lattner { 8946611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 89530fdc8d8SChris Lattner return process; 89630fdc8d8SChris Lattner } 89730fdc8d8SChris Lattner 898e6bc6cb9SJim Ingham bool 899e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 900e6bc6cb9SJim Ingham { 9014bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 902e6bc6cb9SJim Ingham } 90330fdc8d8SChris Lattner 90430fdc8d8SChris Lattner SBBroadcaster 90530fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 90630fdc8d8SChris Lattner { 9072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 908ceb6b139SCaroline Tice 909acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 910acdbe816SGreg Clayton 911acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 912ceb6b139SCaroline Tice 913ceb6b139SCaroline Tice if (log) 914acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 915750cd175SCaroline Tice broadcaster.get()); 916ceb6b139SCaroline Tice 91730fdc8d8SChris Lattner return broadcaster; 91830fdc8d8SChris Lattner } 91930fdc8d8SChris Lattner 9204bddaeb5SJim Ingham const char * 9214bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 9224bddaeb5SJim Ingham { 9234bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9244bddaeb5SJim Ingham } 9254bddaeb5SJim Ingham 92630fdc8d8SChris Lattner size_t 92730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 92830fdc8d8SChris Lattner { 9292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 930ceb6b139SCaroline Tice 93130fdc8d8SChris Lattner size_t bytes_read = 0; 93230fdc8d8SChris Lattner 933acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 934acdbe816SGreg Clayton 9354838131bSGreg Clayton if (log) 9364838131bSGreg Clayton { 937d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 938acdbe816SGreg Clayton process_sp.get(), 9394838131bSGreg Clayton addr, 9404838131bSGreg Clayton dst, 94143e0af06SGreg Clayton (uint64_t)dst_len, 9424838131bSGreg Clayton sb_error.get()); 9434838131bSGreg Clayton } 9444838131bSGreg Clayton 945acdbe816SGreg Clayton if (process_sp) 94630fdc8d8SChris Lattner { 9477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9487fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9497fdf9ef1SGreg Clayton { 950acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9517fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9527fdf9ef1SGreg Clayton } 9537fdf9ef1SGreg Clayton else 9547fdf9ef1SGreg Clayton { 955c9858e4dSGreg Clayton if (log) 956c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9577fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9587fdf9ef1SGreg Clayton } 95930fdc8d8SChris Lattner } 96030fdc8d8SChris Lattner else 96130fdc8d8SChris Lattner { 96230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 96330fdc8d8SChris Lattner } 96430fdc8d8SChris Lattner 965ceb6b139SCaroline Tice if (log) 96693aa84e8SGreg Clayton { 96793aa84e8SGreg Clayton SBStream sstr; 96893aa84e8SGreg Clayton sb_error.GetDescription (sstr); 969d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 970acdbe816SGreg Clayton process_sp.get(), 97193aa84e8SGreg Clayton addr, 97293aa84e8SGreg Clayton dst, 97343e0af06SGreg Clayton (uint64_t)dst_len, 97493aa84e8SGreg Clayton sb_error.get(), 97593aa84e8SGreg Clayton sstr.GetData(), 97643e0af06SGreg Clayton (uint64_t)bytes_read); 97793aa84e8SGreg Clayton } 978ceb6b139SCaroline Tice 97930fdc8d8SChris Lattner return bytes_read; 98030fdc8d8SChris Lattner } 98130fdc8d8SChris Lattner 98230fdc8d8SChris Lattner size_t 983e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 984e91b7957SGreg Clayton { 985e91b7957SGreg Clayton size_t bytes_read = 0; 986acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 987acdbe816SGreg Clayton if (process_sp) 988e91b7957SGreg Clayton { 9897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9907fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9917fdf9ef1SGreg Clayton { 992acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9937fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9947fdf9ef1SGreg Clayton } 9957fdf9ef1SGreg Clayton else 9967fdf9ef1SGreg Clayton { 997c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 998c9858e4dSGreg Clayton if (log) 999c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10007fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10017fdf9ef1SGreg Clayton } 1002e91b7957SGreg Clayton } 1003e91b7957SGreg Clayton else 1004e91b7957SGreg Clayton { 1005e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1006e91b7957SGreg Clayton } 1007e91b7957SGreg Clayton return bytes_read; 1008e91b7957SGreg Clayton } 1009e91b7957SGreg Clayton 1010e91b7957SGreg Clayton uint64_t 1011e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1012e91b7957SGreg Clayton { 10137fdf9ef1SGreg Clayton uint64_t value = 0; 1014acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1015acdbe816SGreg Clayton if (process_sp) 1016e91b7957SGreg Clayton { 10177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10187fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10197fdf9ef1SGreg Clayton { 1020acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10217fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 10227fdf9ef1SGreg Clayton } 10237fdf9ef1SGreg Clayton else 10247fdf9ef1SGreg Clayton { 1025c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1026c9858e4dSGreg Clayton if (log) 1027c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 10287fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10297fdf9ef1SGreg Clayton } 1030e91b7957SGreg Clayton } 1031e91b7957SGreg Clayton else 1032e91b7957SGreg Clayton { 1033e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1034e91b7957SGreg Clayton } 10357fdf9ef1SGreg Clayton return value; 1036e91b7957SGreg Clayton } 1037e91b7957SGreg Clayton 1038e91b7957SGreg Clayton lldb::addr_t 1039e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1040e91b7957SGreg Clayton { 1041e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1042acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1043acdbe816SGreg Clayton if (process_sp) 1044e91b7957SGreg Clayton { 10457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10467fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10477fdf9ef1SGreg Clayton { 1048acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10497fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10507fdf9ef1SGreg Clayton } 10517fdf9ef1SGreg Clayton else 10527fdf9ef1SGreg Clayton { 1053c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1054c9858e4dSGreg Clayton if (log) 1055c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10567fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10577fdf9ef1SGreg Clayton } 1058e91b7957SGreg Clayton } 1059e91b7957SGreg Clayton else 1060e91b7957SGreg Clayton { 1061e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1062e91b7957SGreg Clayton } 1063e91b7957SGreg Clayton return ptr; 1064e91b7957SGreg Clayton } 1065e91b7957SGreg Clayton 1066e91b7957SGreg Clayton size_t 106730fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 106830fdc8d8SChris Lattner { 106930fdc8d8SChris Lattner size_t bytes_written = 0; 107030fdc8d8SChris Lattner 10712d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1072acdbe816SGreg Clayton 1073acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1074acdbe816SGreg Clayton 10754838131bSGreg Clayton if (log) 10764838131bSGreg Clayton { 1077d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1078acdbe816SGreg Clayton process_sp.get(), 10794838131bSGreg Clayton addr, 10804838131bSGreg Clayton src, 108143e0af06SGreg Clayton (uint64_t)src_len, 10824838131bSGreg Clayton sb_error.get()); 10834838131bSGreg Clayton } 10844838131bSGreg Clayton 1085acdbe816SGreg Clayton if (process_sp) 108630fdc8d8SChris Lattner { 10877fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10887fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10897fdf9ef1SGreg Clayton { 1090acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10917fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10927fdf9ef1SGreg Clayton } 10937fdf9ef1SGreg Clayton else 10947fdf9ef1SGreg Clayton { 1095c9858e4dSGreg Clayton if (log) 1096c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10977fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10987fdf9ef1SGreg Clayton } 109930fdc8d8SChris Lattner } 110030fdc8d8SChris Lattner 11014838131bSGreg Clayton if (log) 11024838131bSGreg Clayton { 11034838131bSGreg Clayton SBStream sstr; 11044838131bSGreg Clayton sb_error.GetDescription (sstr); 1105d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1106acdbe816SGreg Clayton process_sp.get(), 11074838131bSGreg Clayton addr, 11084838131bSGreg Clayton src, 110943e0af06SGreg Clayton (uint64_t)src_len, 11104838131bSGreg Clayton sb_error.get(), 11114838131bSGreg Clayton sstr.GetData(), 111243e0af06SGreg Clayton (uint64_t)bytes_written); 11134838131bSGreg Clayton } 11144838131bSGreg Clayton 111530fdc8d8SChris Lattner return bytes_written; 111630fdc8d8SChris Lattner } 111730fdc8d8SChris Lattner 1118dde9cff3SCaroline Tice bool 1119dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1120dde9cff3SCaroline Tice { 1121da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1122da7bc7d0SGreg Clayton 1123acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1124acdbe816SGreg Clayton if (process_sp) 1125dde9cff3SCaroline Tice { 1126dde9cff3SCaroline Tice char path[PATH_MAX]; 1127dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1128acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11291d273166SGreg Clayton const char *exe_name = NULL; 11301d273166SGreg Clayton if (exe_module) 11311d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11321d273166SGreg Clayton 1133d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1134acdbe816SGreg Clayton process_sp->GetID(), 1135ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11361d273166SGreg Clayton GetNumThreads(), 113705faeb71SGreg Clayton exe_name ? ", executable = " : "", 11381d273166SGreg Clayton exe_name ? exe_name : ""); 1139dde9cff3SCaroline Tice } 1140dde9cff3SCaroline Tice else 1141da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1142dde9cff3SCaroline Tice 1143dde9cff3SCaroline Tice return true; 1144dde9cff3SCaroline Tice } 11458f343b09SGreg Clayton 11468f343b09SGreg Clayton uint32_t 1147f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1148f9ef60d2SJohnny Chen { 1149f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1150f9ef60d2SJohnny Chen 1151f9ef60d2SJohnny Chen uint32_t num = 0; 1152f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1153f9ef60d2SJohnny Chen if (process_sp) 1154f9ef60d2SJohnny Chen { 1155f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1156f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1157f9ef60d2SJohnny Chen if (log) 1158f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1159f9ef60d2SJohnny Chen process_sp.get(), num); 1160f9ef60d2SJohnny Chen } 1161f9ef60d2SJohnny Chen else 1162f9ef60d2SJohnny Chen { 1163f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1164f9ef60d2SJohnny Chen } 1165f9ef60d2SJohnny Chen return num; 1166f9ef60d2SJohnny Chen } 1167f9ef60d2SJohnny Chen 1168f9ef60d2SJohnny Chen uint32_t 11698f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 11708f343b09SGreg Clayton { 1171acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1172acdbe816SGreg Clayton if (process_sp) 1173af67cecdSGreg Clayton { 11747fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11757fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11767fdf9ef1SGreg Clayton { 1177acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1178acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1179af67cecdSGreg Clayton } 11807fdf9ef1SGreg Clayton else 11817fdf9ef1SGreg Clayton { 1182c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1183c9858e4dSGreg Clayton if (log) 1184c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11857fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11867fdf9ef1SGreg Clayton } 11877fdf9ef1SGreg Clayton } 11888f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11898f343b09SGreg Clayton } 11908f343b09SGreg Clayton 11918f343b09SGreg Clayton lldb::SBError 11928f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11938f343b09SGreg Clayton { 11948f343b09SGreg Clayton lldb::SBError sb_error; 1195acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1196acdbe816SGreg Clayton if (process_sp) 1197af67cecdSGreg Clayton { 11987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11997fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12007fdf9ef1SGreg Clayton { 1201acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1202acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1203af67cecdSGreg Clayton } 12048f343b09SGreg Clayton else 12057fdf9ef1SGreg Clayton { 1206c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1207c9858e4dSGreg Clayton if (log) 1208c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 12097fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12107fdf9ef1SGreg Clayton } 12117fdf9ef1SGreg Clayton } 12127fdf9ef1SGreg Clayton else 12138f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12148f343b09SGreg Clayton return sb_error; 12158f343b09SGreg Clayton } 1216