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"
1830fdc8d8SChris Lattner #include "lldb/Core/State.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2130fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
236611103cSGreg Clayton #include "lldb/Target/Target.h"
246611103cSGreg Clayton #include "lldb/Target/Thread.h"
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner // Project includes
2730fdc8d8SChris Lattner 
284c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
294c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
304c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
314c5de699SEli Friedman #include "lldb/API/SBEvent.h"
324c5de699SEli Friedman #include "lldb/API/SBThread.h"
33dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
344c5de699SEli Friedman #include "lldb/API/SBStringList.h"
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner using namespace lldb;
3730fdc8d8SChris Lattner using namespace lldb_private;
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner SBProcess::SBProcess () :
426611103cSGreg Clayton     m_opaque_sp()
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner //----------------------------------------------------------------------
4830fdc8d8SChris Lattner // SBProcess constructor
4930fdc8d8SChris Lattner //----------------------------------------------------------------------
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
526611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5330fdc8d8SChris Lattner {
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
586611103cSGreg Clayton     m_opaque_sp (process_sp)
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
62efabb123SGreg Clayton const SBProcess&
63efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs)
64efabb123SGreg Clayton {
65efabb123SGreg Clayton     if (this != &rhs)
66efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
67efabb123SGreg Clayton     return *this;
68efabb123SGreg Clayton }
69efabb123SGreg Clayton 
7030fdc8d8SChris Lattner //----------------------------------------------------------------------
7130fdc8d8SChris Lattner // Destructor
7230fdc8d8SChris Lattner //----------------------------------------------------------------------
7330fdc8d8SChris Lattner SBProcess::~SBProcess()
7430fdc8d8SChris Lattner {
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
77b9556accSGreg Clayton lldb::ProcessSP
78b9556accSGreg Clayton SBProcess::GetSP() const
79b9556accSGreg Clayton {
80b9556accSGreg Clayton     return m_opaque_sp;
81b9556accSGreg Clayton }
82b9556accSGreg Clayton 
8330fdc8d8SChris Lattner void
84b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp)
8530fdc8d8SChris Lattner {
866611103cSGreg Clayton     m_opaque_sp = process_sp;
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner void
9030fdc8d8SChris Lattner SBProcess::Clear ()
9130fdc8d8SChris Lattner {
926611103cSGreg Clayton     m_opaque_sp.reset();
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner bool
9730fdc8d8SChris Lattner SBProcess::IsValid() const
9830fdc8d8SChris Lattner {
996611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
1029631aae2SJames McIlree bool
1039631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv,
1049631aae2SJames McIlree                          char const **envp,
1059631aae2SJames McIlree                          const char *stdin_path,
1069631aae2SJames McIlree                          const char *stdout_path,
1079631aae2SJames McIlree                          const char *stderr_path,
1089631aae2SJames McIlree                          const char *working_directory,
1099631aae2SJames McIlree                          uint32_t launch_flags,
1109631aae2SJames McIlree                          bool stop_at_entry,
1119631aae2SJames McIlree                          lldb::SBError& error)
1129631aae2SJames McIlree {
1139631aae2SJames McIlree     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1149631aae2SJames McIlree     if (log) {
1159631aae2SJames 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))...",
1169631aae2SJames McIlree                      m_opaque_sp.get(),
1179631aae2SJames McIlree                      argv,
1189631aae2SJames McIlree                      envp,
1199631aae2SJames McIlree                      stdin_path ? stdin_path : "NULL",
1209631aae2SJames McIlree                      stdout_path ? stdout_path : "NULL",
1219631aae2SJames McIlree                      stderr_path ? stderr_path : "NULL",
1229631aae2SJames McIlree                      working_directory ? working_directory : "NULL",
1239631aae2SJames McIlree                      launch_flags,
1249631aae2SJames McIlree                      stop_at_entry,
1259631aae2SJames McIlree                      error.get());
1269631aae2SJames McIlree     }
1279631aae2SJames McIlree 
128acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
129acdbe816SGreg Clayton     if (process_sp)
1309631aae2SJames McIlree     {
131acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
132acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1339631aae2SJames McIlree         {
134982c9762SGreg Clayton             if (stop_at_entry)
135982c9762SGreg Clayton                 launch_flags |= eLaunchFlagStopAtEntry;
136982c9762SGreg Clayton             ProcessLaunchInfo launch_info (stdin_path,
137982c9762SGreg Clayton                                            stdout_path,
138982c9762SGreg Clayton                                            stderr_path,
139982c9762SGreg Clayton                                            working_directory,
140982c9762SGreg Clayton                                            launch_flags);
141acdbe816SGreg Clayton             Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
142982c9762SGreg Clayton             if (exe_module)
143982c9762SGreg Clayton                 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
144982c9762SGreg Clayton             if (argv)
145982c9762SGreg Clayton                 launch_info.GetArguments().AppendArguments (argv);
146982c9762SGreg Clayton             if (envp)
147982c9762SGreg Clayton                 launch_info.GetEnvironmentEntries ().SetArguments (envp);
148acdbe816SGreg Clayton             error.SetError (process_sp->Launch (launch_info));
1499631aae2SJames McIlree         }
1509631aae2SJames McIlree         else
1519631aae2SJames McIlree         {
1529631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
1539631aae2SJames McIlree         }
1549631aae2SJames McIlree     }
1559631aae2SJames McIlree     else
1569631aae2SJames McIlree     {
1579631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1589631aae2SJames McIlree     }
1599631aae2SJames McIlree 
1609631aae2SJames McIlree     if (log) {
1619631aae2SJames McIlree         SBStream sstr;
1629631aae2SJames McIlree         error.GetDescription (sstr);
163acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
1649631aae2SJames McIlree     }
1659631aae2SJames McIlree 
1669631aae2SJames McIlree     return error.Success();
1679631aae2SJames McIlree }
1689631aae2SJames McIlree 
1699631aae2SJames McIlree bool
1709631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
1719631aae2SJames McIlree {
172acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
173acdbe816SGreg Clayton     if (process_sp)
1749631aae2SJames McIlree     {
175acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
176acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1779631aae2SJames McIlree         {
178144f3a9cSGreg Clayton             ProcessAttachInfo attach_info;
179144f3a9cSGreg Clayton             attach_info.SetProcessID (pid);
180acdbe816SGreg Clayton             error.SetError (process_sp->Attach (attach_info));
1819631aae2SJames McIlree         }
1829631aae2SJames McIlree         else
1839631aae2SJames McIlree         {
1849631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
1859631aae2SJames McIlree         }
1869631aae2SJames McIlree     }
1879631aae2SJames McIlree     else
1889631aae2SJames McIlree     {
1899631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1909631aae2SJames McIlree     }
1919631aae2SJames McIlree 
1929631aae2SJames McIlree     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1939631aae2SJames McIlree     if (log) {
1949631aae2SJames McIlree         SBStream sstr;
1959631aae2SJames McIlree         error.GetDescription (sstr);
196acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
1979631aae2SJames McIlree     }
1989631aae2SJames McIlree 
1999631aae2SJames McIlree     return error.Success();
2009631aae2SJames McIlree }
2019631aae2SJames McIlree 
20230fdc8d8SChris Lattner 
20330fdc8d8SChris Lattner uint32_t
20430fdc8d8SChris Lattner SBProcess::GetNumThreads ()
20530fdc8d8SChris Lattner {
2062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
207ceb6b139SCaroline Tice 
208ceb6b139SCaroline Tice     uint32_t num_threads = 0;
209acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
210acdbe816SGreg Clayton     if (process_sp)
21130fdc8d8SChris Lattner     {
212acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
21330fdc8d8SChris Lattner         const bool can_update = true;
214acdbe816SGreg Clayton         num_threads = process_sp->GetThreadList().GetSize(can_update);
21530fdc8d8SChris Lattner     }
216ceb6b139SCaroline Tice 
217ceb6b139SCaroline Tice     if (log)
218acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
219ceb6b139SCaroline Tice 
220ceb6b139SCaroline Tice     return num_threads;
22130fdc8d8SChris Lattner }
22230fdc8d8SChris Lattner 
22330fdc8d8SChris Lattner SBThread
2242976d00aSJim Ingham SBProcess::GetSelectedThread () const
22530fdc8d8SChris Lattner {
2262d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
227ceb6b139SCaroline Tice 
22830fdc8d8SChris Lattner     SBThread sb_thread;
22917a6ad05SGreg Clayton     ThreadSP thread_sp;
230acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
231acdbe816SGreg Clayton     if (process_sp)
232af67cecdSGreg Clayton     {
233acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
234acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().GetSelectedThread();
23517a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
236af67cecdSGreg Clayton     }
237ceb6b139SCaroline Tice 
238ceb6b139SCaroline Tice     if (log)
239ceb6b139SCaroline Tice     {
240acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
241ceb6b139SCaroline Tice     }
242ceb6b139SCaroline Tice 
24330fdc8d8SChris Lattner     return sb_thread;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner SBTarget
24730fdc8d8SChris Lattner SBProcess::GetTarget() const
24830fdc8d8SChris Lattner {
2492d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
250ceb6b139SCaroline Tice 
25130fdc8d8SChris Lattner     SBTarget sb_target;
252b9556accSGreg Clayton     TargetSP target_sp;
253acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
254acdbe816SGreg Clayton     if (process_sp)
255b9556accSGreg Clayton     {
256acdbe816SGreg Clayton         target_sp = process_sp->GetTarget().shared_from_this();
257b9556accSGreg Clayton         sb_target.SetSP (target_sp);
258b9556accSGreg Clayton     }
259ceb6b139SCaroline Tice 
260ceb6b139SCaroline Tice     if (log)
261acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
262ceb6b139SCaroline Tice 
26330fdc8d8SChris Lattner     return sb_target;
26430fdc8d8SChris Lattner }
26530fdc8d8SChris Lattner 
26630fdc8d8SChris Lattner 
26730fdc8d8SChris Lattner size_t
26830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
26930fdc8d8SChris Lattner {
2702d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
271ceb6b139SCaroline Tice 
272ceb6b139SCaroline Tice     size_t ret_val = 0;
273acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
274acdbe816SGreg Clayton     if (process_sp)
27530fdc8d8SChris Lattner     {
27630fdc8d8SChris Lattner         Error error;
277acdbe816SGreg Clayton         ret_val =  process_sp->PutSTDIN (src, src_len, error);
27830fdc8d8SChris Lattner     }
279ceb6b139SCaroline Tice 
280ceb6b139SCaroline Tice     if (log)
281fd54b368SJason Molenda         log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
282acdbe816SGreg Clayton                      process_sp.get(),
28393aa84e8SGreg Clayton                      src,
28493aa84e8SGreg Clayton                      (uint32_t) src_len,
28593aa84e8SGreg Clayton                      ret_val);
286ceb6b139SCaroline Tice 
287ceb6b139SCaroline Tice     return ret_val;
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
29030fdc8d8SChris Lattner size_t
29130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
29230fdc8d8SChris Lattner {
293cfd1acedSGreg Clayton     size_t bytes_read = 0;
294acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
295acdbe816SGreg Clayton     if (process_sp)
29630fdc8d8SChris Lattner     {
29730fdc8d8SChris Lattner         Error error;
298acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
29930fdc8d8SChris Lattner     }
300ceb6b139SCaroline Tice 
3012d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
302ceb6b139SCaroline Tice     if (log)
303cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
304acdbe816SGreg Clayton                      process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
305ceb6b139SCaroline Tice 
306cfd1acedSGreg Clayton     return bytes_read;
30730fdc8d8SChris Lattner }
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner size_t
31030fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
31130fdc8d8SChris Lattner {
312cfd1acedSGreg Clayton     size_t bytes_read = 0;
313acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
314acdbe816SGreg Clayton     if (process_sp)
31530fdc8d8SChris Lattner     {
31630fdc8d8SChris Lattner         Error error;
317acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
31830fdc8d8SChris Lattner     }
319ceb6b139SCaroline Tice 
3202d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
321ceb6b139SCaroline Tice     if (log)
322cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
323acdbe816SGreg Clayton                      process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
324ceb6b139SCaroline Tice 
325cfd1acedSGreg Clayton     return bytes_read;
32630fdc8d8SChris Lattner }
32730fdc8d8SChris Lattner 
32830fdc8d8SChris Lattner void
3292976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
33030fdc8d8SChris Lattner {
33130fdc8d8SChris Lattner     if (out == NULL)
33230fdc8d8SChris Lattner         return;
33330fdc8d8SChris Lattner 
334acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
335acdbe816SGreg Clayton     if (process_sp)
33630fdc8d8SChris Lattner     {
33730fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
33830fdc8d8SChris Lattner         char message[1024];
33930fdc8d8SChris Lattner         int message_len = ::snprintf (message,
34030fdc8d8SChris Lattner                                       sizeof (message),
34181c22f61SGreg Clayton                                       "Process %llu %s\n",
342acdbe816SGreg Clayton                                       process_sp->GetID(),
34330fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
34430fdc8d8SChris Lattner 
34530fdc8d8SChris Lattner         if (message_len > 0)
34630fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
34730fdc8d8SChris Lattner     }
34830fdc8d8SChris Lattner }
34930fdc8d8SChris Lattner 
35030fdc8d8SChris Lattner void
3512976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
35230fdc8d8SChris Lattner {
353acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
354acdbe816SGreg Clayton     if (process_sp)
35530fdc8d8SChris Lattner     {
35630fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
35730fdc8d8SChris Lattner         char message[1024];
35830fdc8d8SChris Lattner         ::snprintf (message,
35930fdc8d8SChris Lattner                     sizeof (message),
36081c22f61SGreg Clayton                     "Process %llu %s\n",
361acdbe816SGreg Clayton                     process_sp->GetID(),
36230fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner         result.AppendMessage (message);
36530fdc8d8SChris Lattner     }
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner bool
3692976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
37030fdc8d8SChris Lattner {
371acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
372acdbe816SGreg Clayton     if (process_sp)
373af67cecdSGreg Clayton     {
374acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
375acdbe816SGreg Clayton         return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
376af67cecdSGreg Clayton     }
37730fdc8d8SChris Lattner     return false;
37830fdc8d8SChris Lattner }
37930fdc8d8SChris Lattner 
38030fdc8d8SChris Lattner bool
3812976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
38230fdc8d8SChris Lattner {
3832d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
384ceb6b139SCaroline Tice 
385ceb6b139SCaroline Tice     bool ret_val = false;
386acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
387acdbe816SGreg Clayton     if (process_sp)
388af67cecdSGreg Clayton     {
389acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
390acdbe816SGreg Clayton         ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
391af67cecdSGreg Clayton     }
392ceb6b139SCaroline Tice 
393ceb6b139SCaroline Tice     if (log)
394cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
395acdbe816SGreg Clayton                      process_sp.get(), tid, (ret_val ? "true" : "false"));
396ceb6b139SCaroline Tice 
397ceb6b139SCaroline Tice     return ret_val;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner SBThread
40130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
40230fdc8d8SChris Lattner {
4032d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
404ceb6b139SCaroline Tice 
40517a6ad05SGreg Clayton     SBThread sb_thread;
40617a6ad05SGreg Clayton     ThreadSP thread_sp;
407acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
408acdbe816SGreg Clayton     if (process_sp)
409af67cecdSGreg Clayton     {
410acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
411acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index);
41217a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
413af67cecdSGreg Clayton     }
414ceb6b139SCaroline Tice 
415ceb6b139SCaroline Tice     if (log)
416ceb6b139SCaroline Tice     {
41793aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
418acdbe816SGreg Clayton                      process_sp.get(), (uint32_t) index, thread_sp.get());
419ceb6b139SCaroline Tice     }
420ceb6b139SCaroline Tice 
42117a6ad05SGreg Clayton     return sb_thread;
42230fdc8d8SChris Lattner }
42330fdc8d8SChris Lattner 
42430fdc8d8SChris Lattner StateType
42530fdc8d8SChris Lattner SBProcess::GetState ()
42630fdc8d8SChris Lattner {
427ceb6b139SCaroline Tice 
428ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
429acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
430acdbe816SGreg Clayton     if (process_sp)
431af67cecdSGreg Clayton     {
432acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
433acdbe816SGreg Clayton         ret_val = process_sp->GetState();
434af67cecdSGreg Clayton     }
435ceb6b139SCaroline Tice 
4362d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
437ceb6b139SCaroline Tice     if (log)
438cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
439acdbe816SGreg Clayton                      process_sp.get(),
440750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
441ceb6b139SCaroline Tice 
442ceb6b139SCaroline Tice     return ret_val;
44330fdc8d8SChris Lattner }
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner 
44630fdc8d8SChris Lattner int
44730fdc8d8SChris Lattner SBProcess::GetExitStatus ()
44830fdc8d8SChris Lattner {
4494838131bSGreg Clayton     int exit_status = 0;
450acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
451acdbe816SGreg Clayton     if (process_sp)
452af67cecdSGreg Clayton     {
453acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
454acdbe816SGreg Clayton         exit_status = process_sp->GetExitStatus ();
455af67cecdSGreg Clayton     }
4562d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4574838131bSGreg Clayton     if (log)
4584838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
459acdbe816SGreg Clayton                      process_sp.get(), exit_status, exit_status);
4604838131bSGreg Clayton 
4614838131bSGreg Clayton     return exit_status;
46230fdc8d8SChris Lattner }
46330fdc8d8SChris Lattner 
46430fdc8d8SChris Lattner const char *
46530fdc8d8SChris Lattner SBProcess::GetExitDescription ()
46630fdc8d8SChris Lattner {
4674838131bSGreg Clayton     const char *exit_desc = NULL;
468acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
469acdbe816SGreg Clayton     if (process_sp)
470af67cecdSGreg Clayton     {
471acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
472acdbe816SGreg Clayton         exit_desc = process_sp->GetExitDescription ();
473af67cecdSGreg Clayton     }
4742d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4754838131bSGreg Clayton     if (log)
4764838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
477acdbe816SGreg Clayton                      process_sp.get(), exit_desc);
4784838131bSGreg Clayton     return exit_desc;
47930fdc8d8SChris Lattner }
48030fdc8d8SChris Lattner 
48130fdc8d8SChris Lattner lldb::pid_t
48230fdc8d8SChris Lattner SBProcess::GetProcessID ()
48330fdc8d8SChris Lattner {
484ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
485acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
486acdbe816SGreg Clayton     if (process_sp)
487acdbe816SGreg Clayton         ret_val = process_sp->GetID();
488ceb6b139SCaroline Tice 
4892d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
490ceb6b139SCaroline Tice     if (log)
491acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
492ceb6b139SCaroline Tice 
493ceb6b139SCaroline Tice     return ret_val;
49430fdc8d8SChris Lattner }
49530fdc8d8SChris Lattner 
496cf386e24SJohnny Chen ByteOrder
497cf386e24SJohnny Chen SBProcess::GetByteOrder () const
498cf386e24SJohnny Chen {
499cf386e24SJohnny Chen     ByteOrder byteOrder = eByteOrderInvalid;
500acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
501acdbe816SGreg Clayton     if (process_sp)
502acdbe816SGreg Clayton         byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
503cf386e24SJohnny Chen 
504cf386e24SJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
505cf386e24SJohnny Chen     if (log)
506acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
507cf386e24SJohnny Chen 
508cf386e24SJohnny Chen     return byteOrder;
509cf386e24SJohnny Chen }
510cf386e24SJohnny Chen 
51130fdc8d8SChris Lattner uint32_t
51230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
51330fdc8d8SChris Lattner {
514ceb6b139SCaroline Tice     uint32_t size = 0;
515acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
516acdbe816SGreg Clayton     if (process_sp)
517acdbe816SGreg Clayton         size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
518ceb6b139SCaroline Tice 
5192d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
520ceb6b139SCaroline Tice     if (log)
521acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
522ceb6b139SCaroline Tice 
523ceb6b139SCaroline Tice     return size;
52430fdc8d8SChris Lattner }
52530fdc8d8SChris Lattner 
52630fdc8d8SChris Lattner SBError
52730fdc8d8SChris Lattner SBProcess::Continue ()
52830fdc8d8SChris Lattner {
5292d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
530ceb6b139SCaroline Tice 
53130fdc8d8SChris Lattner     SBError sb_error;
532acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
5330c74e78dSGreg Clayton 
534acdbe816SGreg Clayton     if (log)
535acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
536acdbe816SGreg Clayton 
537acdbe816SGreg Clayton     if (process_sp)
538acdbe816SGreg Clayton     {
539acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
540acdbe816SGreg Clayton 
541acdbe816SGreg Clayton         Error error (process_sp->Resume());
5425d5028b5SGreg Clayton         if (error.Success())
5435d5028b5SGreg Clayton         {
544acdbe816SGreg Clayton             if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
5454838131bSGreg Clayton             {
5464838131bSGreg Clayton                 if (log)
547acdbe816SGreg Clayton                     log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
548acdbe816SGreg Clayton                 process_sp->WaitForProcessToStop (NULL);
5495d5028b5SGreg Clayton             }
5504838131bSGreg Clayton         }
5515d5028b5SGreg Clayton         sb_error.SetError(error);
5525d5028b5SGreg Clayton     }
55330fdc8d8SChris Lattner     else
55430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
55530fdc8d8SChris Lattner 
556ceb6b139SCaroline Tice     if (log)
557ceb6b139SCaroline Tice     {
558ceb6b139SCaroline Tice         SBStream sstr;
559ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
560acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
561ceb6b139SCaroline Tice     }
562ceb6b139SCaroline Tice 
56330fdc8d8SChris Lattner     return sb_error;
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner 
56730fdc8d8SChris Lattner SBError
56830fdc8d8SChris Lattner SBProcess::Destroy ()
56930fdc8d8SChris Lattner {
57030fdc8d8SChris Lattner     SBError sb_error;
571acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
572acdbe816SGreg Clayton     if (process_sp)
5736779606aSGreg Clayton     {
574acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
575acdbe816SGreg Clayton         sb_error.SetError(process_sp->Destroy());
5766779606aSGreg Clayton     }
57730fdc8d8SChris Lattner     else
57830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
57930fdc8d8SChris Lattner 
5802d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5814838131bSGreg Clayton     if (log)
5824838131bSGreg Clayton     {
5834838131bSGreg Clayton         SBStream sstr;
5844838131bSGreg Clayton         sb_error.GetDescription (sstr);
5856779606aSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
586acdbe816SGreg Clayton                      process_sp.get(),
5876779606aSGreg Clayton                      sb_error.get(),
5886779606aSGreg Clayton                      sstr.GetData());
5894838131bSGreg Clayton     }
5904838131bSGreg Clayton 
59130fdc8d8SChris Lattner     return sb_error;
59230fdc8d8SChris Lattner }
59330fdc8d8SChris Lattner 
59430fdc8d8SChris Lattner 
59530fdc8d8SChris Lattner SBError
59630fdc8d8SChris Lattner SBProcess::Stop ()
59730fdc8d8SChris Lattner {
59830fdc8d8SChris Lattner     SBError sb_error;
599acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
600acdbe816SGreg Clayton     if (process_sp)
601af67cecdSGreg Clayton     {
602acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
603acdbe816SGreg Clayton         sb_error.SetError (process_sp->Halt());
604af67cecdSGreg Clayton     }
60530fdc8d8SChris Lattner     else
60630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
607ceb6b139SCaroline Tice 
6082d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
609ceb6b139SCaroline Tice     if (log)
610ceb6b139SCaroline Tice     {
611ceb6b139SCaroline Tice         SBStream sstr;
612ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
61393aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
614acdbe816SGreg Clayton                      process_sp.get(),
61593aa84e8SGreg Clayton                      sb_error.get(),
616750cd175SCaroline Tice                      sstr.GetData());
617ceb6b139SCaroline Tice     }
618ceb6b139SCaroline Tice 
61930fdc8d8SChris Lattner     return sb_error;
62030fdc8d8SChris Lattner }
62130fdc8d8SChris Lattner 
62230fdc8d8SChris Lattner SBError
62330fdc8d8SChris Lattner SBProcess::Kill ()
62430fdc8d8SChris Lattner {
62530fdc8d8SChris Lattner     SBError sb_error;
626acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
627acdbe816SGreg Clayton     if (process_sp)
628af67cecdSGreg Clayton     {
629acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
630acdbe816SGreg Clayton         sb_error.SetError (process_sp->Destroy());
631af67cecdSGreg Clayton     }
63230fdc8d8SChris Lattner     else
63330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
634ceb6b139SCaroline Tice 
6352d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
636ceb6b139SCaroline Tice     if (log)
637ceb6b139SCaroline Tice     {
638ceb6b139SCaroline Tice         SBStream sstr;
639ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
64093aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
641acdbe816SGreg Clayton                      process_sp.get(),
64293aa84e8SGreg Clayton                      sb_error.get(),
643750cd175SCaroline Tice                      sstr.GetData());
644ceb6b139SCaroline Tice     }
645ceb6b139SCaroline Tice 
64630fdc8d8SChris Lattner     return sb_error;
64730fdc8d8SChris Lattner }
64830fdc8d8SChris Lattner 
64930fdc8d8SChris Lattner SBError
65030fdc8d8SChris Lattner SBProcess::Detach ()
65130fdc8d8SChris Lattner {
65230fdc8d8SChris Lattner     SBError sb_error;
653acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
654acdbe816SGreg Clayton     if (process_sp)
655af67cecdSGreg Clayton     {
656acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
657acdbe816SGreg Clayton         sb_error.SetError (process_sp->Detach());
658af67cecdSGreg Clayton     }
65930fdc8d8SChris Lattner     else
66030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
66130fdc8d8SChris Lattner 
66230fdc8d8SChris Lattner     return sb_error;
66330fdc8d8SChris Lattner }
66430fdc8d8SChris Lattner 
66530fdc8d8SChris Lattner SBError
6664838131bSGreg Clayton SBProcess::Signal (int signo)
66730fdc8d8SChris Lattner {
66830fdc8d8SChris Lattner     SBError sb_error;
669acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
670acdbe816SGreg Clayton     if (process_sp)
671af67cecdSGreg Clayton     {
672acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
673acdbe816SGreg Clayton         sb_error.SetError (process_sp->Signal (signo));
674af67cecdSGreg Clayton     }
67530fdc8d8SChris Lattner     else
67630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
6772d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6784838131bSGreg Clayton     if (log)
6794838131bSGreg Clayton     {
6804838131bSGreg Clayton         SBStream sstr;
6814838131bSGreg Clayton         sb_error.GetDescription (sstr);
6824838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
683acdbe816SGreg Clayton                      process_sp.get(),
6844838131bSGreg Clayton                      signo,
6854838131bSGreg Clayton                      sb_error.get(),
6864838131bSGreg Clayton                      sstr.GetData());
6874838131bSGreg Clayton     }
68830fdc8d8SChris Lattner     return sb_error;
68930fdc8d8SChris Lattner }
69030fdc8d8SChris Lattner 
69130fdc8d8SChris Lattner SBThread
6924838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
69330fdc8d8SChris Lattner {
6944838131bSGreg Clayton     SBThread sb_thread;
69517a6ad05SGreg Clayton     ThreadSP thread_sp;
696acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
697acdbe816SGreg Clayton     if (process_sp)
698af67cecdSGreg Clayton     {
699acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
700acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().FindThreadByID (tid);
70117a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
702af67cecdSGreg Clayton     }
7034838131bSGreg Clayton 
7042d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7054838131bSGreg Clayton     if (log)
7064838131bSGreg Clayton     {
70761e7a58cSGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
708acdbe816SGreg Clayton                      process_sp.get(),
7094838131bSGreg Clayton                      tid,
71017a6ad05SGreg Clayton                      thread_sp.get());
7114838131bSGreg Clayton     }
7124838131bSGreg Clayton 
7134838131bSGreg Clayton     return sb_thread;
71430fdc8d8SChris Lattner }
71530fdc8d8SChris Lattner 
71630fdc8d8SChris Lattner StateType
71730fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
71830fdc8d8SChris Lattner {
7192d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
720ceb6b139SCaroline Tice 
721ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
722ceb6b139SCaroline Tice 
723ceb6b139SCaroline Tice     if (log)
724cfd1acedSGreg Clayton         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
725750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
726ceb6b139SCaroline Tice 
727ceb6b139SCaroline Tice     return ret_val;
72830fdc8d8SChris Lattner }
72930fdc8d8SChris Lattner 
73030fdc8d8SChris Lattner bool
73130fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
73230fdc8d8SChris Lattner {
7336611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
73430fdc8d8SChris Lattner }
73530fdc8d8SChris Lattner 
73630fdc8d8SChris Lattner SBProcess
73730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
73830fdc8d8SChris Lattner {
7396611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
74030fdc8d8SChris Lattner     return process;
74130fdc8d8SChris Lattner }
74230fdc8d8SChris Lattner 
743*e6bc6cb9SJim Ingham bool
744*e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event)
745*e6bc6cb9SJim Ingham {
746*e6bc6cb9SJim Ingham     return Process::ProcessEventData::GetEventDataFromEvent(event.get()) != NULL;
747*e6bc6cb9SJim Ingham }
74830fdc8d8SChris Lattner 
74930fdc8d8SChris Lattner SBBroadcaster
75030fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
75130fdc8d8SChris Lattner {
7522d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
753ceb6b139SCaroline Tice 
754acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
755acdbe816SGreg Clayton 
756acdbe816SGreg Clayton     SBBroadcaster broadcaster(process_sp.get(), false);
757ceb6b139SCaroline Tice 
758ceb6b139SCaroline Tice     if (log)
759acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  process_sp.get(),
760750cd175SCaroline Tice                      broadcaster.get());
761ceb6b139SCaroline Tice 
76230fdc8d8SChris Lattner     return broadcaster;
76330fdc8d8SChris Lattner }
76430fdc8d8SChris Lattner 
76530fdc8d8SChris Lattner size_t
76630fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
76730fdc8d8SChris Lattner {
7682d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
769ceb6b139SCaroline Tice 
77030fdc8d8SChris Lattner     size_t bytes_read = 0;
77130fdc8d8SChris Lattner 
772acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
773acdbe816SGreg Clayton 
7744838131bSGreg Clayton     if (log)
7754838131bSGreg Clayton     {
7764838131bSGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
777acdbe816SGreg Clayton                      process_sp.get(),
7784838131bSGreg Clayton                      addr,
7794838131bSGreg Clayton                      dst,
780c91d804aSGreg Clayton                      dst_len,
7814838131bSGreg Clayton                      sb_error.get());
7824838131bSGreg Clayton     }
7834838131bSGreg Clayton 
784acdbe816SGreg Clayton     if (process_sp)
78530fdc8d8SChris Lattner     {
78630fdc8d8SChris Lattner         Error error;
787acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
788acdbe816SGreg Clayton         bytes_read = process_sp->ReadMemory (addr, dst, dst_len, error);
78930fdc8d8SChris Lattner         sb_error.SetError (error);
79030fdc8d8SChris Lattner     }
79130fdc8d8SChris Lattner     else
79230fdc8d8SChris Lattner     {
79330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
79430fdc8d8SChris Lattner     }
79530fdc8d8SChris Lattner 
796ceb6b139SCaroline Tice     if (log)
79793aa84e8SGreg Clayton     {
79893aa84e8SGreg Clayton         SBStream sstr;
79993aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
800c91d804aSGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
801acdbe816SGreg Clayton                      process_sp.get(),
80293aa84e8SGreg Clayton                      addr,
80393aa84e8SGreg Clayton                      dst,
804c91d804aSGreg Clayton                      dst_len,
80593aa84e8SGreg Clayton                      sb_error.get(),
80693aa84e8SGreg Clayton                      sstr.GetData(),
807c91d804aSGreg Clayton                      bytes_read);
80893aa84e8SGreg Clayton     }
809ceb6b139SCaroline Tice 
81030fdc8d8SChris Lattner     return bytes_read;
81130fdc8d8SChris Lattner }
81230fdc8d8SChris Lattner 
81330fdc8d8SChris Lattner size_t
814e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
815e91b7957SGreg Clayton {
816e91b7957SGreg Clayton     size_t bytes_read = 0;
817acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
818acdbe816SGreg Clayton     if (process_sp)
819e91b7957SGreg Clayton     {
820e91b7957SGreg Clayton         Error error;
821acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
822acdbe816SGreg Clayton         bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, error);
823e91b7957SGreg Clayton         sb_error.SetError (error);
824e91b7957SGreg Clayton     }
825e91b7957SGreg Clayton     else
826e91b7957SGreg Clayton     {
827e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
828e91b7957SGreg Clayton     }
829e91b7957SGreg Clayton     return bytes_read;
830e91b7957SGreg Clayton }
831e91b7957SGreg Clayton 
832e91b7957SGreg Clayton uint64_t
833e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
834e91b7957SGreg Clayton {
835acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
836acdbe816SGreg Clayton     if (process_sp)
837e91b7957SGreg Clayton     {
838e91b7957SGreg Clayton         Error error;
839acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
840acdbe816SGreg Clayton         uint64_t value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error);
841e91b7957SGreg Clayton         sb_error.SetError (error);
842e91b7957SGreg Clayton         return value;
843e91b7957SGreg Clayton     }
844e91b7957SGreg Clayton     else
845e91b7957SGreg Clayton     {
846e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
847e91b7957SGreg Clayton     }
848e91b7957SGreg Clayton     return 0;
849e91b7957SGreg Clayton }
850e91b7957SGreg Clayton 
851e91b7957SGreg Clayton lldb::addr_t
852e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
853e91b7957SGreg Clayton {
854e91b7957SGreg Clayton     lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
855acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
856acdbe816SGreg Clayton     if (process_sp)
857e91b7957SGreg Clayton     {
858e91b7957SGreg Clayton         Error error;
859acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
860acdbe816SGreg Clayton         ptr = process_sp->ReadPointerFromMemory (addr, error);
861e91b7957SGreg Clayton         sb_error.SetError (error);
862e91b7957SGreg Clayton     }
863e91b7957SGreg Clayton     else
864e91b7957SGreg Clayton     {
865e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
866e91b7957SGreg Clayton     }
867e91b7957SGreg Clayton     return ptr;
868e91b7957SGreg Clayton }
869e91b7957SGreg Clayton 
870e91b7957SGreg Clayton size_t
87130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
87230fdc8d8SChris Lattner {
87330fdc8d8SChris Lattner     size_t bytes_written = 0;
87430fdc8d8SChris Lattner 
8752d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
876acdbe816SGreg Clayton 
877acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
878acdbe816SGreg Clayton 
8794838131bSGreg Clayton     if (log)
8804838131bSGreg Clayton     {
8814838131bSGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
882acdbe816SGreg Clayton                      process_sp.get(),
8834838131bSGreg Clayton                      addr,
8844838131bSGreg Clayton                      src,
885c91d804aSGreg Clayton                      src_len,
8864838131bSGreg Clayton                      sb_error.get());
8874838131bSGreg Clayton     }
8884838131bSGreg Clayton 
889acdbe816SGreg Clayton     if (process_sp)
89030fdc8d8SChris Lattner     {
89130fdc8d8SChris Lattner         Error error;
892acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
893acdbe816SGreg Clayton         bytes_written = process_sp->WriteMemory (addr, src, src_len, error);
89430fdc8d8SChris Lattner         sb_error.SetError (error);
89530fdc8d8SChris Lattner     }
89630fdc8d8SChris Lattner 
8974838131bSGreg Clayton     if (log)
8984838131bSGreg Clayton     {
8994838131bSGreg Clayton         SBStream sstr;
9004838131bSGreg Clayton         sb_error.GetDescription (sstr);
901c91d804aSGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
902acdbe816SGreg Clayton                      process_sp.get(),
9034838131bSGreg Clayton                      addr,
9044838131bSGreg Clayton                      src,
905c91d804aSGreg Clayton                      src_len,
9064838131bSGreg Clayton                      sb_error.get(),
9074838131bSGreg Clayton                      sstr.GetData(),
908c91d804aSGreg Clayton                      bytes_written);
9094838131bSGreg Clayton     }
9104838131bSGreg Clayton 
91130fdc8d8SChris Lattner     return bytes_written;
91230fdc8d8SChris Lattner }
91330fdc8d8SChris Lattner 
914dde9cff3SCaroline Tice bool
915dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
916dde9cff3SCaroline Tice {
917da7bc7d0SGreg Clayton     Stream &strm = description.ref();
918da7bc7d0SGreg Clayton 
919acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
920acdbe816SGreg Clayton     if (process_sp)
921dde9cff3SCaroline Tice     {
922dde9cff3SCaroline Tice         char path[PATH_MAX];
923dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
924acdbe816SGreg Clayton         Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
9251d273166SGreg Clayton         const char *exe_name = NULL;
9261d273166SGreg Clayton         if (exe_module)
9271d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
9281d273166SGreg Clayton 
929da7bc7d0SGreg Clayton         strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
930acdbe816SGreg Clayton                      process_sp->GetID(),
931ceb6b139SCaroline Tice                      lldb_private::StateAsCString (GetState()),
9321d273166SGreg Clayton                      GetNumThreads(),
93305faeb71SGreg Clayton                      exe_name ? ", executable = " : "",
9341d273166SGreg Clayton                      exe_name ? exe_name : "");
935dde9cff3SCaroline Tice     }
936dde9cff3SCaroline Tice     else
937da7bc7d0SGreg Clayton         strm.PutCString ("No value");
938dde9cff3SCaroline Tice 
939dde9cff3SCaroline Tice     return true;
940dde9cff3SCaroline Tice }
9418f343b09SGreg Clayton 
9428f343b09SGreg Clayton uint32_t
9438f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
9448f343b09SGreg Clayton {
945acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
946acdbe816SGreg Clayton     if (process_sp)
947af67cecdSGreg Clayton     {
948acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
949acdbe816SGreg Clayton         return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
950af67cecdSGreg Clayton     }
9518f343b09SGreg Clayton     return LLDB_INVALID_IMAGE_TOKEN;
9528f343b09SGreg Clayton }
9538f343b09SGreg Clayton 
9548f343b09SGreg Clayton lldb::SBError
9558f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token)
9568f343b09SGreg Clayton {
9578f343b09SGreg Clayton     lldb::SBError sb_error;
958acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
959acdbe816SGreg Clayton     if (process_sp)
960af67cecdSGreg Clayton     {
961acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
962acdbe816SGreg Clayton         sb_error.SetError (process_sp->UnloadImage (image_token));
963af67cecdSGreg Clayton     }
9648f343b09SGreg Clayton     else
9658f343b09SGreg Clayton         sb_error.SetErrorString("invalid process");
9668f343b09SGreg Clayton     return sb_error;
9678f343b09SGreg Clayton }
968