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 84*d7b30ef9SJim Ingham const char * 85*d7b30ef9SJim Ingham SBProcess::GetPluginName () 86*d7b30ef9SJim Ingham { 87*d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 88*d7b30ef9SJim Ingham if (process_sp) 89*d7b30ef9SJim Ingham { 90*d7b30ef9SJim Ingham return process_sp->GetPluginName(); 91*d7b30ef9SJim Ingham } 92*d7b30ef9SJim Ingham return "<Unknown>"; 93*d7b30ef9SJim Ingham } 94*d7b30ef9SJim Ingham 95*d7b30ef9SJim Ingham const char * 96*d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 97*d7b30ef9SJim Ingham { 98*d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 99*d7b30ef9SJim Ingham if (process_sp) 100*d7b30ef9SJim Ingham { 101*d7b30ef9SJim Ingham return process_sp->GetShortPluginName(); 102*d7b30ef9SJim Ingham } 103*d7b30ef9SJim Ingham return "<Unknown>"; 104*d7b30ef9SJim Ingham } 105*d7b30ef9SJim Ingham 106*d7b30ef9SJim 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); 227acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => 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) 33643e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu", 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) 35943e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu", 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 36930fdc8d8SChris Lattner void 3702976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 37130fdc8d8SChris Lattner { 37230fdc8d8SChris Lattner if (out == NULL) 37330fdc8d8SChris Lattner return; 37430fdc8d8SChris Lattner 375acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 376acdbe816SGreg Clayton if (process_sp) 37730fdc8d8SChris Lattner { 37830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 37930fdc8d8SChris Lattner char message[1024]; 38030fdc8d8SChris Lattner int message_len = ::snprintf (message, 38130fdc8d8SChris Lattner sizeof (message), 38281c22f61SGreg Clayton "Process %llu %s\n", 383acdbe816SGreg Clayton process_sp->GetID(), 38430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 38530fdc8d8SChris Lattner 38630fdc8d8SChris Lattner if (message_len > 0) 38730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner } 39030fdc8d8SChris Lattner 39130fdc8d8SChris Lattner void 3922976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 39330fdc8d8SChris Lattner { 394acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 395acdbe816SGreg Clayton if (process_sp) 39630fdc8d8SChris Lattner { 39730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 39830fdc8d8SChris Lattner char message[1024]; 39930fdc8d8SChris Lattner ::snprintf (message, 40030fdc8d8SChris Lattner sizeof (message), 40181c22f61SGreg Clayton "Process %llu %s\n", 402acdbe816SGreg Clayton process_sp->GetID(), 40330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 40430fdc8d8SChris Lattner 40530fdc8d8SChris Lattner result.AppendMessage (message); 40630fdc8d8SChris Lattner } 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner bool 4102976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 41130fdc8d8SChris Lattner { 412acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 413acdbe816SGreg Clayton if (process_sp) 414af67cecdSGreg Clayton { 415acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 416acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 417af67cecdSGreg Clayton } 41830fdc8d8SChris Lattner return false; 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner bool 4222976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 42330fdc8d8SChris Lattner { 424ea561dcfSGreg Clayton return SetSelectedThreadByID ((lldb::tid_t)tid); 425ea561dcfSGreg Clayton } 426ea561dcfSGreg Clayton 427ea561dcfSGreg Clayton bool 428ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 429ea561dcfSGreg Clayton { 4302d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 431ceb6b139SCaroline Tice 432ceb6b139SCaroline Tice bool ret_val = false; 433acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 434acdbe816SGreg Clayton if (process_sp) 435af67cecdSGreg Clayton { 436acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 437acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 438af67cecdSGreg Clayton } 439ceb6b139SCaroline Tice 440ceb6b139SCaroline Tice if (log) 441ea561dcfSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4llx) => %s", 442acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 443ceb6b139SCaroline Tice 444ceb6b139SCaroline Tice return ret_val; 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44718b46896SJim Ingham bool 44818b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 44918b46896SJim Ingham { 45018b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 45118b46896SJim Ingham 45218b46896SJim Ingham bool ret_val = false; 45318b46896SJim Ingham ProcessSP process_sp(GetSP()); 45418b46896SJim Ingham if (process_sp) 45518b46896SJim Ingham { 45618b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 45718b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 45818b46896SJim Ingham } 45918b46896SJim Ingham 46018b46896SJim Ingham if (log) 46118b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 46218b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 46318b46896SJim Ingham 46418b46896SJim Ingham return ret_val; 46518b46896SJim Ingham } 46618b46896SJim Ingham 46730fdc8d8SChris Lattner SBThread 46830fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 46930fdc8d8SChris Lattner { 4702d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 471ceb6b139SCaroline Tice 47217a6ad05SGreg Clayton SBThread sb_thread; 47317a6ad05SGreg Clayton ThreadSP thread_sp; 474acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 475acdbe816SGreg Clayton if (process_sp) 476af67cecdSGreg Clayton { 4777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4787fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 479acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4807fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 48117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 482af67cecdSGreg Clayton } 483ceb6b139SCaroline Tice 484ceb6b139SCaroline Tice if (log) 485ceb6b139SCaroline Tice { 48693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 487acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 488ceb6b139SCaroline Tice } 489ceb6b139SCaroline Tice 49017a6ad05SGreg Clayton return sb_thread; 49130fdc8d8SChris Lattner } 49230fdc8d8SChris Lattner 49330fdc8d8SChris Lattner StateType 49430fdc8d8SChris Lattner SBProcess::GetState () 49530fdc8d8SChris Lattner { 496ceb6b139SCaroline Tice 497ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 498acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 499acdbe816SGreg Clayton if (process_sp) 500af67cecdSGreg Clayton { 501acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 502acdbe816SGreg Clayton ret_val = process_sp->GetState(); 503af67cecdSGreg Clayton } 504ceb6b139SCaroline Tice 5052d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 506ceb6b139SCaroline Tice if (log) 507cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 508acdbe816SGreg Clayton process_sp.get(), 509750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 510ceb6b139SCaroline Tice 511ceb6b139SCaroline Tice return ret_val; 51230fdc8d8SChris Lattner } 51330fdc8d8SChris Lattner 51430fdc8d8SChris Lattner 51530fdc8d8SChris Lattner int 51630fdc8d8SChris Lattner SBProcess::GetExitStatus () 51730fdc8d8SChris Lattner { 5184838131bSGreg Clayton int exit_status = 0; 519acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 520acdbe816SGreg Clayton if (process_sp) 521af67cecdSGreg Clayton { 522acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 523acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 524af67cecdSGreg Clayton } 5252d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5264838131bSGreg Clayton if (log) 5274838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 528acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5294838131bSGreg Clayton 5304838131bSGreg Clayton return exit_status; 53130fdc8d8SChris Lattner } 53230fdc8d8SChris Lattner 53330fdc8d8SChris Lattner const char * 53430fdc8d8SChris Lattner SBProcess::GetExitDescription () 53530fdc8d8SChris Lattner { 5364838131bSGreg Clayton const char *exit_desc = NULL; 537acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 538acdbe816SGreg Clayton if (process_sp) 539af67cecdSGreg Clayton { 540acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 541acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 542af67cecdSGreg Clayton } 5432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5444838131bSGreg Clayton if (log) 5454838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 546acdbe816SGreg Clayton process_sp.get(), exit_desc); 5474838131bSGreg Clayton return exit_desc; 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner 55030fdc8d8SChris Lattner lldb::pid_t 55130fdc8d8SChris Lattner SBProcess::GetProcessID () 55230fdc8d8SChris Lattner { 553ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 554acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 555acdbe816SGreg Clayton if (process_sp) 556acdbe816SGreg Clayton ret_val = process_sp->GetID(); 557ceb6b139SCaroline Tice 5582d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 559ceb6b139SCaroline Tice if (log) 560acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 561ceb6b139SCaroline Tice 562ceb6b139SCaroline Tice return ret_val; 56330fdc8d8SChris Lattner } 56430fdc8d8SChris Lattner 565cf386e24SJohnny Chen ByteOrder 566cf386e24SJohnny Chen SBProcess::GetByteOrder () const 567cf386e24SJohnny Chen { 568cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 569acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 570acdbe816SGreg Clayton if (process_sp) 571acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 572cf386e24SJohnny Chen 573cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 574cf386e24SJohnny Chen if (log) 575acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 576cf386e24SJohnny Chen 577cf386e24SJohnny Chen return byteOrder; 578cf386e24SJohnny Chen } 579cf386e24SJohnny Chen 58030fdc8d8SChris Lattner uint32_t 58130fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 58230fdc8d8SChris Lattner { 583ceb6b139SCaroline Tice uint32_t size = 0; 584acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 585acdbe816SGreg Clayton if (process_sp) 586acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 587ceb6b139SCaroline Tice 5882d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 589ceb6b139SCaroline Tice if (log) 590acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 591ceb6b139SCaroline Tice 592ceb6b139SCaroline Tice return size; 59330fdc8d8SChris Lattner } 59430fdc8d8SChris Lattner 59530fdc8d8SChris Lattner SBError 59630fdc8d8SChris Lattner SBProcess::Continue () 59730fdc8d8SChris Lattner { 5982d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 599ceb6b139SCaroline Tice 60030fdc8d8SChris Lattner SBError sb_error; 601acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6020c74e78dSGreg Clayton 603acdbe816SGreg Clayton if (log) 604acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 605acdbe816SGreg Clayton 606acdbe816SGreg Clayton if (process_sp) 607acdbe816SGreg Clayton { 608acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 609acdbe816SGreg Clayton 610acdbe816SGreg Clayton Error error (process_sp->Resume()); 6115d5028b5SGreg Clayton if (error.Success()) 6125d5028b5SGreg Clayton { 613acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 6144838131bSGreg Clayton { 6154838131bSGreg Clayton if (log) 616acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 617acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 6185d5028b5SGreg Clayton } 6194838131bSGreg Clayton } 6205d5028b5SGreg Clayton sb_error.SetError(error); 6215d5028b5SGreg Clayton } 62230fdc8d8SChris Lattner else 62330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62430fdc8d8SChris Lattner 625ceb6b139SCaroline Tice if (log) 626ceb6b139SCaroline Tice { 627ceb6b139SCaroline Tice SBStream sstr; 628ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 629acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 630ceb6b139SCaroline Tice } 631ceb6b139SCaroline Tice 63230fdc8d8SChris Lattner return sb_error; 63330fdc8d8SChris Lattner } 63430fdc8d8SChris Lattner 63530fdc8d8SChris Lattner 63630fdc8d8SChris Lattner SBError 63730fdc8d8SChris Lattner SBProcess::Destroy () 63830fdc8d8SChris Lattner { 63930fdc8d8SChris Lattner SBError sb_error; 640acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 641acdbe816SGreg Clayton if (process_sp) 6426779606aSGreg Clayton { 643acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 644acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6456779606aSGreg Clayton } 64630fdc8d8SChris Lattner else 64730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 64830fdc8d8SChris Lattner 6492d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6504838131bSGreg Clayton if (log) 6514838131bSGreg Clayton { 6524838131bSGreg Clayton SBStream sstr; 6534838131bSGreg Clayton sb_error.GetDescription (sstr); 6546779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 655acdbe816SGreg Clayton process_sp.get(), 6566779606aSGreg Clayton sb_error.get(), 6576779606aSGreg Clayton sstr.GetData()); 6584838131bSGreg Clayton } 6594838131bSGreg Clayton 66030fdc8d8SChris Lattner return sb_error; 66130fdc8d8SChris Lattner } 66230fdc8d8SChris Lattner 66330fdc8d8SChris Lattner 66430fdc8d8SChris Lattner SBError 66530fdc8d8SChris Lattner SBProcess::Stop () 66630fdc8d8SChris Lattner { 66730fdc8d8SChris Lattner SBError sb_error; 668acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 669acdbe816SGreg Clayton if (process_sp) 670af67cecdSGreg Clayton { 671acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 672acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 673af67cecdSGreg Clayton } 67430fdc8d8SChris Lattner else 67530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 676ceb6b139SCaroline Tice 6772d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 678ceb6b139SCaroline Tice if (log) 679ceb6b139SCaroline Tice { 680ceb6b139SCaroline Tice SBStream sstr; 681ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 68293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 683acdbe816SGreg Clayton process_sp.get(), 68493aa84e8SGreg Clayton sb_error.get(), 685750cd175SCaroline Tice sstr.GetData()); 686ceb6b139SCaroline Tice } 687ceb6b139SCaroline Tice 68830fdc8d8SChris Lattner return sb_error; 68930fdc8d8SChris Lattner } 69030fdc8d8SChris Lattner 69130fdc8d8SChris Lattner SBError 69230fdc8d8SChris Lattner SBProcess::Kill () 69330fdc8d8SChris Lattner { 69430fdc8d8SChris Lattner SBError sb_error; 695acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 696acdbe816SGreg Clayton if (process_sp) 697af67cecdSGreg Clayton { 698acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 699acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 700af67cecdSGreg Clayton } 70130fdc8d8SChris Lattner else 70230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 703ceb6b139SCaroline Tice 7042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 705ceb6b139SCaroline Tice if (log) 706ceb6b139SCaroline Tice { 707ceb6b139SCaroline Tice SBStream sstr; 708ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 70993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 710acdbe816SGreg Clayton process_sp.get(), 71193aa84e8SGreg Clayton sb_error.get(), 712750cd175SCaroline Tice sstr.GetData()); 713ceb6b139SCaroline Tice } 714ceb6b139SCaroline Tice 71530fdc8d8SChris Lattner return sb_error; 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner 71830fdc8d8SChris Lattner SBError 71930fdc8d8SChris Lattner SBProcess::Detach () 72030fdc8d8SChris Lattner { 72130fdc8d8SChris Lattner SBError sb_error; 722acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 723acdbe816SGreg Clayton if (process_sp) 724af67cecdSGreg Clayton { 725acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 726acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 727af67cecdSGreg Clayton } 72830fdc8d8SChris Lattner else 72930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 73030fdc8d8SChris Lattner 73130fdc8d8SChris Lattner return sb_error; 73230fdc8d8SChris Lattner } 73330fdc8d8SChris Lattner 73430fdc8d8SChris Lattner SBError 7354838131bSGreg Clayton SBProcess::Signal (int signo) 73630fdc8d8SChris Lattner { 73730fdc8d8SChris Lattner SBError sb_error; 738acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 739acdbe816SGreg Clayton if (process_sp) 740af67cecdSGreg Clayton { 741acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 742acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 743af67cecdSGreg Clayton } 74430fdc8d8SChris Lattner else 74530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7462d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7474838131bSGreg Clayton if (log) 7484838131bSGreg Clayton { 7494838131bSGreg Clayton SBStream sstr; 7504838131bSGreg Clayton sb_error.GetDescription (sstr); 7514838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 752acdbe816SGreg Clayton process_sp.get(), 7534838131bSGreg Clayton signo, 7544838131bSGreg Clayton sb_error.get(), 7554838131bSGreg Clayton sstr.GetData()); 7564838131bSGreg Clayton } 75730fdc8d8SChris Lattner return sb_error; 75830fdc8d8SChris Lattner } 75930fdc8d8SChris Lattner 760cfc0935eSJim Ingham void 761cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 762cfc0935eSJim Ingham { 763cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 764cfc0935eSJim Ingham if (process_sp) 765cfc0935eSJim Ingham { 766cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 767cfc0935eSJim Ingham } 768cfc0935eSJim Ingham } 769cfc0935eSJim Ingham 77030fdc8d8SChris Lattner SBThread 7714838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 77230fdc8d8SChris Lattner { 7734838131bSGreg Clayton SBThread sb_thread; 77417a6ad05SGreg Clayton ThreadSP thread_sp; 775acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 776acdbe816SGreg Clayton if (process_sp) 777af67cecdSGreg Clayton { 778acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7807fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7817fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 78217a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 783af67cecdSGreg Clayton } 7844838131bSGreg Clayton 7852d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7864838131bSGreg Clayton if (log) 7874838131bSGreg Clayton { 78861e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 789acdbe816SGreg Clayton process_sp.get(), 7904838131bSGreg Clayton tid, 79117a6ad05SGreg Clayton thread_sp.get()); 7924838131bSGreg Clayton } 7934838131bSGreg Clayton 7944838131bSGreg Clayton return sb_thread; 79530fdc8d8SChris Lattner } 79630fdc8d8SChris Lattner 79718b46896SJim Ingham SBThread 79818b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 79918b46896SJim Ingham { 80018b46896SJim Ingham SBThread sb_thread; 80118b46896SJim Ingham ThreadSP thread_sp; 80218b46896SJim Ingham ProcessSP process_sp(GetSP()); 80318b46896SJim Ingham if (process_sp) 80418b46896SJim Ingham { 80518b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 80618b46896SJim Ingham Process::StopLocker stop_locker; 80718b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 80818b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 80918b46896SJim Ingham sb_thread.SetThread (thread_sp); 81018b46896SJim Ingham } 81118b46896SJim Ingham 81218b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 81318b46896SJim Ingham if (log) 81418b46896SJim Ingham { 81518b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 81618b46896SJim Ingham process_sp.get(), 81718b46896SJim Ingham index_id, 81818b46896SJim Ingham thread_sp.get()); 81918b46896SJim Ingham } 82018b46896SJim Ingham 82118b46896SJim Ingham return sb_thread; 82218b46896SJim Ingham } 82318b46896SJim Ingham 82430fdc8d8SChris Lattner StateType 82530fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 82630fdc8d8SChris Lattner { 8272d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 828ceb6b139SCaroline Tice 829ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 830ceb6b139SCaroline Tice 831ceb6b139SCaroline Tice if (log) 832cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 833750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 834ceb6b139SCaroline Tice 835ceb6b139SCaroline Tice return ret_val; 83630fdc8d8SChris Lattner } 83730fdc8d8SChris Lattner 83830fdc8d8SChris Lattner bool 83930fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 84030fdc8d8SChris Lattner { 8416611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 84230fdc8d8SChris Lattner } 84330fdc8d8SChris Lattner 84430fdc8d8SChris Lattner SBProcess 84530fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 84630fdc8d8SChris Lattner { 8476611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 84830fdc8d8SChris Lattner return process; 84930fdc8d8SChris Lattner } 85030fdc8d8SChris Lattner 851e6bc6cb9SJim Ingham bool 852e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 853e6bc6cb9SJim Ingham { 8544bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 855e6bc6cb9SJim Ingham } 85630fdc8d8SChris Lattner 85730fdc8d8SChris Lattner SBBroadcaster 85830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 85930fdc8d8SChris Lattner { 8602d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 861ceb6b139SCaroline Tice 862acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 863acdbe816SGreg Clayton 864acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 865ceb6b139SCaroline Tice 866ceb6b139SCaroline Tice if (log) 867acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 868750cd175SCaroline Tice broadcaster.get()); 869ceb6b139SCaroline Tice 87030fdc8d8SChris Lattner return broadcaster; 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner 8734bddaeb5SJim Ingham const char * 8744bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8754bddaeb5SJim Ingham { 8764bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8774bddaeb5SJim Ingham } 8784bddaeb5SJim Ingham 87930fdc8d8SChris Lattner size_t 88030fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 88130fdc8d8SChris Lattner { 8822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 883ceb6b139SCaroline Tice 88430fdc8d8SChris Lattner size_t bytes_read = 0; 88530fdc8d8SChris Lattner 886acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 887acdbe816SGreg Clayton 8884838131bSGreg Clayton if (log) 8894838131bSGreg Clayton { 89043e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...", 891acdbe816SGreg Clayton process_sp.get(), 8924838131bSGreg Clayton addr, 8934838131bSGreg Clayton dst, 89443e0af06SGreg Clayton (uint64_t)dst_len, 8954838131bSGreg Clayton sb_error.get()); 8964838131bSGreg Clayton } 8974838131bSGreg Clayton 898acdbe816SGreg Clayton if (process_sp) 89930fdc8d8SChris Lattner { 9007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9017fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9027fdf9ef1SGreg Clayton { 903acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9047fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9057fdf9ef1SGreg Clayton } 9067fdf9ef1SGreg Clayton else 9077fdf9ef1SGreg Clayton { 908c9858e4dSGreg Clayton if (log) 909c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9107fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9117fdf9ef1SGreg Clayton } 91230fdc8d8SChris Lattner } 91330fdc8d8SChris Lattner else 91430fdc8d8SChris Lattner { 91530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 91630fdc8d8SChris Lattner } 91730fdc8d8SChris Lattner 918ceb6b139SCaroline Tice if (log) 91993aa84e8SGreg Clayton { 92093aa84e8SGreg Clayton SBStream sstr; 92193aa84e8SGreg Clayton sb_error.GetDescription (sstr); 92243e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu", 923acdbe816SGreg Clayton process_sp.get(), 92493aa84e8SGreg Clayton addr, 92593aa84e8SGreg Clayton dst, 92643e0af06SGreg Clayton (uint64_t)dst_len, 92793aa84e8SGreg Clayton sb_error.get(), 92893aa84e8SGreg Clayton sstr.GetData(), 92943e0af06SGreg Clayton (uint64_t)bytes_read); 93093aa84e8SGreg Clayton } 931ceb6b139SCaroline Tice 93230fdc8d8SChris Lattner return bytes_read; 93330fdc8d8SChris Lattner } 93430fdc8d8SChris Lattner 93530fdc8d8SChris Lattner size_t 936e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 937e91b7957SGreg Clayton { 938e91b7957SGreg Clayton size_t bytes_read = 0; 939acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 940acdbe816SGreg Clayton if (process_sp) 941e91b7957SGreg Clayton { 9427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9437fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9447fdf9ef1SGreg Clayton { 945acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9467fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9477fdf9ef1SGreg Clayton } 9487fdf9ef1SGreg Clayton else 9497fdf9ef1SGreg Clayton { 950c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 951c9858e4dSGreg Clayton if (log) 952c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9537fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9547fdf9ef1SGreg Clayton } 955e91b7957SGreg Clayton } 956e91b7957SGreg Clayton else 957e91b7957SGreg Clayton { 958e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 959e91b7957SGreg Clayton } 960e91b7957SGreg Clayton return bytes_read; 961e91b7957SGreg Clayton } 962e91b7957SGreg Clayton 963e91b7957SGreg Clayton uint64_t 964e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 965e91b7957SGreg Clayton { 9667fdf9ef1SGreg Clayton uint64_t value = 0; 967acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 968acdbe816SGreg Clayton if (process_sp) 969e91b7957SGreg Clayton { 9707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9717fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9727fdf9ef1SGreg Clayton { 973acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9747fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9757fdf9ef1SGreg Clayton } 9767fdf9ef1SGreg Clayton else 9777fdf9ef1SGreg Clayton { 978c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 979c9858e4dSGreg Clayton if (log) 980c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9817fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9827fdf9ef1SGreg Clayton } 983e91b7957SGreg Clayton } 984e91b7957SGreg Clayton else 985e91b7957SGreg Clayton { 986e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 987e91b7957SGreg Clayton } 9887fdf9ef1SGreg Clayton return value; 989e91b7957SGreg Clayton } 990e91b7957SGreg Clayton 991e91b7957SGreg Clayton lldb::addr_t 992e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 993e91b7957SGreg Clayton { 994e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 995acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 996acdbe816SGreg Clayton if (process_sp) 997e91b7957SGreg Clayton { 9987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9997fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10007fdf9ef1SGreg Clayton { 1001acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10027fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10037fdf9ef1SGreg Clayton } 10047fdf9ef1SGreg Clayton else 10057fdf9ef1SGreg Clayton { 1006c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1007c9858e4dSGreg Clayton if (log) 1008c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10097fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10107fdf9ef1SGreg Clayton } 1011e91b7957SGreg Clayton } 1012e91b7957SGreg Clayton else 1013e91b7957SGreg Clayton { 1014e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1015e91b7957SGreg Clayton } 1016e91b7957SGreg Clayton return ptr; 1017e91b7957SGreg Clayton } 1018e91b7957SGreg Clayton 1019e91b7957SGreg Clayton size_t 102030fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 102130fdc8d8SChris Lattner { 102230fdc8d8SChris Lattner size_t bytes_written = 0; 102330fdc8d8SChris Lattner 10242d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1025acdbe816SGreg Clayton 1026acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1027acdbe816SGreg Clayton 10284838131bSGreg Clayton if (log) 10294838131bSGreg Clayton { 103043e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...", 1031acdbe816SGreg Clayton process_sp.get(), 10324838131bSGreg Clayton addr, 10334838131bSGreg Clayton src, 103443e0af06SGreg Clayton (uint64_t)src_len, 10354838131bSGreg Clayton sb_error.get()); 10364838131bSGreg Clayton } 10374838131bSGreg Clayton 1038acdbe816SGreg Clayton if (process_sp) 103930fdc8d8SChris Lattner { 10407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10417fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10427fdf9ef1SGreg Clayton { 1043acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10447fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10457fdf9ef1SGreg Clayton } 10467fdf9ef1SGreg Clayton else 10477fdf9ef1SGreg Clayton { 1048c9858e4dSGreg Clayton if (log) 1049c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10507fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10517fdf9ef1SGreg Clayton } 105230fdc8d8SChris Lattner } 105330fdc8d8SChris Lattner 10544838131bSGreg Clayton if (log) 10554838131bSGreg Clayton { 10564838131bSGreg Clayton SBStream sstr; 10574838131bSGreg Clayton sb_error.GetDescription (sstr); 105843e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu", 1059acdbe816SGreg Clayton process_sp.get(), 10604838131bSGreg Clayton addr, 10614838131bSGreg Clayton src, 106243e0af06SGreg Clayton (uint64_t)src_len, 10634838131bSGreg Clayton sb_error.get(), 10644838131bSGreg Clayton sstr.GetData(), 106543e0af06SGreg Clayton (uint64_t)bytes_written); 10664838131bSGreg Clayton } 10674838131bSGreg Clayton 106830fdc8d8SChris Lattner return bytes_written; 106930fdc8d8SChris Lattner } 107030fdc8d8SChris Lattner 1071dde9cff3SCaroline Tice bool 1072dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1073dde9cff3SCaroline Tice { 1074da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1075da7bc7d0SGreg Clayton 1076acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1077acdbe816SGreg Clayton if (process_sp) 1078dde9cff3SCaroline Tice { 1079dde9cff3SCaroline Tice char path[PATH_MAX]; 1080dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1081acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10821d273166SGreg Clayton const char *exe_name = NULL; 10831d273166SGreg Clayton if (exe_module) 10841d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 10851d273166SGreg Clayton 1086da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 1087acdbe816SGreg Clayton process_sp->GetID(), 1088ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 10891d273166SGreg Clayton GetNumThreads(), 109005faeb71SGreg Clayton exe_name ? ", executable = " : "", 10911d273166SGreg Clayton exe_name ? exe_name : ""); 1092dde9cff3SCaroline Tice } 1093dde9cff3SCaroline Tice else 1094da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1095dde9cff3SCaroline Tice 1096dde9cff3SCaroline Tice return true; 1097dde9cff3SCaroline Tice } 10988f343b09SGreg Clayton 10998f343b09SGreg Clayton uint32_t 1100f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1101f9ef60d2SJohnny Chen { 1102f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1103f9ef60d2SJohnny Chen 1104f9ef60d2SJohnny Chen uint32_t num = 0; 1105f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1106f9ef60d2SJohnny Chen if (process_sp) 1107f9ef60d2SJohnny Chen { 1108f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1109f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1110f9ef60d2SJohnny Chen if (log) 1111f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1112f9ef60d2SJohnny Chen process_sp.get(), num); 1113f9ef60d2SJohnny Chen } 1114f9ef60d2SJohnny Chen else 1115f9ef60d2SJohnny Chen { 1116f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1117f9ef60d2SJohnny Chen } 1118f9ef60d2SJohnny Chen return num; 1119f9ef60d2SJohnny Chen } 1120f9ef60d2SJohnny Chen 1121f9ef60d2SJohnny Chen uint32_t 11228f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 11238f343b09SGreg Clayton { 1124acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1125acdbe816SGreg Clayton if (process_sp) 1126af67cecdSGreg Clayton { 11277fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11287fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11297fdf9ef1SGreg Clayton { 1130acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1131acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1132af67cecdSGreg Clayton } 11337fdf9ef1SGreg Clayton else 11347fdf9ef1SGreg Clayton { 1135c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1136c9858e4dSGreg Clayton if (log) 1137c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11387fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11397fdf9ef1SGreg Clayton } 11407fdf9ef1SGreg Clayton } 11418f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11428f343b09SGreg Clayton } 11438f343b09SGreg Clayton 11448f343b09SGreg Clayton lldb::SBError 11458f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11468f343b09SGreg Clayton { 11478f343b09SGreg Clayton lldb::SBError sb_error; 1148acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1149acdbe816SGreg Clayton if (process_sp) 1150af67cecdSGreg Clayton { 11517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11527fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11537fdf9ef1SGreg Clayton { 1154acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1155acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1156af67cecdSGreg Clayton } 11578f343b09SGreg Clayton else 11587fdf9ef1SGreg Clayton { 1159c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1160c9858e4dSGreg Clayton if (log) 1161c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11627fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11637fdf9ef1SGreg Clayton } 11647fdf9ef1SGreg Clayton } 11657fdf9ef1SGreg Clayton else 11668f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11678f343b09SGreg Clayton return sb_error; 11688f343b09SGreg Clayton } 1169