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"
334c5de699SEli Friedman #include "lldb/API/SBStringList.h"
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner using namespace lldb;
3630fdc8d8SChris Lattner using namespace lldb_private;
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner SBProcess::SBProcess () :
416611103cSGreg Clayton     m_opaque_sp()
4230fdc8d8SChris Lattner {
4330fdc8d8SChris Lattner }
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner //----------------------------------------------------------------------
4730fdc8d8SChris Lattner // SBProcess constructor
4830fdc8d8SChris Lattner //----------------------------------------------------------------------
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
516611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
576611103cSGreg Clayton     m_opaque_sp (process_sp)
5830fdc8d8SChris Lattner {
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
6130fdc8d8SChris Lattner //----------------------------------------------------------------------
6230fdc8d8SChris Lattner // Destructor
6330fdc8d8SChris Lattner //----------------------------------------------------------------------
6430fdc8d8SChris Lattner SBProcess::~SBProcess()
6530fdc8d8SChris Lattner {
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner void
6930fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
7030fdc8d8SChris Lattner {
716611103cSGreg Clayton     m_opaque_sp = process_sp;
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner void
7530fdc8d8SChris Lattner SBProcess::Clear ()
7630fdc8d8SChris Lattner {
776611103cSGreg Clayton     m_opaque_sp.reset();
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner bool
8230fdc8d8SChris Lattner SBProcess::IsValid() const
8330fdc8d8SChris Lattner {
846611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner uint32_t
8930fdc8d8SChris Lattner SBProcess::GetNumThreads ()
9030fdc8d8SChris Lattner {
916611103cSGreg Clayton     if (m_opaque_sp)
9230fdc8d8SChris Lattner     {
9330fdc8d8SChris Lattner         const bool can_update = true;
946611103cSGreg Clayton         return m_opaque_sp->GetThreadList().GetSize(can_update);
9530fdc8d8SChris Lattner     }
9630fdc8d8SChris Lattner     return 0;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner SBThread
100*2976d00aSJim Ingham SBProcess::GetSelectedThread () const
10130fdc8d8SChris Lattner {
10230fdc8d8SChris Lattner     SBThread sb_thread;
1036611103cSGreg Clayton     if (m_opaque_sp)
104*2976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
10530fdc8d8SChris Lattner     return sb_thread;
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner SBTarget
10930fdc8d8SChris Lattner SBProcess::GetTarget() const
11030fdc8d8SChris Lattner {
11130fdc8d8SChris Lattner     SBTarget sb_target;
1126611103cSGreg Clayton     if (m_opaque_sp)
1136611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
11430fdc8d8SChris Lattner     return sb_target;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner size_t
11930fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
12030fdc8d8SChris Lattner {
1216611103cSGreg Clayton     if (m_opaque_sp != NULL)
12230fdc8d8SChris Lattner     {
12330fdc8d8SChris Lattner         Error error;
1246611103cSGreg Clayton         return m_opaque_sp->PutSTDIN (src, src_len, error);
12530fdc8d8SChris Lattner     }
12630fdc8d8SChris Lattner     else
12730fdc8d8SChris Lattner         return 0;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner size_t
13130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
13230fdc8d8SChris Lattner {
1336611103cSGreg Clayton     if (m_opaque_sp != NULL)
13430fdc8d8SChris Lattner     {
13530fdc8d8SChris Lattner         Error error;
1366611103cSGreg Clayton         return m_opaque_sp->GetSTDOUT (dst, dst_len, error);
13730fdc8d8SChris Lattner     }
13830fdc8d8SChris Lattner     else
13930fdc8d8SChris Lattner         return 0;
14030fdc8d8SChris Lattner }
14130fdc8d8SChris Lattner 
14230fdc8d8SChris Lattner size_t
14330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
14430fdc8d8SChris Lattner {
1456611103cSGreg Clayton     if (m_opaque_sp != NULL)
14630fdc8d8SChris Lattner     {
14730fdc8d8SChris Lattner         Error error;
1486611103cSGreg Clayton         return m_opaque_sp->GetSTDERR (dst, dst_len, error);
14930fdc8d8SChris Lattner     }
15030fdc8d8SChris Lattner     else
15130fdc8d8SChris Lattner         return 0;
15230fdc8d8SChris Lattner }
15330fdc8d8SChris Lattner 
15430fdc8d8SChris Lattner void
155*2976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
15630fdc8d8SChris Lattner {
15730fdc8d8SChris Lattner     if (out == NULL)
15830fdc8d8SChris Lattner         return;
15930fdc8d8SChris Lattner 
1606611103cSGreg Clayton     if (m_opaque_sp != NULL)
16130fdc8d8SChris Lattner     {
16230fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
16330fdc8d8SChris Lattner         char message[1024];
16430fdc8d8SChris Lattner         int message_len = ::snprintf (message,
16530fdc8d8SChris Lattner                                       sizeof (message),
16630fdc8d8SChris Lattner                                       "Process %d %s\n",
1676611103cSGreg Clayton                                       m_opaque_sp->GetID(),
16830fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner         if (message_len > 0)
17130fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
17230fdc8d8SChris Lattner     }
17330fdc8d8SChris Lattner }
17430fdc8d8SChris Lattner 
17530fdc8d8SChris Lattner void
176*2976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
17730fdc8d8SChris Lattner {
1786611103cSGreg Clayton     if (m_opaque_sp != NULL)
17930fdc8d8SChris Lattner     {
18030fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
18130fdc8d8SChris Lattner         char message[1024];
18230fdc8d8SChris Lattner         ::snprintf (message,
18330fdc8d8SChris Lattner                     sizeof (message),
18430fdc8d8SChris Lattner                     "Process %d %s\n",
1856611103cSGreg Clayton                     m_opaque_sp->GetID(),
18630fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner         result.AppendMessage (message);
18930fdc8d8SChris Lattner     }
19030fdc8d8SChris Lattner }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner bool
193*2976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     if (m_opaque_sp != NULL)
196*2976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
19730fdc8d8SChris Lattner     return false;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner bool
201*2976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
20230fdc8d8SChris Lattner {
2036611103cSGreg Clayton     if (m_opaque_sp != NULL)
204*2976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
20530fdc8d8SChris Lattner     return false;
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner SBThread
20930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
21030fdc8d8SChris Lattner {
21130fdc8d8SChris Lattner     SBThread thread;
2126611103cSGreg Clayton     if (m_opaque_sp)
2136611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
21430fdc8d8SChris Lattner     return thread;
21530fdc8d8SChris Lattner }
21630fdc8d8SChris Lattner 
21730fdc8d8SChris Lattner StateType
21830fdc8d8SChris Lattner SBProcess::GetState ()
21930fdc8d8SChris Lattner {
2206611103cSGreg Clayton     if (m_opaque_sp != NULL)
2216611103cSGreg Clayton         return m_opaque_sp->GetState();
22230fdc8d8SChris Lattner     else
22330fdc8d8SChris Lattner         return eStateInvalid;
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner 
22730fdc8d8SChris Lattner int
22830fdc8d8SChris Lattner SBProcess::GetExitStatus ()
22930fdc8d8SChris Lattner {
2306611103cSGreg Clayton     if (m_opaque_sp != NULL)
2316611103cSGreg Clayton         return m_opaque_sp->GetExitStatus ();
23230fdc8d8SChris Lattner     else
23330fdc8d8SChris Lattner         return 0;
23430fdc8d8SChris Lattner }
23530fdc8d8SChris Lattner 
23630fdc8d8SChris Lattner const char *
23730fdc8d8SChris Lattner SBProcess::GetExitDescription ()
23830fdc8d8SChris Lattner {
2396611103cSGreg Clayton     if (m_opaque_sp != NULL)
2406611103cSGreg Clayton         return m_opaque_sp->GetExitDescription ();
24130fdc8d8SChris Lattner     else
24230fdc8d8SChris Lattner         return NULL;
24330fdc8d8SChris Lattner }
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner lldb::pid_t
24630fdc8d8SChris Lattner SBProcess::GetProcessID ()
24730fdc8d8SChris Lattner {
2486611103cSGreg Clayton     if (m_opaque_sp)
2496611103cSGreg Clayton         return m_opaque_sp->GetID();
25030fdc8d8SChris Lattner     else
25130fdc8d8SChris Lattner         return LLDB_INVALID_PROCESS_ID;
25230fdc8d8SChris Lattner }
25330fdc8d8SChris Lattner 
25430fdc8d8SChris Lattner uint32_t
25530fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
25630fdc8d8SChris Lattner {
2576611103cSGreg Clayton     if (m_opaque_sp)
2586611103cSGreg Clayton         return m_opaque_sp->GetAddressByteSize();
25930fdc8d8SChris Lattner     else
26030fdc8d8SChris Lattner         return 0;
26130fdc8d8SChris Lattner }
26230fdc8d8SChris Lattner 
26330fdc8d8SChris Lattner bool
26430fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
26530fdc8d8SChris Lattner {
26630fdc8d8SChris Lattner     bool state_changed = false;
26730fdc8d8SChris Lattner 
26830fdc8d8SChris Lattner     if (IsValid())
26930fdc8d8SChris Lattner     {
27030fdc8d8SChris Lattner         EventSP event_sp;
2716611103cSGreg Clayton         StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27230fdc8d8SChris Lattner 
27330fdc8d8SChris Lattner         while (StateIsStoppedState (state))
27430fdc8d8SChris Lattner         {
2756611103cSGreg Clayton             state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27630fdc8d8SChris Lattner             SBEvent event (event_sp);
277*2976d00aSJim Ingham             AppendEventStateReport (event, result);
27830fdc8d8SChris Lattner             state_changed = true;
27930fdc8d8SChris Lattner         }
28030fdc8d8SChris Lattner     }
28130fdc8d8SChris Lattner     return state_changed;
28230fdc8d8SChris Lattner }
28330fdc8d8SChris Lattner 
28430fdc8d8SChris Lattner SBError
28530fdc8d8SChris Lattner SBProcess::Continue ()
28630fdc8d8SChris Lattner {
28730fdc8d8SChris Lattner     SBError sb_error;
28830fdc8d8SChris Lattner     if (IsValid())
2896611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Resume());
29030fdc8d8SChris Lattner     else
29130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
29230fdc8d8SChris Lattner 
29330fdc8d8SChris Lattner     return sb_error;
29430fdc8d8SChris Lattner }
29530fdc8d8SChris Lattner 
29630fdc8d8SChris Lattner 
29730fdc8d8SChris Lattner SBError
29830fdc8d8SChris Lattner SBProcess::Destroy ()
29930fdc8d8SChris Lattner {
30030fdc8d8SChris Lattner     SBError sb_error;
3016611103cSGreg Clayton     if (m_opaque_sp)
3026611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
30330fdc8d8SChris Lattner     else
30430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner     return sb_error;
30730fdc8d8SChris Lattner }
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner 
31030fdc8d8SChris Lattner SBError
31130fdc8d8SChris Lattner SBProcess::Stop ()
31230fdc8d8SChris Lattner {
31330fdc8d8SChris Lattner     SBError sb_error;
31430fdc8d8SChris Lattner     if (IsValid())
3156611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
31630fdc8d8SChris Lattner     else
31730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
31830fdc8d8SChris Lattner     return sb_error;
31930fdc8d8SChris Lattner }
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner SBError
32230fdc8d8SChris Lattner SBProcess::Kill ()
32330fdc8d8SChris Lattner {
32430fdc8d8SChris Lattner     SBError sb_error;
3256611103cSGreg Clayton     if (m_opaque_sp)
3266611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
32730fdc8d8SChris Lattner     else
32830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
32930fdc8d8SChris Lattner     return sb_error;
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
33230fdc8d8SChris Lattner 
33330fdc8d8SChris Lattner SBError
33430fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
33530fdc8d8SChris Lattner {
33630fdc8d8SChris Lattner     SBError sb_error;
3376611103cSGreg Clayton     if (m_opaque_sp)
3386611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
33930fdc8d8SChris Lattner     else
34030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
34130fdc8d8SChris Lattner     return sb_error;
34230fdc8d8SChris Lattner }
34330fdc8d8SChris Lattner 
34430fdc8d8SChris Lattner lldb::pid_t
34530fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid)  // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
34630fdc8d8SChris Lattner {
34730fdc8d8SChris Lattner     Attach (attach_pid);
34830fdc8d8SChris Lattner     return GetProcessID();
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner 
35230fdc8d8SChris Lattner SBError
35330fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
35430fdc8d8SChris Lattner {
35530fdc8d8SChris Lattner     SBError sb_error;
3566611103cSGreg Clayton     if (m_opaque_sp)
3576611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
35830fdc8d8SChris Lattner     else
35930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
36030fdc8d8SChris Lattner     return sb_error;
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner SBError
36430fdc8d8SChris Lattner SBProcess::Detach ()
36530fdc8d8SChris Lattner {
36630fdc8d8SChris Lattner     SBError sb_error;
3676611103cSGreg Clayton     if (m_opaque_sp)
3686611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
36930fdc8d8SChris Lattner     else
37030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
37130fdc8d8SChris Lattner 
37230fdc8d8SChris Lattner     return sb_error;
37330fdc8d8SChris Lattner }
37430fdc8d8SChris Lattner 
37530fdc8d8SChris Lattner SBError
37630fdc8d8SChris Lattner SBProcess::Signal (int signal)
37730fdc8d8SChris Lattner {
37830fdc8d8SChris Lattner     SBError sb_error;
3796611103cSGreg Clayton     if (m_opaque_sp)
3806611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signal));
38130fdc8d8SChris Lattner     else
38230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
38330fdc8d8SChris Lattner     return sb_error;
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner SBThread
38730fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
38830fdc8d8SChris Lattner {
38930fdc8d8SChris Lattner     SBThread thread;
3906611103cSGreg Clayton     if (m_opaque_sp)
3916611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
39230fdc8d8SChris Lattner     return thread;
39330fdc8d8SChris Lattner }
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner StateType
39630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
39730fdc8d8SChris Lattner {
3986611103cSGreg Clayton     return Process::ProcessEventData::GetStateFromEvent (event.get());
39930fdc8d8SChris Lattner }
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner bool
40230fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
40330fdc8d8SChris Lattner {
4046611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
40530fdc8d8SChris Lattner }
40630fdc8d8SChris Lattner 
40730fdc8d8SChris Lattner SBProcess
40830fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
40930fdc8d8SChris Lattner {
4106611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
41130fdc8d8SChris Lattner     return process;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
41430fdc8d8SChris Lattner 
41530fdc8d8SChris Lattner SBBroadcaster
41630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
41730fdc8d8SChris Lattner {
4186611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
41930fdc8d8SChris Lattner     return broadcaster;
42030fdc8d8SChris Lattner }
42130fdc8d8SChris Lattner 
42230fdc8d8SChris Lattner lldb_private::Process *
42330fdc8d8SChris Lattner SBProcess::operator->() const
42430fdc8d8SChris Lattner {
4256611103cSGreg Clayton     return m_opaque_sp.get();
42630fdc8d8SChris Lattner }
42730fdc8d8SChris Lattner 
42830fdc8d8SChris Lattner size_t
42930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
43030fdc8d8SChris Lattner {
43130fdc8d8SChris Lattner     size_t bytes_read = 0;
43230fdc8d8SChris Lattner 
43330fdc8d8SChris Lattner     if (IsValid())
43430fdc8d8SChris Lattner     {
43530fdc8d8SChris Lattner         Error error;
4366611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
43730fdc8d8SChris Lattner         sb_error.SetError (error);
43830fdc8d8SChris Lattner     }
43930fdc8d8SChris Lattner     else
44030fdc8d8SChris Lattner     {
44130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
44230fdc8d8SChris Lattner     }
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner     return bytes_read;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner size_t
44830fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
44930fdc8d8SChris Lattner {
45030fdc8d8SChris Lattner     size_t bytes_written = 0;
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner     if (IsValid())
45330fdc8d8SChris Lattner     {
45430fdc8d8SChris Lattner         Error error;
4556611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
45630fdc8d8SChris Lattner         sb_error.SetError (error);
45730fdc8d8SChris Lattner     }
45830fdc8d8SChris Lattner 
45930fdc8d8SChris Lattner     return bytes_written;
46030fdc8d8SChris Lattner }
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner // Mimic shared pointer...
46330fdc8d8SChris Lattner lldb_private::Process *
46430fdc8d8SChris Lattner SBProcess::get() const
46530fdc8d8SChris Lattner {
4666611103cSGreg Clayton     return m_opaque_sp.get();
46730fdc8d8SChris Lattner }
46830fdc8d8SChris Lattner 
469