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 
84b9556accSGreg Clayton lldb::ProcessSP
85b9556accSGreg Clayton SBProcess::GetSP() const
86b9556accSGreg Clayton {
874e0fe8abSGreg Clayton     return m_opaque_wp.lock();
88b9556accSGreg Clayton }
89b9556accSGreg Clayton 
9030fdc8d8SChris Lattner void
91b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp)
9230fdc8d8SChris Lattner {
934e0fe8abSGreg Clayton     m_opaque_wp = process_sp;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner void
9730fdc8d8SChris Lattner SBProcess::Clear ()
9830fdc8d8SChris Lattner {
994e0fe8abSGreg Clayton     m_opaque_wp.reset();
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner bool
10430fdc8d8SChris Lattner SBProcess::IsValid() const
10530fdc8d8SChris Lattner {
1064fc6cb9cSJim Ingham     ProcessSP process_sp(m_opaque_wp.lock());
1074fc6cb9cSJim Ingham     return ((bool) process_sp && process_sp->IsValid());
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
1109631aae2SJames McIlree bool
1119631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv,
1129631aae2SJames McIlree                          char const **envp,
1139631aae2SJames McIlree                          const char *stdin_path,
1149631aae2SJames McIlree                          const char *stdout_path,
1159631aae2SJames McIlree                          const char *stderr_path,
1169631aae2SJames McIlree                          const char *working_directory,
1179631aae2SJames McIlree                          uint32_t launch_flags,
1189631aae2SJames McIlree                          bool stop_at_entry,
1199631aae2SJames McIlree                          lldb::SBError& error)
1209631aae2SJames McIlree {
1219631aae2SJames McIlree     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1229631aae2SJames McIlree     if (log) {
1239631aae2SJames 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))...",
1244e0fe8abSGreg Clayton                      m_opaque_wp.lock().get(),
1259631aae2SJames McIlree                      argv,
1269631aae2SJames McIlree                      envp,
1279631aae2SJames McIlree                      stdin_path ? stdin_path : "NULL",
1289631aae2SJames McIlree                      stdout_path ? stdout_path : "NULL",
1299631aae2SJames McIlree                      stderr_path ? stderr_path : "NULL",
1309631aae2SJames McIlree                      working_directory ? working_directory : "NULL",
1319631aae2SJames McIlree                      launch_flags,
1329631aae2SJames McIlree                      stop_at_entry,
1339631aae2SJames McIlree                      error.get());
1349631aae2SJames McIlree     }
1359631aae2SJames McIlree 
136acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
137acdbe816SGreg Clayton     if (process_sp)
1389631aae2SJames McIlree     {
139acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
140acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1419631aae2SJames McIlree         {
142982c9762SGreg Clayton             if (stop_at_entry)
143982c9762SGreg Clayton                 launch_flags |= eLaunchFlagStopAtEntry;
144982c9762SGreg Clayton             ProcessLaunchInfo launch_info (stdin_path,
145982c9762SGreg Clayton                                            stdout_path,
146982c9762SGreg Clayton                                            stderr_path,
147982c9762SGreg Clayton                                            working_directory,
148982c9762SGreg Clayton                                            launch_flags);
149acdbe816SGreg Clayton             Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
150982c9762SGreg Clayton             if (exe_module)
151982c9762SGreg Clayton                 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
152982c9762SGreg Clayton             if (argv)
153982c9762SGreg Clayton                 launch_info.GetArguments().AppendArguments (argv);
154982c9762SGreg Clayton             if (envp)
155982c9762SGreg Clayton                 launch_info.GetEnvironmentEntries ().SetArguments (envp);
156acdbe816SGreg Clayton             error.SetError (process_sp->Launch (launch_info));
1579631aae2SJames McIlree         }
1589631aae2SJames McIlree         else
1599631aae2SJames McIlree         {
1609631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
1619631aae2SJames McIlree         }
1629631aae2SJames McIlree     }
1639631aae2SJames McIlree     else
1649631aae2SJames McIlree     {
1659631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1669631aae2SJames McIlree     }
1679631aae2SJames McIlree 
1689631aae2SJames McIlree     if (log) {
1699631aae2SJames McIlree         SBStream sstr;
1709631aae2SJames McIlree         error.GetDescription (sstr);
171acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
1729631aae2SJames McIlree     }
1739631aae2SJames McIlree 
1749631aae2SJames McIlree     return error.Success();
1759631aae2SJames McIlree }
1769631aae2SJames McIlree 
1779631aae2SJames McIlree bool
1789631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
1799631aae2SJames McIlree {
180acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
181acdbe816SGreg Clayton     if (process_sp)
1829631aae2SJames McIlree     {
183acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
184acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1859631aae2SJames McIlree         {
186144f3a9cSGreg Clayton             ProcessAttachInfo attach_info;
187144f3a9cSGreg Clayton             attach_info.SetProcessID (pid);
188acdbe816SGreg Clayton             error.SetError (process_sp->Attach (attach_info));
1899631aae2SJames McIlree         }
1909631aae2SJames McIlree         else
1919631aae2SJames McIlree         {
1929631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
1939631aae2SJames McIlree         }
1949631aae2SJames McIlree     }
1959631aae2SJames McIlree     else
1969631aae2SJames McIlree     {
1979631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1989631aae2SJames McIlree     }
1999631aae2SJames McIlree 
2009631aae2SJames McIlree     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2019631aae2SJames McIlree     if (log) {
2029631aae2SJames McIlree         SBStream sstr;
2039631aae2SJames McIlree         error.GetDescription (sstr);
204acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
2059631aae2SJames McIlree     }
2069631aae2SJames McIlree 
2079631aae2SJames McIlree     return error.Success();
2089631aae2SJames McIlree }
2099631aae2SJames McIlree 
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner uint32_t
21230fdc8d8SChris Lattner SBProcess::GetNumThreads ()
21330fdc8d8SChris Lattner {
2142d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
215ceb6b139SCaroline Tice 
216ceb6b139SCaroline Tice     uint32_t num_threads = 0;
217acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
218acdbe816SGreg Clayton     if (process_sp)
21930fdc8d8SChris Lattner     {
2207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2217fdf9ef1SGreg Clayton 
2227fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
223acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
224acdbe816SGreg Clayton         num_threads = process_sp->GetThreadList().GetSize(can_update);
22530fdc8d8SChris Lattner     }
226ceb6b139SCaroline Tice 
227ceb6b139SCaroline Tice     if (log)
228acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
229ceb6b139SCaroline Tice 
230ceb6b139SCaroline Tice     return num_threads;
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
23330fdc8d8SChris Lattner SBThread
2342976d00aSJim Ingham SBProcess::GetSelectedThread () const
23530fdc8d8SChris Lattner {
2362d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
237ceb6b139SCaroline Tice 
23830fdc8d8SChris Lattner     SBThread sb_thread;
23917a6ad05SGreg Clayton     ThreadSP thread_sp;
240acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
241acdbe816SGreg Clayton     if (process_sp)
242af67cecdSGreg Clayton     {
243acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
244acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().GetSelectedThread();
24517a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
246af67cecdSGreg Clayton     }
247ceb6b139SCaroline Tice 
248ceb6b139SCaroline Tice     if (log)
249ceb6b139SCaroline Tice     {
250acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
251ceb6b139SCaroline Tice     }
252ceb6b139SCaroline Tice 
25330fdc8d8SChris Lattner     return sb_thread;
25430fdc8d8SChris Lattner }
25530fdc8d8SChris Lattner 
25630fdc8d8SChris Lattner SBTarget
25730fdc8d8SChris Lattner SBProcess::GetTarget() const
25830fdc8d8SChris Lattner {
2592d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
260ceb6b139SCaroline Tice 
26130fdc8d8SChris Lattner     SBTarget sb_target;
262b9556accSGreg Clayton     TargetSP target_sp;
263acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
264acdbe816SGreg Clayton     if (process_sp)
265b9556accSGreg Clayton     {
266acdbe816SGreg Clayton         target_sp = process_sp->GetTarget().shared_from_this();
267b9556accSGreg Clayton         sb_target.SetSP (target_sp);
268b9556accSGreg Clayton     }
269ceb6b139SCaroline Tice 
270ceb6b139SCaroline Tice     if (log)
271acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
272ceb6b139SCaroline Tice 
27330fdc8d8SChris Lattner     return sb_target;
27430fdc8d8SChris Lattner }
27530fdc8d8SChris Lattner 
27630fdc8d8SChris Lattner 
27730fdc8d8SChris Lattner size_t
27830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
27930fdc8d8SChris Lattner {
2802d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
281ceb6b139SCaroline Tice 
282ceb6b139SCaroline Tice     size_t ret_val = 0;
283acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
284acdbe816SGreg Clayton     if (process_sp)
28530fdc8d8SChris Lattner     {
28630fdc8d8SChris Lattner         Error error;
287acdbe816SGreg Clayton         ret_val =  process_sp->PutSTDIN (src, src_len, error);
28830fdc8d8SChris Lattner     }
289ceb6b139SCaroline Tice 
290ceb6b139SCaroline Tice     if (log)
291fd54b368SJason Molenda         log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
292acdbe816SGreg Clayton                      process_sp.get(),
29393aa84e8SGreg Clayton                      src,
29493aa84e8SGreg Clayton                      (uint32_t) src_len,
29593aa84e8SGreg Clayton                      ret_val);
296ceb6b139SCaroline Tice 
297ceb6b139SCaroline Tice     return ret_val;
29830fdc8d8SChris Lattner }
29930fdc8d8SChris Lattner 
30030fdc8d8SChris Lattner size_t
30130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
30230fdc8d8SChris Lattner {
303cfd1acedSGreg Clayton     size_t bytes_read = 0;
304acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
305acdbe816SGreg Clayton     if (process_sp)
30630fdc8d8SChris Lattner     {
30730fdc8d8SChris Lattner         Error error;
308acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
30930fdc8d8SChris Lattner     }
310ceb6b139SCaroline Tice 
3112d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
312ceb6b139SCaroline Tice     if (log)
313*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu",
314*43e0af06SGreg Clayton                      process_sp.get(),
315*43e0af06SGreg Clayton                      (int) bytes_read,
316*43e0af06SGreg Clayton                      dst,
317*43e0af06SGreg Clayton                      (uint64_t)dst_len,
318*43e0af06SGreg Clayton                      (uint64_t)bytes_read);
319ceb6b139SCaroline Tice 
320cfd1acedSGreg Clayton     return bytes_read;
32130fdc8d8SChris Lattner }
32230fdc8d8SChris Lattner 
32330fdc8d8SChris Lattner size_t
32430fdc8d8SChris Lattner SBProcess::GetSTDERR (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->GetSTDERR (dst, dst_len, error);
33230fdc8d8SChris Lattner     }
333ceb6b139SCaroline Tice 
3342d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
335ceb6b139SCaroline Tice     if (log)
336*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu",
337*43e0af06SGreg Clayton                      process_sp.get(),
338*43e0af06SGreg Clayton                      (int) bytes_read,
339*43e0af06SGreg Clayton                      dst,
340*43e0af06SGreg Clayton                      (uint64_t)dst_len,
341*43e0af06SGreg Clayton                      (uint64_t)bytes_read);
342ceb6b139SCaroline Tice 
343cfd1acedSGreg Clayton     return bytes_read;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner void
3472976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
34830fdc8d8SChris Lattner {
34930fdc8d8SChris Lattner     if (out == NULL)
35030fdc8d8SChris Lattner         return;
35130fdc8d8SChris Lattner 
352acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
353acdbe816SGreg Clayton     if (process_sp)
35430fdc8d8SChris Lattner     {
35530fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
35630fdc8d8SChris Lattner         char message[1024];
35730fdc8d8SChris Lattner         int message_len = ::snprintf (message,
35830fdc8d8SChris Lattner                                       sizeof (message),
35981c22f61SGreg Clayton                                       "Process %llu %s\n",
360acdbe816SGreg Clayton                                       process_sp->GetID(),
36130fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner         if (message_len > 0)
36430fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
36530fdc8d8SChris Lattner     }
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner void
3692976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
37030fdc8d8SChris Lattner {
371acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
372acdbe816SGreg Clayton     if (process_sp)
37330fdc8d8SChris Lattner     {
37430fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
37530fdc8d8SChris Lattner         char message[1024];
37630fdc8d8SChris Lattner         ::snprintf (message,
37730fdc8d8SChris Lattner                     sizeof (message),
37881c22f61SGreg Clayton                     "Process %llu %s\n",
379acdbe816SGreg Clayton                     process_sp->GetID(),
38030fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner         result.AppendMessage (message);
38330fdc8d8SChris Lattner     }
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner bool
3872976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
38830fdc8d8SChris Lattner {
389acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
390acdbe816SGreg Clayton     if (process_sp)
391af67cecdSGreg Clayton     {
392acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
393acdbe816SGreg Clayton         return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
394af67cecdSGreg Clayton     }
39530fdc8d8SChris Lattner     return false;
39630fdc8d8SChris Lattner }
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner bool
3992976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
40030fdc8d8SChris Lattner {
4012d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
402ceb6b139SCaroline Tice 
403ceb6b139SCaroline Tice     bool ret_val = false;
404acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
405acdbe816SGreg Clayton     if (process_sp)
406af67cecdSGreg Clayton     {
407acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
408acdbe816SGreg Clayton         ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
409af67cecdSGreg Clayton     }
410ceb6b139SCaroline Tice 
411ceb6b139SCaroline Tice     if (log)
412cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
413acdbe816SGreg Clayton                      process_sp.get(), tid, (ret_val ? "true" : "false"));
414ceb6b139SCaroline Tice 
415ceb6b139SCaroline Tice     return ret_val;
41630fdc8d8SChris Lattner }
41730fdc8d8SChris Lattner 
41818b46896SJim Ingham bool
41918b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
42018b46896SJim Ingham {
42118b46896SJim Ingham     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
42218b46896SJim Ingham 
42318b46896SJim Ingham     bool ret_val = false;
42418b46896SJim Ingham     ProcessSP process_sp(GetSP());
42518b46896SJim Ingham     if (process_sp)
42618b46896SJim Ingham     {
42718b46896SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
42818b46896SJim Ingham         ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
42918b46896SJim Ingham     }
43018b46896SJim Ingham 
43118b46896SJim Ingham     if (log)
43218b46896SJim Ingham         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
43318b46896SJim Ingham                      process_sp.get(), index_id, (ret_val ? "true" : "false"));
43418b46896SJim Ingham 
43518b46896SJim Ingham     return ret_val;
43618b46896SJim Ingham }
43718b46896SJim Ingham 
43830fdc8d8SChris Lattner SBThread
43930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
44030fdc8d8SChris Lattner {
4412d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
442ceb6b139SCaroline Tice 
44317a6ad05SGreg Clayton     SBThread sb_thread;
44417a6ad05SGreg Clayton     ThreadSP thread_sp;
445acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
446acdbe816SGreg Clayton     if (process_sp)
447af67cecdSGreg Clayton     {
4487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4497fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
450acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
4517fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
45217a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
453af67cecdSGreg Clayton     }
454ceb6b139SCaroline Tice 
455ceb6b139SCaroline Tice     if (log)
456ceb6b139SCaroline Tice     {
45793aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
458acdbe816SGreg Clayton                      process_sp.get(), (uint32_t) index, thread_sp.get());
459ceb6b139SCaroline Tice     }
460ceb6b139SCaroline Tice 
46117a6ad05SGreg Clayton     return sb_thread;
46230fdc8d8SChris Lattner }
46330fdc8d8SChris Lattner 
46430fdc8d8SChris Lattner StateType
46530fdc8d8SChris Lattner SBProcess::GetState ()
46630fdc8d8SChris Lattner {
467ceb6b139SCaroline Tice 
468ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
469acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
470acdbe816SGreg Clayton     if (process_sp)
471af67cecdSGreg Clayton     {
472acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
473acdbe816SGreg Clayton         ret_val = process_sp->GetState();
474af67cecdSGreg Clayton     }
475ceb6b139SCaroline Tice 
4762d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
477ceb6b139SCaroline Tice     if (log)
478cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
479acdbe816SGreg Clayton                      process_sp.get(),
480750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
481ceb6b139SCaroline Tice 
482ceb6b139SCaroline Tice     return ret_val;
48330fdc8d8SChris Lattner }
48430fdc8d8SChris Lattner 
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner int
48730fdc8d8SChris Lattner SBProcess::GetExitStatus ()
48830fdc8d8SChris Lattner {
4894838131bSGreg Clayton     int exit_status = 0;
490acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
491acdbe816SGreg Clayton     if (process_sp)
492af67cecdSGreg Clayton     {
493acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
494acdbe816SGreg Clayton         exit_status = process_sp->GetExitStatus ();
495af67cecdSGreg Clayton     }
4962d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4974838131bSGreg Clayton     if (log)
4984838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
499acdbe816SGreg Clayton                      process_sp.get(), exit_status, exit_status);
5004838131bSGreg Clayton 
5014838131bSGreg Clayton     return exit_status;
50230fdc8d8SChris Lattner }
50330fdc8d8SChris Lattner 
50430fdc8d8SChris Lattner const char *
50530fdc8d8SChris Lattner SBProcess::GetExitDescription ()
50630fdc8d8SChris Lattner {
5074838131bSGreg Clayton     const char *exit_desc = NULL;
508acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
509acdbe816SGreg Clayton     if (process_sp)
510af67cecdSGreg Clayton     {
511acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
512acdbe816SGreg Clayton         exit_desc = process_sp->GetExitDescription ();
513af67cecdSGreg Clayton     }
5142d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5154838131bSGreg Clayton     if (log)
5164838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
517acdbe816SGreg Clayton                      process_sp.get(), exit_desc);
5184838131bSGreg Clayton     return exit_desc;
51930fdc8d8SChris Lattner }
52030fdc8d8SChris Lattner 
52130fdc8d8SChris Lattner lldb::pid_t
52230fdc8d8SChris Lattner SBProcess::GetProcessID ()
52330fdc8d8SChris Lattner {
524ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
525acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
526acdbe816SGreg Clayton     if (process_sp)
527acdbe816SGreg Clayton         ret_val = process_sp->GetID();
528ceb6b139SCaroline Tice 
5292d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
530ceb6b139SCaroline Tice     if (log)
531acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
532ceb6b139SCaroline Tice 
533ceb6b139SCaroline Tice     return ret_val;
53430fdc8d8SChris Lattner }
53530fdc8d8SChris Lattner 
536cf386e24SJohnny Chen ByteOrder
537cf386e24SJohnny Chen SBProcess::GetByteOrder () const
538cf386e24SJohnny Chen {
539cf386e24SJohnny Chen     ByteOrder byteOrder = eByteOrderInvalid;
540acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
541acdbe816SGreg Clayton     if (process_sp)
542acdbe816SGreg Clayton         byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
543cf386e24SJohnny Chen 
544cf386e24SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
545cf386e24SJohnny Chen     if (log)
546acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
547cf386e24SJohnny Chen 
548cf386e24SJohnny Chen     return byteOrder;
549cf386e24SJohnny Chen }
550cf386e24SJohnny Chen 
55130fdc8d8SChris Lattner uint32_t
55230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
55330fdc8d8SChris Lattner {
554ceb6b139SCaroline Tice     uint32_t size = 0;
555acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
556acdbe816SGreg Clayton     if (process_sp)
557acdbe816SGreg Clayton         size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
558ceb6b139SCaroline Tice 
5592d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
560ceb6b139SCaroline Tice     if (log)
561acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
562ceb6b139SCaroline Tice 
563ceb6b139SCaroline Tice     return size;
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner SBError
56730fdc8d8SChris Lattner SBProcess::Continue ()
56830fdc8d8SChris Lattner {
5692d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
570ceb6b139SCaroline Tice 
57130fdc8d8SChris Lattner     SBError sb_error;
572acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
5730c74e78dSGreg Clayton 
574acdbe816SGreg Clayton     if (log)
575acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
576acdbe816SGreg Clayton 
577acdbe816SGreg Clayton     if (process_sp)
578acdbe816SGreg Clayton     {
579acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
580acdbe816SGreg Clayton 
581acdbe816SGreg Clayton         Error error (process_sp->Resume());
5825d5028b5SGreg Clayton         if (error.Success())
5835d5028b5SGreg Clayton         {
584acdbe816SGreg Clayton             if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
5854838131bSGreg Clayton             {
5864838131bSGreg Clayton                 if (log)
587acdbe816SGreg Clayton                     log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
588acdbe816SGreg Clayton                 process_sp->WaitForProcessToStop (NULL);
5895d5028b5SGreg Clayton             }
5904838131bSGreg Clayton         }
5915d5028b5SGreg Clayton         sb_error.SetError(error);
5925d5028b5SGreg Clayton     }
59330fdc8d8SChris Lattner     else
59430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
59530fdc8d8SChris Lattner 
596ceb6b139SCaroline Tice     if (log)
597ceb6b139SCaroline Tice     {
598ceb6b139SCaroline Tice         SBStream sstr;
599ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
600acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
601ceb6b139SCaroline Tice     }
602ceb6b139SCaroline Tice 
60330fdc8d8SChris Lattner     return sb_error;
60430fdc8d8SChris Lattner }
60530fdc8d8SChris Lattner 
60630fdc8d8SChris Lattner 
60730fdc8d8SChris Lattner SBError
60830fdc8d8SChris Lattner SBProcess::Destroy ()
60930fdc8d8SChris Lattner {
61030fdc8d8SChris Lattner     SBError sb_error;
611acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
612acdbe816SGreg Clayton     if (process_sp)
6136779606aSGreg Clayton     {
614acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
615acdbe816SGreg Clayton         sb_error.SetError(process_sp->Destroy());
6166779606aSGreg Clayton     }
61730fdc8d8SChris Lattner     else
61830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
61930fdc8d8SChris Lattner 
6202d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6214838131bSGreg Clayton     if (log)
6224838131bSGreg Clayton     {
6234838131bSGreg Clayton         SBStream sstr;
6244838131bSGreg Clayton         sb_error.GetDescription (sstr);
6256779606aSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
626acdbe816SGreg Clayton                      process_sp.get(),
6276779606aSGreg Clayton                      sb_error.get(),
6286779606aSGreg Clayton                      sstr.GetData());
6294838131bSGreg Clayton     }
6304838131bSGreg Clayton 
63130fdc8d8SChris Lattner     return sb_error;
63230fdc8d8SChris Lattner }
63330fdc8d8SChris Lattner 
63430fdc8d8SChris Lattner 
63530fdc8d8SChris Lattner SBError
63630fdc8d8SChris Lattner SBProcess::Stop ()
63730fdc8d8SChris Lattner {
63830fdc8d8SChris Lattner     SBError sb_error;
639acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
640acdbe816SGreg Clayton     if (process_sp)
641af67cecdSGreg Clayton     {
642acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
643acdbe816SGreg Clayton         sb_error.SetError (process_sp->Halt());
644af67cecdSGreg Clayton     }
64530fdc8d8SChris Lattner     else
64630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
647ceb6b139SCaroline Tice 
6482d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
649ceb6b139SCaroline Tice     if (log)
650ceb6b139SCaroline Tice     {
651ceb6b139SCaroline Tice         SBStream sstr;
652ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
65393aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
654acdbe816SGreg Clayton                      process_sp.get(),
65593aa84e8SGreg Clayton                      sb_error.get(),
656750cd175SCaroline Tice                      sstr.GetData());
657ceb6b139SCaroline Tice     }
658ceb6b139SCaroline Tice 
65930fdc8d8SChris Lattner     return sb_error;
66030fdc8d8SChris Lattner }
66130fdc8d8SChris Lattner 
66230fdc8d8SChris Lattner SBError
66330fdc8d8SChris Lattner SBProcess::Kill ()
66430fdc8d8SChris Lattner {
66530fdc8d8SChris Lattner     SBError sb_error;
666acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
667acdbe816SGreg Clayton     if (process_sp)
668af67cecdSGreg Clayton     {
669acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
670acdbe816SGreg Clayton         sb_error.SetError (process_sp->Destroy());
671af67cecdSGreg Clayton     }
67230fdc8d8SChris Lattner     else
67330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
674ceb6b139SCaroline Tice 
6752d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
676ceb6b139SCaroline Tice     if (log)
677ceb6b139SCaroline Tice     {
678ceb6b139SCaroline Tice         SBStream sstr;
679ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
68093aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
681acdbe816SGreg Clayton                      process_sp.get(),
68293aa84e8SGreg Clayton                      sb_error.get(),
683750cd175SCaroline Tice                      sstr.GetData());
684ceb6b139SCaroline Tice     }
685ceb6b139SCaroline Tice 
68630fdc8d8SChris Lattner     return sb_error;
68730fdc8d8SChris Lattner }
68830fdc8d8SChris Lattner 
68930fdc8d8SChris Lattner SBError
69030fdc8d8SChris Lattner SBProcess::Detach ()
69130fdc8d8SChris Lattner {
69230fdc8d8SChris Lattner     SBError sb_error;
693acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
694acdbe816SGreg Clayton     if (process_sp)
695af67cecdSGreg Clayton     {
696acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
697acdbe816SGreg Clayton         sb_error.SetError (process_sp->Detach());
698af67cecdSGreg Clayton     }
69930fdc8d8SChris Lattner     else
70030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
70130fdc8d8SChris Lattner 
70230fdc8d8SChris Lattner     return sb_error;
70330fdc8d8SChris Lattner }
70430fdc8d8SChris Lattner 
70530fdc8d8SChris Lattner SBError
7064838131bSGreg Clayton SBProcess::Signal (int signo)
70730fdc8d8SChris Lattner {
70830fdc8d8SChris Lattner     SBError sb_error;
709acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
710acdbe816SGreg Clayton     if (process_sp)
711af67cecdSGreg Clayton     {
712acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
713acdbe816SGreg Clayton         sb_error.SetError (process_sp->Signal (signo));
714af67cecdSGreg Clayton     }
71530fdc8d8SChris Lattner     else
71630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
7172d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7184838131bSGreg Clayton     if (log)
7194838131bSGreg Clayton     {
7204838131bSGreg Clayton         SBStream sstr;
7214838131bSGreg Clayton         sb_error.GetDescription (sstr);
7224838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
723acdbe816SGreg Clayton                      process_sp.get(),
7244838131bSGreg Clayton                      signo,
7254838131bSGreg Clayton                      sb_error.get(),
7264838131bSGreg Clayton                      sstr.GetData());
7274838131bSGreg Clayton     }
72830fdc8d8SChris Lattner     return sb_error;
72930fdc8d8SChris Lattner }
73030fdc8d8SChris Lattner 
731cfc0935eSJim Ingham void
732cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt ()
733cfc0935eSJim Ingham {
734cfc0935eSJim Ingham     ProcessSP process_sp(GetSP());
735cfc0935eSJim Ingham     if (process_sp)
736cfc0935eSJim Ingham     {
737cfc0935eSJim Ingham         process_sp->SendAsyncInterrupt ();
738cfc0935eSJim Ingham     }
739cfc0935eSJim Ingham }
740cfc0935eSJim Ingham 
74130fdc8d8SChris Lattner SBThread
7424838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
74330fdc8d8SChris Lattner {
7444838131bSGreg Clayton     SBThread sb_thread;
74517a6ad05SGreg Clayton     ThreadSP thread_sp;
746acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
747acdbe816SGreg Clayton     if (process_sp)
748af67cecdSGreg Clayton     {
749acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
7507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7517fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
7527fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
75317a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
754af67cecdSGreg Clayton     }
7554838131bSGreg Clayton 
7562d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7574838131bSGreg Clayton     if (log)
7584838131bSGreg Clayton     {
75961e7a58cSGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
760acdbe816SGreg Clayton                      process_sp.get(),
7614838131bSGreg Clayton                      tid,
76217a6ad05SGreg Clayton                      thread_sp.get());
7634838131bSGreg Clayton     }
7644838131bSGreg Clayton 
7654838131bSGreg Clayton     return sb_thread;
76630fdc8d8SChris Lattner }
76730fdc8d8SChris Lattner 
76818b46896SJim Ingham SBThread
76918b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id)
77018b46896SJim Ingham {
77118b46896SJim Ingham     SBThread sb_thread;
77218b46896SJim Ingham     ThreadSP thread_sp;
77318b46896SJim Ingham     ProcessSP process_sp(GetSP());
77418b46896SJim Ingham     if (process_sp)
77518b46896SJim Ingham     {
77618b46896SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
77718b46896SJim Ingham         Process::StopLocker stop_locker;
77818b46896SJim Ingham         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
77918b46896SJim Ingham         thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
78018b46896SJim Ingham         sb_thread.SetThread (thread_sp);
78118b46896SJim Ingham     }
78218b46896SJim Ingham 
78318b46896SJim Ingham     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
78418b46896SJim Ingham     if (log)
78518b46896SJim Ingham     {
78618b46896SJim Ingham         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
78718b46896SJim Ingham                      process_sp.get(),
78818b46896SJim Ingham                      index_id,
78918b46896SJim Ingham                      thread_sp.get());
79018b46896SJim Ingham     }
79118b46896SJim Ingham 
79218b46896SJim Ingham     return sb_thread;
79318b46896SJim Ingham }
79418b46896SJim Ingham 
79530fdc8d8SChris Lattner StateType
79630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
79730fdc8d8SChris Lattner {
7982d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
799ceb6b139SCaroline Tice 
800ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
801ceb6b139SCaroline Tice 
802ceb6b139SCaroline Tice     if (log)
803cfd1acedSGreg Clayton         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
804750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
805ceb6b139SCaroline Tice 
806ceb6b139SCaroline Tice     return ret_val;
80730fdc8d8SChris Lattner }
80830fdc8d8SChris Lattner 
80930fdc8d8SChris Lattner bool
81030fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
81130fdc8d8SChris Lattner {
8126611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
81330fdc8d8SChris Lattner }
81430fdc8d8SChris Lattner 
81530fdc8d8SChris Lattner SBProcess
81630fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
81730fdc8d8SChris Lattner {
8186611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
81930fdc8d8SChris Lattner     return process;
82030fdc8d8SChris Lattner }
82130fdc8d8SChris Lattner 
822e6bc6cb9SJim Ingham bool
823e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event)
824e6bc6cb9SJim Ingham {
8254bddaeb5SJim Ingham     return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
826e6bc6cb9SJim Ingham }
82730fdc8d8SChris Lattner 
82830fdc8d8SChris Lattner SBBroadcaster
82930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
83030fdc8d8SChris Lattner {
8312d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
832ceb6b139SCaroline Tice 
833acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
834acdbe816SGreg Clayton 
835acdbe816SGreg Clayton     SBBroadcaster broadcaster(process_sp.get(), false);
836ceb6b139SCaroline Tice 
837ceb6b139SCaroline Tice     if (log)
838acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  process_sp.get(),
839750cd175SCaroline Tice                      broadcaster.get());
840ceb6b139SCaroline Tice 
84130fdc8d8SChris Lattner     return broadcaster;
84230fdc8d8SChris Lattner }
84330fdc8d8SChris Lattner 
8444bddaeb5SJim Ingham const char *
8454bddaeb5SJim Ingham SBProcess::GetBroadcasterClass ()
8464bddaeb5SJim Ingham {
8474bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
8484bddaeb5SJim Ingham }
8494bddaeb5SJim Ingham 
85030fdc8d8SChris Lattner size_t
85130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
85230fdc8d8SChris Lattner {
8532d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
854ceb6b139SCaroline Tice 
85530fdc8d8SChris Lattner     size_t bytes_read = 0;
85630fdc8d8SChris Lattner 
857acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
858acdbe816SGreg Clayton 
8594838131bSGreg Clayton     if (log)
8604838131bSGreg Clayton     {
861*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...",
862acdbe816SGreg Clayton                      process_sp.get(),
8634838131bSGreg Clayton                      addr,
8644838131bSGreg Clayton                      dst,
865*43e0af06SGreg Clayton                      (uint64_t)dst_len,
8664838131bSGreg Clayton                      sb_error.get());
8674838131bSGreg Clayton     }
8684838131bSGreg Clayton 
869acdbe816SGreg Clayton     if (process_sp)
87030fdc8d8SChris Lattner     {
8717fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8727fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
8737fdf9ef1SGreg Clayton         {
874acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
8757fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
8767fdf9ef1SGreg Clayton         }
8777fdf9ef1SGreg Clayton         else
8787fdf9ef1SGreg Clayton         {
879c9858e4dSGreg Clayton             if (log)
880c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
8817fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
8827fdf9ef1SGreg Clayton         }
88330fdc8d8SChris Lattner     }
88430fdc8d8SChris Lattner     else
88530fdc8d8SChris Lattner     {
88630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
88730fdc8d8SChris Lattner     }
88830fdc8d8SChris Lattner 
889ceb6b139SCaroline Tice     if (log)
89093aa84e8SGreg Clayton     {
89193aa84e8SGreg Clayton         SBStream sstr;
89293aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
893*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu",
894acdbe816SGreg Clayton                      process_sp.get(),
89593aa84e8SGreg Clayton                      addr,
89693aa84e8SGreg Clayton                      dst,
897*43e0af06SGreg Clayton                      (uint64_t)dst_len,
89893aa84e8SGreg Clayton                      sb_error.get(),
89993aa84e8SGreg Clayton                      sstr.GetData(),
900*43e0af06SGreg Clayton                      (uint64_t)bytes_read);
90193aa84e8SGreg Clayton     }
902ceb6b139SCaroline Tice 
90330fdc8d8SChris Lattner     return bytes_read;
90430fdc8d8SChris Lattner }
90530fdc8d8SChris Lattner 
90630fdc8d8SChris Lattner size_t
907e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
908e91b7957SGreg Clayton {
909e91b7957SGreg Clayton     size_t bytes_read = 0;
910acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
911acdbe816SGreg Clayton     if (process_sp)
912e91b7957SGreg Clayton     {
9137fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9147fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
9157fdf9ef1SGreg Clayton         {
916acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
9177fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
9187fdf9ef1SGreg Clayton         }
9197fdf9ef1SGreg Clayton         else
9207fdf9ef1SGreg Clayton         {
921c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
922c9858e4dSGreg Clayton             if (log)
923c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
9247fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
9257fdf9ef1SGreg Clayton         }
926e91b7957SGreg Clayton     }
927e91b7957SGreg Clayton     else
928e91b7957SGreg Clayton     {
929e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
930e91b7957SGreg Clayton     }
931e91b7957SGreg Clayton     return bytes_read;
932e91b7957SGreg Clayton }
933e91b7957SGreg Clayton 
934e91b7957SGreg Clayton uint64_t
935e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
936e91b7957SGreg Clayton {
9377fdf9ef1SGreg Clayton     uint64_t value = 0;
938acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
939acdbe816SGreg Clayton     if (process_sp)
940e91b7957SGreg Clayton     {
9417fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9427fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
9437fdf9ef1SGreg Clayton         {
944acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
9457fdf9ef1SGreg Clayton             value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
9467fdf9ef1SGreg Clayton         }
9477fdf9ef1SGreg Clayton         else
9487fdf9ef1SGreg Clayton         {
949c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
950c9858e4dSGreg Clayton             if (log)
951c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
9527fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
9537fdf9ef1SGreg Clayton         }
954e91b7957SGreg Clayton     }
955e91b7957SGreg Clayton     else
956e91b7957SGreg Clayton     {
957e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
958e91b7957SGreg Clayton     }
9597fdf9ef1SGreg Clayton     return value;
960e91b7957SGreg Clayton }
961e91b7957SGreg Clayton 
962e91b7957SGreg Clayton lldb::addr_t
963e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
964e91b7957SGreg Clayton {
965e91b7957SGreg Clayton     lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
966acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
967acdbe816SGreg Clayton     if (process_sp)
968e91b7957SGreg Clayton     {
9697fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9707fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
9717fdf9ef1SGreg Clayton         {
972acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
9737fdf9ef1SGreg Clayton             ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
9747fdf9ef1SGreg Clayton         }
9757fdf9ef1SGreg Clayton         else
9767fdf9ef1SGreg Clayton         {
977c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
978c9858e4dSGreg Clayton             if (log)
979c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
9807fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
9817fdf9ef1SGreg Clayton         }
982e91b7957SGreg Clayton     }
983e91b7957SGreg Clayton     else
984e91b7957SGreg Clayton     {
985e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
986e91b7957SGreg Clayton     }
987e91b7957SGreg Clayton     return ptr;
988e91b7957SGreg Clayton }
989e91b7957SGreg Clayton 
990e91b7957SGreg Clayton size_t
99130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
99230fdc8d8SChris Lattner {
99330fdc8d8SChris Lattner     size_t bytes_written = 0;
99430fdc8d8SChris Lattner 
9952d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
996acdbe816SGreg Clayton 
997acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
998acdbe816SGreg Clayton 
9994838131bSGreg Clayton     if (log)
10004838131bSGreg Clayton     {
1001*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...",
1002acdbe816SGreg Clayton                      process_sp.get(),
10034838131bSGreg Clayton                      addr,
10044838131bSGreg Clayton                      src,
1005*43e0af06SGreg Clayton                      (uint64_t)src_len,
10064838131bSGreg Clayton                      sb_error.get());
10074838131bSGreg Clayton     }
10084838131bSGreg Clayton 
1009acdbe816SGreg Clayton     if (process_sp)
101030fdc8d8SChris Lattner     {
10117fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10127fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
10137fdf9ef1SGreg Clayton         {
1014acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
10157fdf9ef1SGreg Clayton             bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
10167fdf9ef1SGreg Clayton         }
10177fdf9ef1SGreg Clayton         else
10187fdf9ef1SGreg Clayton         {
1019c9858e4dSGreg Clayton             if (log)
1020c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
10217fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
10227fdf9ef1SGreg Clayton         }
102330fdc8d8SChris Lattner     }
102430fdc8d8SChris Lattner 
10254838131bSGreg Clayton     if (log)
10264838131bSGreg Clayton     {
10274838131bSGreg Clayton         SBStream sstr;
10284838131bSGreg Clayton         sb_error.GetDescription (sstr);
1029*43e0af06SGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu",
1030acdbe816SGreg Clayton                      process_sp.get(),
10314838131bSGreg Clayton                      addr,
10324838131bSGreg Clayton                      src,
1033*43e0af06SGreg Clayton                      (uint64_t)src_len,
10344838131bSGreg Clayton                      sb_error.get(),
10354838131bSGreg Clayton                      sstr.GetData(),
1036*43e0af06SGreg Clayton                      (uint64_t)bytes_written);
10374838131bSGreg Clayton     }
10384838131bSGreg Clayton 
103930fdc8d8SChris Lattner     return bytes_written;
104030fdc8d8SChris Lattner }
104130fdc8d8SChris Lattner 
1042dde9cff3SCaroline Tice bool
1043dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
1044dde9cff3SCaroline Tice {
1045da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1046da7bc7d0SGreg Clayton 
1047acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1048acdbe816SGreg Clayton     if (process_sp)
1049dde9cff3SCaroline Tice     {
1050dde9cff3SCaroline Tice         char path[PATH_MAX];
1051dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
1052acdbe816SGreg Clayton         Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
10531d273166SGreg Clayton         const char *exe_name = NULL;
10541d273166SGreg Clayton         if (exe_module)
10551d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
10561d273166SGreg Clayton 
1057da7bc7d0SGreg Clayton         strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
1058acdbe816SGreg Clayton                      process_sp->GetID(),
1059ceb6b139SCaroline Tice                      lldb_private::StateAsCString (GetState()),
10601d273166SGreg Clayton                      GetNumThreads(),
106105faeb71SGreg Clayton                      exe_name ? ", executable = " : "",
10621d273166SGreg Clayton                      exe_name ? exe_name : "");
1063dde9cff3SCaroline Tice     }
1064dde9cff3SCaroline Tice     else
1065da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1066dde9cff3SCaroline Tice 
1067dde9cff3SCaroline Tice     return true;
1068dde9cff3SCaroline Tice }
10698f343b09SGreg Clayton 
10708f343b09SGreg Clayton uint32_t
1071f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1072f9ef60d2SJohnny Chen {
1073f9ef60d2SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1074f9ef60d2SJohnny Chen 
1075f9ef60d2SJohnny Chen     uint32_t num = 0;
1076f9ef60d2SJohnny Chen     ProcessSP process_sp(GetSP());
1077f9ef60d2SJohnny Chen     if (process_sp)
1078f9ef60d2SJohnny Chen     {
1079f9ef60d2SJohnny Chen         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1080f9ef60d2SJohnny Chen         sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1081f9ef60d2SJohnny Chen         LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1082f9ef60d2SJohnny Chen         if (log)
1083f9ef60d2SJohnny Chen             log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1084f9ef60d2SJohnny Chen                          process_sp.get(), num);
1085f9ef60d2SJohnny Chen     }
1086f9ef60d2SJohnny Chen     else
1087f9ef60d2SJohnny Chen     {
1088f9ef60d2SJohnny Chen         sb_error.SetErrorString ("SBProcess is invalid");
1089f9ef60d2SJohnny Chen     }
1090f9ef60d2SJohnny Chen     return num;
1091f9ef60d2SJohnny Chen }
1092f9ef60d2SJohnny Chen 
1093f9ef60d2SJohnny Chen uint32_t
10948f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
10958f343b09SGreg Clayton {
1096acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1097acdbe816SGreg Clayton     if (process_sp)
1098af67cecdSGreg Clayton     {
10997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11007fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11017fdf9ef1SGreg Clayton         {
1102acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1103acdbe816SGreg Clayton             return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1104af67cecdSGreg Clayton         }
11057fdf9ef1SGreg Clayton         else
11067fdf9ef1SGreg Clayton         {
1107c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1108c9858e4dSGreg Clayton             if (log)
1109c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
11107fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11117fdf9ef1SGreg Clayton         }
11127fdf9ef1SGreg Clayton     }
11138f343b09SGreg Clayton     return LLDB_INVALID_IMAGE_TOKEN;
11148f343b09SGreg Clayton }
11158f343b09SGreg Clayton 
11168f343b09SGreg Clayton lldb::SBError
11178f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token)
11188f343b09SGreg Clayton {
11198f343b09SGreg Clayton     lldb::SBError sb_error;
1120acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1121acdbe816SGreg Clayton     if (process_sp)
1122af67cecdSGreg Clayton     {
11237fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11247fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11257fdf9ef1SGreg Clayton         {
1126acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1127acdbe816SGreg Clayton             sb_error.SetError (process_sp->UnloadImage (image_token));
1128af67cecdSGreg Clayton         }
11298f343b09SGreg Clayton         else
11307fdf9ef1SGreg Clayton         {
1131c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1132c9858e4dSGreg Clayton             if (log)
1133c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
11347fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11357fdf9ef1SGreg Clayton         }
11367fdf9ef1SGreg Clayton     }
11377fdf9ef1SGreg Clayton     else
11388f343b09SGreg Clayton         sb_error.SetErrorString("invalid process");
11398f343b09SGreg Clayton     return sb_error;
11408f343b09SGreg Clayton }
1141