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"
1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h"
1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.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"
33*dde9cff3SCaroline 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 
6230fdc8d8SChris Lattner //----------------------------------------------------------------------
6330fdc8d8SChris Lattner // Destructor
6430fdc8d8SChris Lattner //----------------------------------------------------------------------
6530fdc8d8SChris Lattner SBProcess::~SBProcess()
6630fdc8d8SChris Lattner {
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
6930fdc8d8SChris Lattner void
7030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
7130fdc8d8SChris Lattner {
726611103cSGreg Clayton     m_opaque_sp = process_sp;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner void
7630fdc8d8SChris Lattner SBProcess::Clear ()
7730fdc8d8SChris Lattner {
786611103cSGreg Clayton     m_opaque_sp.reset();
7930fdc8d8SChris Lattner }
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner 
8230fdc8d8SChris Lattner bool
8330fdc8d8SChris Lattner SBProcess::IsValid() const
8430fdc8d8SChris Lattner {
856611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner uint32_t
9030fdc8d8SChris Lattner SBProcess::GetNumThreads ()
9130fdc8d8SChris Lattner {
926611103cSGreg Clayton     if (m_opaque_sp)
9330fdc8d8SChris Lattner     {
9430fdc8d8SChris Lattner         const bool can_update = true;
956611103cSGreg Clayton         return m_opaque_sp->GetThreadList().GetSize(can_update);
9630fdc8d8SChris Lattner     }
9730fdc8d8SChris Lattner     return 0;
9830fdc8d8SChris Lattner }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner SBThread
1012976d00aSJim Ingham SBProcess::GetSelectedThread () const
10230fdc8d8SChris Lattner {
10330fdc8d8SChris Lattner     SBThread sb_thread;
1046611103cSGreg Clayton     if (m_opaque_sp)
1052976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
10630fdc8d8SChris Lattner     return sb_thread;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner SBTarget
11030fdc8d8SChris Lattner SBProcess::GetTarget() const
11130fdc8d8SChris Lattner {
11230fdc8d8SChris Lattner     SBTarget sb_target;
1136611103cSGreg Clayton     if (m_opaque_sp)
1146611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
11530fdc8d8SChris Lattner     return sb_target;
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner size_t
12030fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
12130fdc8d8SChris Lattner {
1226611103cSGreg Clayton     if (m_opaque_sp != NULL)
12330fdc8d8SChris Lattner     {
12430fdc8d8SChris Lattner         Error error;
1256611103cSGreg Clayton         return m_opaque_sp->PutSTDIN (src, src_len, error);
12630fdc8d8SChris Lattner     }
12730fdc8d8SChris Lattner     else
12830fdc8d8SChris Lattner         return 0;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner size_t
13230fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
13330fdc8d8SChris Lattner {
1346611103cSGreg Clayton     if (m_opaque_sp != NULL)
13530fdc8d8SChris Lattner     {
13630fdc8d8SChris Lattner         Error error;
1376611103cSGreg Clayton         return m_opaque_sp->GetSTDOUT (dst, dst_len, error);
13830fdc8d8SChris Lattner     }
13930fdc8d8SChris Lattner     else
14030fdc8d8SChris Lattner         return 0;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner size_t
14430fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
14530fdc8d8SChris Lattner {
1466611103cSGreg Clayton     if (m_opaque_sp != NULL)
14730fdc8d8SChris Lattner     {
14830fdc8d8SChris Lattner         Error error;
1496611103cSGreg Clayton         return m_opaque_sp->GetSTDERR (dst, dst_len, error);
15030fdc8d8SChris Lattner     }
15130fdc8d8SChris Lattner     else
15230fdc8d8SChris Lattner         return 0;
15330fdc8d8SChris Lattner }
15430fdc8d8SChris Lattner 
15530fdc8d8SChris Lattner void
1562976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
15730fdc8d8SChris Lattner {
15830fdc8d8SChris Lattner     if (out == NULL)
15930fdc8d8SChris Lattner         return;
16030fdc8d8SChris Lattner 
1616611103cSGreg Clayton     if (m_opaque_sp != NULL)
16230fdc8d8SChris Lattner     {
16330fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
16430fdc8d8SChris Lattner         char message[1024];
16530fdc8d8SChris Lattner         int message_len = ::snprintf (message,
16630fdc8d8SChris Lattner                                       sizeof (message),
16730fdc8d8SChris Lattner                                       "Process %d %s\n",
1686611103cSGreg Clayton                                       m_opaque_sp->GetID(),
16930fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner         if (message_len > 0)
17230fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
17330fdc8d8SChris Lattner     }
17430fdc8d8SChris Lattner }
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner void
1772976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
17830fdc8d8SChris Lattner {
1796611103cSGreg Clayton     if (m_opaque_sp != NULL)
18030fdc8d8SChris Lattner     {
18130fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
18230fdc8d8SChris Lattner         char message[1024];
18330fdc8d8SChris Lattner         ::snprintf (message,
18430fdc8d8SChris Lattner                     sizeof (message),
18530fdc8d8SChris Lattner                     "Process %d %s\n",
1866611103cSGreg Clayton                     m_opaque_sp->GetID(),
18730fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner         result.AppendMessage (message);
19030fdc8d8SChris Lattner     }
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner bool
1942976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
19530fdc8d8SChris Lattner {
1966611103cSGreg Clayton     if (m_opaque_sp != NULL)
1972976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
19830fdc8d8SChris Lattner     return false;
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner bool
2022976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
20330fdc8d8SChris Lattner {
2046611103cSGreg Clayton     if (m_opaque_sp != NULL)
2052976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
20630fdc8d8SChris Lattner     return false;
20730fdc8d8SChris Lattner }
20830fdc8d8SChris Lattner 
20930fdc8d8SChris Lattner SBThread
21030fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
21130fdc8d8SChris Lattner {
21230fdc8d8SChris Lattner     SBThread thread;
2136611103cSGreg Clayton     if (m_opaque_sp)
2146611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
21530fdc8d8SChris Lattner     return thread;
21630fdc8d8SChris Lattner }
21730fdc8d8SChris Lattner 
21830fdc8d8SChris Lattner StateType
21930fdc8d8SChris Lattner SBProcess::GetState ()
22030fdc8d8SChris Lattner {
2216611103cSGreg Clayton     if (m_opaque_sp != NULL)
2226611103cSGreg Clayton         return m_opaque_sp->GetState();
22330fdc8d8SChris Lattner     else
22430fdc8d8SChris Lattner         return eStateInvalid;
22530fdc8d8SChris Lattner }
22630fdc8d8SChris Lattner 
22730fdc8d8SChris Lattner 
22830fdc8d8SChris Lattner int
22930fdc8d8SChris Lattner SBProcess::GetExitStatus ()
23030fdc8d8SChris Lattner {
2316611103cSGreg Clayton     if (m_opaque_sp != NULL)
2326611103cSGreg Clayton         return m_opaque_sp->GetExitStatus ();
23330fdc8d8SChris Lattner     else
23430fdc8d8SChris Lattner         return 0;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner const char *
23830fdc8d8SChris Lattner SBProcess::GetExitDescription ()
23930fdc8d8SChris Lattner {
2406611103cSGreg Clayton     if (m_opaque_sp != NULL)
2416611103cSGreg Clayton         return m_opaque_sp->GetExitDescription ();
24230fdc8d8SChris Lattner     else
24330fdc8d8SChris Lattner         return NULL;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner lldb::pid_t
24730fdc8d8SChris Lattner SBProcess::GetProcessID ()
24830fdc8d8SChris Lattner {
2496611103cSGreg Clayton     if (m_opaque_sp)
2506611103cSGreg Clayton         return m_opaque_sp->GetID();
25130fdc8d8SChris Lattner     else
25230fdc8d8SChris Lattner         return LLDB_INVALID_PROCESS_ID;
25330fdc8d8SChris Lattner }
25430fdc8d8SChris Lattner 
25530fdc8d8SChris Lattner uint32_t
25630fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
25730fdc8d8SChris Lattner {
2586611103cSGreg Clayton     if (m_opaque_sp)
2596611103cSGreg Clayton         return m_opaque_sp->GetAddressByteSize();
26030fdc8d8SChris Lattner     else
26130fdc8d8SChris Lattner         return 0;
26230fdc8d8SChris Lattner }
26330fdc8d8SChris Lattner 
26430fdc8d8SChris Lattner bool
26530fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
26630fdc8d8SChris Lattner {
26730fdc8d8SChris Lattner     bool state_changed = false;
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner     if (IsValid())
27030fdc8d8SChris Lattner     {
27130fdc8d8SChris Lattner         EventSP event_sp;
2726611103cSGreg Clayton         StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27330fdc8d8SChris Lattner 
27430fdc8d8SChris Lattner         while (StateIsStoppedState (state))
27530fdc8d8SChris Lattner         {
2766611103cSGreg Clayton             state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27730fdc8d8SChris Lattner             SBEvent event (event_sp);
2782976d00aSJim Ingham             AppendEventStateReport (event, result);
27930fdc8d8SChris Lattner             state_changed = true;
28030fdc8d8SChris Lattner         }
28130fdc8d8SChris Lattner     }
28230fdc8d8SChris Lattner     return state_changed;
28330fdc8d8SChris Lattner }
28430fdc8d8SChris Lattner 
28530fdc8d8SChris Lattner SBError
28630fdc8d8SChris Lattner SBProcess::Continue ()
28730fdc8d8SChris Lattner {
28830fdc8d8SChris Lattner     SBError sb_error;
28930fdc8d8SChris Lattner     if (IsValid())
2906611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Resume());
29130fdc8d8SChris Lattner     else
29230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
29330fdc8d8SChris Lattner 
29430fdc8d8SChris Lattner     return sb_error;
29530fdc8d8SChris Lattner }
29630fdc8d8SChris Lattner 
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner SBError
29930fdc8d8SChris Lattner SBProcess::Destroy ()
30030fdc8d8SChris Lattner {
30130fdc8d8SChris Lattner     SBError sb_error;
3026611103cSGreg Clayton     if (m_opaque_sp)
3036611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
30430fdc8d8SChris Lattner     else
30530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
30630fdc8d8SChris Lattner 
30730fdc8d8SChris Lattner     return sb_error;
30830fdc8d8SChris Lattner }
30930fdc8d8SChris Lattner 
31030fdc8d8SChris Lattner 
31130fdc8d8SChris Lattner SBError
31230fdc8d8SChris Lattner SBProcess::Stop ()
31330fdc8d8SChris Lattner {
31430fdc8d8SChris Lattner     SBError sb_error;
31530fdc8d8SChris Lattner     if (IsValid())
3166611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
31730fdc8d8SChris Lattner     else
31830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
31930fdc8d8SChris Lattner     return sb_error;
32030fdc8d8SChris Lattner }
32130fdc8d8SChris Lattner 
32230fdc8d8SChris Lattner SBError
32330fdc8d8SChris Lattner SBProcess::Kill ()
32430fdc8d8SChris Lattner {
32530fdc8d8SChris Lattner     SBError sb_error;
3266611103cSGreg Clayton     if (m_opaque_sp)
3276611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
32830fdc8d8SChris Lattner     else
32930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
33030fdc8d8SChris Lattner     return sb_error;
33130fdc8d8SChris Lattner }
33230fdc8d8SChris Lattner 
33330fdc8d8SChris Lattner 
33430fdc8d8SChris Lattner SBError
33530fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
33630fdc8d8SChris Lattner {
33730fdc8d8SChris Lattner     SBError sb_error;
3386611103cSGreg Clayton     if (m_opaque_sp)
3396611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
34030fdc8d8SChris Lattner     else
34130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
34230fdc8d8SChris Lattner     return sb_error;
34330fdc8d8SChris Lattner }
34430fdc8d8SChris Lattner 
34530fdc8d8SChris Lattner lldb::pid_t
34630fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
34730fdc8d8SChris Lattner {
34830fdc8d8SChris Lattner     Attach (attach_pid);
34930fdc8d8SChris Lattner     return GetProcessID();
35030fdc8d8SChris Lattner }
35130fdc8d8SChris Lattner 
35230fdc8d8SChris Lattner 
35330fdc8d8SChris Lattner SBError
35430fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
35530fdc8d8SChris Lattner {
35630fdc8d8SChris Lattner     SBError sb_error;
3576611103cSGreg Clayton     if (m_opaque_sp)
3586611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
35930fdc8d8SChris Lattner     else
36030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
36130fdc8d8SChris Lattner     return sb_error;
36230fdc8d8SChris Lattner }
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner SBError
36530fdc8d8SChris Lattner SBProcess::Detach ()
36630fdc8d8SChris Lattner {
36730fdc8d8SChris Lattner     SBError sb_error;
3686611103cSGreg Clayton     if (m_opaque_sp)
3696611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
37030fdc8d8SChris Lattner     else
37130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner     return sb_error;
37430fdc8d8SChris Lattner }
37530fdc8d8SChris Lattner 
37630fdc8d8SChris Lattner SBError
37730fdc8d8SChris Lattner SBProcess::Signal (int signal)
37830fdc8d8SChris Lattner {
37930fdc8d8SChris Lattner     SBError sb_error;
3806611103cSGreg Clayton     if (m_opaque_sp)
3816611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signal));
38230fdc8d8SChris Lattner     else
38330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
38430fdc8d8SChris Lattner     return sb_error;
38530fdc8d8SChris Lattner }
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner SBThread
38830fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
38930fdc8d8SChris Lattner {
39030fdc8d8SChris Lattner     SBThread thread;
3916611103cSGreg Clayton     if (m_opaque_sp)
3926611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
39330fdc8d8SChris Lattner     return thread;
39430fdc8d8SChris Lattner }
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner StateType
39730fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
39830fdc8d8SChris Lattner {
3996611103cSGreg Clayton     return Process::ProcessEventData::GetStateFromEvent (event.get());
40030fdc8d8SChris Lattner }
40130fdc8d8SChris Lattner 
40230fdc8d8SChris Lattner bool
40330fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
40430fdc8d8SChris Lattner {
4056611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
40630fdc8d8SChris Lattner }
40730fdc8d8SChris Lattner 
40830fdc8d8SChris Lattner SBProcess
40930fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
41030fdc8d8SChris Lattner {
4116611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
41230fdc8d8SChris Lattner     return process;
41330fdc8d8SChris Lattner }
41430fdc8d8SChris Lattner 
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner SBBroadcaster
41730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
41830fdc8d8SChris Lattner {
4196611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
42030fdc8d8SChris Lattner     return broadcaster;
42130fdc8d8SChris Lattner }
42230fdc8d8SChris Lattner 
42330fdc8d8SChris Lattner lldb_private::Process *
42430fdc8d8SChris Lattner SBProcess::operator->() const
42530fdc8d8SChris Lattner {
4266611103cSGreg Clayton     return m_opaque_sp.get();
42730fdc8d8SChris Lattner }
42830fdc8d8SChris Lattner 
42930fdc8d8SChris Lattner size_t
43030fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
43130fdc8d8SChris Lattner {
43230fdc8d8SChris Lattner     size_t bytes_read = 0;
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner     if (IsValid())
43530fdc8d8SChris Lattner     {
43630fdc8d8SChris Lattner         Error error;
4376611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
43830fdc8d8SChris Lattner         sb_error.SetError (error);
43930fdc8d8SChris Lattner     }
44030fdc8d8SChris Lattner     else
44130fdc8d8SChris Lattner     {
44230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
44330fdc8d8SChris Lattner     }
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner     return bytes_read;
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
44830fdc8d8SChris Lattner size_t
44930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
45030fdc8d8SChris Lattner {
45130fdc8d8SChris Lattner     size_t bytes_written = 0;
45230fdc8d8SChris Lattner 
45330fdc8d8SChris Lattner     if (IsValid())
45430fdc8d8SChris Lattner     {
45530fdc8d8SChris Lattner         Error error;
4566611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
45730fdc8d8SChris Lattner         sb_error.SetError (error);
45830fdc8d8SChris Lattner     }
45930fdc8d8SChris Lattner 
46030fdc8d8SChris Lattner     return bytes_written;
46130fdc8d8SChris Lattner }
46230fdc8d8SChris Lattner 
46330fdc8d8SChris Lattner // Mimic shared pointer...
46430fdc8d8SChris Lattner lldb_private::Process *
46530fdc8d8SChris Lattner SBProcess::get() const
46630fdc8d8SChris Lattner {
4676611103cSGreg Clayton     return m_opaque_sp.get();
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
470*dde9cff3SCaroline Tice bool
471*dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
472*dde9cff3SCaroline Tice {
473*dde9cff3SCaroline Tice     if (m_opaque_sp)
474*dde9cff3SCaroline Tice     {
475*dde9cff3SCaroline Tice         char path[PATH_MAX];
476*dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
477*dde9cff3SCaroline Tice         description.Printf ("Process {pid: %d, executable %s\n", (int) GetProcessID(), path);
478*dde9cff3SCaroline Tice         description.Printf ("         instance name: %s, state: %s, thread cnt: %d}",
479*dde9cff3SCaroline Tice                             m_opaque_sp->GetInstanceName().AsCString(),
480*dde9cff3SCaroline Tice                             SBDebugger::StateAsCString (GetState()),
481*dde9cff3SCaroline Tice                             GetNumThreads());
482*dde9cff3SCaroline Tice     }
483*dde9cff3SCaroline Tice     else
484*dde9cff3SCaroline Tice         description.Printf ("No value");
485*dde9cff3SCaroline Tice 
486*dde9cff3SCaroline Tice     return true;
487*dde9cff3SCaroline Tice }
488*dde9cff3SCaroline Tice 
489*dde9cff3SCaroline Tice PyObject *
490*dde9cff3SCaroline Tice SBProcess::__repr__ ()
491*dde9cff3SCaroline Tice {
492*dde9cff3SCaroline Tice     SBStream description;
493*dde9cff3SCaroline Tice     GetDescription (description);
494*dde9cff3SCaroline Tice     return PyString_FromString (description.GetData());
495*dde9cff3SCaroline Tice }
496