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"
185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
1930fdc8d8SChris Lattner #include "lldb/Core/State.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
246611103cSGreg Clayton #include "lldb/Target/Target.h"
256611103cSGreg Clayton #include "lldb/Target/Thread.h"
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner // Project includes
2830fdc8d8SChris Lattner 
294c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
304c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
314c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
324c5de699SEli Friedman #include "lldb/API/SBEvent.h"
334c5de699SEli Friedman #include "lldb/API/SBThread.h"
34dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
354c5de699SEli Friedman #include "lldb/API/SBStringList.h"
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner using namespace lldb;
3830fdc8d8SChris Lattner using namespace lldb_private;
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner SBProcess::SBProcess () :
436611103cSGreg Clayton     m_opaque_sp()
4430fdc8d8SChris Lattner {
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner //----------------------------------------------------------------------
4930fdc8d8SChris Lattner // SBProcess constructor
5030fdc8d8SChris Lattner //----------------------------------------------------------------------
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
536611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5430fdc8d8SChris Lattner {
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
596611103cSGreg Clayton     m_opaque_sp (process_sp)
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner //----------------------------------------------------------------------
6430fdc8d8SChris Lattner // Destructor
6530fdc8d8SChris Lattner //----------------------------------------------------------------------
6630fdc8d8SChris Lattner SBProcess::~SBProcess()
6730fdc8d8SChris Lattner {
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
7030fdc8d8SChris Lattner void
7130fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
7230fdc8d8SChris Lattner {
736611103cSGreg Clayton     m_opaque_sp = process_sp;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner void
7730fdc8d8SChris Lattner SBProcess::Clear ()
7830fdc8d8SChris Lattner {
796611103cSGreg Clayton     m_opaque_sp.reset();
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner bool
8430fdc8d8SChris Lattner SBProcess::IsValid() const
8530fdc8d8SChris Lattner {
866611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
8930fdc8d8SChris Lattner 
9030fdc8d8SChris Lattner uint32_t
9130fdc8d8SChris Lattner SBProcess::GetNumThreads ()
9230fdc8d8SChris Lattner {
936611103cSGreg Clayton     if (m_opaque_sp)
9430fdc8d8SChris Lattner     {
9530fdc8d8SChris Lattner         const bool can_update = true;
966611103cSGreg Clayton         return m_opaque_sp->GetThreadList().GetSize(can_update);
9730fdc8d8SChris Lattner     }
9830fdc8d8SChris Lattner     return 0;
9930fdc8d8SChris Lattner }
10030fdc8d8SChris Lattner 
10130fdc8d8SChris Lattner SBThread
1022976d00aSJim Ingham SBProcess::GetSelectedThread () const
10330fdc8d8SChris Lattner {
10430fdc8d8SChris Lattner     SBThread sb_thread;
1056611103cSGreg Clayton     if (m_opaque_sp)
1062976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
10730fdc8d8SChris Lattner     return sb_thread;
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner SBTarget
11130fdc8d8SChris Lattner SBProcess::GetTarget() const
11230fdc8d8SChris Lattner {
11330fdc8d8SChris Lattner     SBTarget sb_target;
1146611103cSGreg Clayton     if (m_opaque_sp)
1156611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
11630fdc8d8SChris Lattner     return sb_target;
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner 
12030fdc8d8SChris Lattner size_t
12130fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
12230fdc8d8SChris Lattner {
1236611103cSGreg Clayton     if (m_opaque_sp != NULL)
12430fdc8d8SChris Lattner     {
12530fdc8d8SChris Lattner         Error error;
1266611103cSGreg Clayton         return m_opaque_sp->PutSTDIN (src, src_len, error);
12730fdc8d8SChris Lattner     }
12830fdc8d8SChris Lattner     else
12930fdc8d8SChris Lattner         return 0;
13030fdc8d8SChris Lattner }
13130fdc8d8SChris Lattner 
13230fdc8d8SChris Lattner size_t
13330fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
13430fdc8d8SChris Lattner {
1356611103cSGreg Clayton     if (m_opaque_sp != NULL)
13630fdc8d8SChris Lattner     {
13730fdc8d8SChris Lattner         Error error;
1386611103cSGreg Clayton         return m_opaque_sp->GetSTDOUT (dst, dst_len, error);
13930fdc8d8SChris Lattner     }
14030fdc8d8SChris Lattner     else
14130fdc8d8SChris Lattner         return 0;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
14430fdc8d8SChris Lattner size_t
14530fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
14630fdc8d8SChris Lattner {
1476611103cSGreg Clayton     if (m_opaque_sp != NULL)
14830fdc8d8SChris Lattner     {
14930fdc8d8SChris Lattner         Error error;
1506611103cSGreg Clayton         return m_opaque_sp->GetSTDERR (dst, dst_len, error);
15130fdc8d8SChris Lattner     }
15230fdc8d8SChris Lattner     else
15330fdc8d8SChris Lattner         return 0;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner void
1572976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
15830fdc8d8SChris Lattner {
15930fdc8d8SChris Lattner     if (out == NULL)
16030fdc8d8SChris Lattner         return;
16130fdc8d8SChris Lattner 
1626611103cSGreg Clayton     if (m_opaque_sp != NULL)
16330fdc8d8SChris Lattner     {
16430fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
16530fdc8d8SChris Lattner         char message[1024];
16630fdc8d8SChris Lattner         int message_len = ::snprintf (message,
16730fdc8d8SChris Lattner                                       sizeof (message),
16830fdc8d8SChris Lattner                                       "Process %d %s\n",
1696611103cSGreg Clayton                                       m_opaque_sp->GetID(),
17030fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner         if (message_len > 0)
17330fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
17430fdc8d8SChris Lattner     }
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner void
1782976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
17930fdc8d8SChris Lattner {
1806611103cSGreg Clayton     if (m_opaque_sp != NULL)
18130fdc8d8SChris Lattner     {
18230fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
18330fdc8d8SChris Lattner         char message[1024];
18430fdc8d8SChris Lattner         ::snprintf (message,
18530fdc8d8SChris Lattner                     sizeof (message),
18630fdc8d8SChris Lattner                     "Process %d %s\n",
1876611103cSGreg Clayton                     m_opaque_sp->GetID(),
18830fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner         result.AppendMessage (message);
19130fdc8d8SChris Lattner     }
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
19430fdc8d8SChris Lattner bool
1952976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
19630fdc8d8SChris Lattner {
1976611103cSGreg Clayton     if (m_opaque_sp != NULL)
1982976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
19930fdc8d8SChris Lattner     return false;
20030fdc8d8SChris Lattner }
20130fdc8d8SChris Lattner 
20230fdc8d8SChris Lattner bool
2032976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
20430fdc8d8SChris Lattner {
2056611103cSGreg Clayton     if (m_opaque_sp != NULL)
2062976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
20730fdc8d8SChris Lattner     return false;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner SBThread
21130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
21230fdc8d8SChris Lattner {
21330fdc8d8SChris Lattner     SBThread thread;
2146611103cSGreg Clayton     if (m_opaque_sp)
2156611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
21630fdc8d8SChris Lattner     return thread;
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner 
21930fdc8d8SChris Lattner StateType
22030fdc8d8SChris Lattner SBProcess::GetState ()
22130fdc8d8SChris Lattner {
2226611103cSGreg Clayton     if (m_opaque_sp != NULL)
2236611103cSGreg Clayton         return m_opaque_sp->GetState();
22430fdc8d8SChris Lattner     else
22530fdc8d8SChris Lattner         return eStateInvalid;
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner 
22830fdc8d8SChris Lattner 
22930fdc8d8SChris Lattner int
23030fdc8d8SChris Lattner SBProcess::GetExitStatus ()
23130fdc8d8SChris Lattner {
2326611103cSGreg Clayton     if (m_opaque_sp != NULL)
2336611103cSGreg Clayton         return m_opaque_sp->GetExitStatus ();
23430fdc8d8SChris Lattner     else
23530fdc8d8SChris Lattner         return 0;
23630fdc8d8SChris Lattner }
23730fdc8d8SChris Lattner 
23830fdc8d8SChris Lattner const char *
23930fdc8d8SChris Lattner SBProcess::GetExitDescription ()
24030fdc8d8SChris Lattner {
2416611103cSGreg Clayton     if (m_opaque_sp != NULL)
2426611103cSGreg Clayton         return m_opaque_sp->GetExitDescription ();
24330fdc8d8SChris Lattner     else
24430fdc8d8SChris Lattner         return NULL;
24530fdc8d8SChris Lattner }
24630fdc8d8SChris Lattner 
24730fdc8d8SChris Lattner lldb::pid_t
24830fdc8d8SChris Lattner SBProcess::GetProcessID ()
24930fdc8d8SChris Lattner {
2506611103cSGreg Clayton     if (m_opaque_sp)
2516611103cSGreg Clayton         return m_opaque_sp->GetID();
25230fdc8d8SChris Lattner     else
25330fdc8d8SChris Lattner         return LLDB_INVALID_PROCESS_ID;
25430fdc8d8SChris Lattner }
25530fdc8d8SChris Lattner 
25630fdc8d8SChris Lattner uint32_t
25730fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
25830fdc8d8SChris Lattner {
2596611103cSGreg Clayton     if (m_opaque_sp)
2606611103cSGreg Clayton         return m_opaque_sp->GetAddressByteSize();
26130fdc8d8SChris Lattner     else
26230fdc8d8SChris Lattner         return 0;
26330fdc8d8SChris Lattner }
26430fdc8d8SChris Lattner 
26530fdc8d8SChris Lattner bool
26630fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
26730fdc8d8SChris Lattner {
26830fdc8d8SChris Lattner     bool state_changed = false;
26930fdc8d8SChris Lattner 
27030fdc8d8SChris Lattner     if (IsValid())
27130fdc8d8SChris Lattner     {
27230fdc8d8SChris Lattner         EventSP event_sp;
2736611103cSGreg Clayton         StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27430fdc8d8SChris Lattner 
27530fdc8d8SChris Lattner         while (StateIsStoppedState (state))
27630fdc8d8SChris Lattner         {
2776611103cSGreg Clayton             state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
27830fdc8d8SChris Lattner             SBEvent event (event_sp);
2792976d00aSJim Ingham             AppendEventStateReport (event, result);
28030fdc8d8SChris Lattner             state_changed = true;
28130fdc8d8SChris Lattner         }
28230fdc8d8SChris Lattner     }
28330fdc8d8SChris Lattner     return state_changed;
28430fdc8d8SChris Lattner }
28530fdc8d8SChris Lattner 
28630fdc8d8SChris Lattner SBError
28730fdc8d8SChris Lattner SBProcess::Continue ()
28830fdc8d8SChris Lattner {
28930fdc8d8SChris Lattner     SBError sb_error;
29030fdc8d8SChris Lattner     if (IsValid())
2915d5028b5SGreg Clayton     {
2925d5028b5SGreg Clayton         Error error (m_opaque_sp->Resume());
2935d5028b5SGreg Clayton         if (error.Success())
2945d5028b5SGreg Clayton         {
2955d5028b5SGreg Clayton             if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
2965d5028b5SGreg Clayton                 m_opaque_sp->WaitForProcessToStop (NULL);
2975d5028b5SGreg Clayton         }
2985d5028b5SGreg Clayton         sb_error.SetError(error);
2995d5028b5SGreg Clayton     }
30030fdc8d8SChris Lattner     else
30130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
30230fdc8d8SChris Lattner 
30330fdc8d8SChris Lattner     return sb_error;
30430fdc8d8SChris Lattner }
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner 
30730fdc8d8SChris Lattner SBError
30830fdc8d8SChris Lattner SBProcess::Destroy ()
30930fdc8d8SChris Lattner {
31030fdc8d8SChris Lattner     SBError sb_error;
3116611103cSGreg Clayton     if (m_opaque_sp)
3126611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
31330fdc8d8SChris Lattner     else
31430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
31530fdc8d8SChris Lattner 
31630fdc8d8SChris Lattner     return sb_error;
31730fdc8d8SChris Lattner }
31830fdc8d8SChris Lattner 
31930fdc8d8SChris Lattner 
32030fdc8d8SChris Lattner SBError
32130fdc8d8SChris Lattner SBProcess::Stop ()
32230fdc8d8SChris Lattner {
32330fdc8d8SChris Lattner     SBError sb_error;
32430fdc8d8SChris Lattner     if (IsValid())
3256611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
32630fdc8d8SChris Lattner     else
32730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
32830fdc8d8SChris Lattner     return sb_error;
32930fdc8d8SChris Lattner }
33030fdc8d8SChris Lattner 
33130fdc8d8SChris Lattner SBError
33230fdc8d8SChris Lattner SBProcess::Kill ()
33330fdc8d8SChris Lattner {
33430fdc8d8SChris Lattner     SBError sb_error;
3356611103cSGreg Clayton     if (m_opaque_sp)
3366611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
33730fdc8d8SChris Lattner     else
33830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
33930fdc8d8SChris Lattner     return sb_error;
34030fdc8d8SChris Lattner }
34130fdc8d8SChris Lattner 
34230fdc8d8SChris Lattner 
34330fdc8d8SChris Lattner SBError
34430fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
34530fdc8d8SChris Lattner {
34630fdc8d8SChris Lattner     SBError sb_error;
3476611103cSGreg Clayton     if (m_opaque_sp)
3486611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
34930fdc8d8SChris Lattner     else
35030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
35130fdc8d8SChris Lattner     return sb_error;
35230fdc8d8SChris Lattner }
35330fdc8d8SChris Lattner 
35430fdc8d8SChris Lattner lldb::pid_t
35530fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
35630fdc8d8SChris Lattner {
35730fdc8d8SChris Lattner     Attach (attach_pid);
35830fdc8d8SChris Lattner     return GetProcessID();
35930fdc8d8SChris Lattner }
36030fdc8d8SChris Lattner 
36130fdc8d8SChris Lattner 
36230fdc8d8SChris Lattner SBError
36330fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
36430fdc8d8SChris Lattner {
36530fdc8d8SChris Lattner     SBError sb_error;
3666611103cSGreg Clayton     if (m_opaque_sp)
3676611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
36830fdc8d8SChris Lattner     else
36930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
37030fdc8d8SChris Lattner     return sb_error;
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner SBError
37430fdc8d8SChris Lattner SBProcess::Detach ()
37530fdc8d8SChris Lattner {
37630fdc8d8SChris Lattner     SBError sb_error;
3776611103cSGreg Clayton     if (m_opaque_sp)
3786611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
37930fdc8d8SChris Lattner     else
38030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner     return sb_error;
38330fdc8d8SChris Lattner }
38430fdc8d8SChris Lattner 
38530fdc8d8SChris Lattner SBError
38630fdc8d8SChris Lattner SBProcess::Signal (int signal)
38730fdc8d8SChris Lattner {
38830fdc8d8SChris Lattner     SBError sb_error;
3896611103cSGreg Clayton     if (m_opaque_sp)
3906611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signal));
39130fdc8d8SChris Lattner     else
39230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
39330fdc8d8SChris Lattner     return sb_error;
39430fdc8d8SChris Lattner }
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner SBThread
39730fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
39830fdc8d8SChris Lattner {
39930fdc8d8SChris Lattner     SBThread thread;
4006611103cSGreg Clayton     if (m_opaque_sp)
4016611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
40230fdc8d8SChris Lattner     return thread;
40330fdc8d8SChris Lattner }
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner StateType
40630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
40730fdc8d8SChris Lattner {
4086611103cSGreg Clayton     return Process::ProcessEventData::GetStateFromEvent (event.get());
40930fdc8d8SChris Lattner }
41030fdc8d8SChris Lattner 
41130fdc8d8SChris Lattner bool
41230fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
41330fdc8d8SChris Lattner {
4146611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner SBProcess
41830fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
41930fdc8d8SChris Lattner {
4206611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
42130fdc8d8SChris Lattner     return process;
42230fdc8d8SChris Lattner }
42330fdc8d8SChris Lattner 
42430fdc8d8SChris Lattner 
42530fdc8d8SChris Lattner SBBroadcaster
42630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
42730fdc8d8SChris Lattner {
4286611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
42930fdc8d8SChris Lattner     return broadcaster;
43030fdc8d8SChris Lattner }
43130fdc8d8SChris Lattner 
43230fdc8d8SChris Lattner lldb_private::Process *
43330fdc8d8SChris Lattner SBProcess::operator->() const
43430fdc8d8SChris Lattner {
4356611103cSGreg Clayton     return m_opaque_sp.get();
43630fdc8d8SChris Lattner }
43730fdc8d8SChris Lattner 
43830fdc8d8SChris Lattner size_t
43930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
44030fdc8d8SChris Lattner {
44130fdc8d8SChris Lattner     size_t bytes_read = 0;
44230fdc8d8SChris Lattner 
44330fdc8d8SChris Lattner     if (IsValid())
44430fdc8d8SChris Lattner     {
44530fdc8d8SChris Lattner         Error error;
4466611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
44730fdc8d8SChris Lattner         sb_error.SetError (error);
44830fdc8d8SChris Lattner     }
44930fdc8d8SChris Lattner     else
45030fdc8d8SChris Lattner     {
45130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
45230fdc8d8SChris Lattner     }
45330fdc8d8SChris Lattner 
45430fdc8d8SChris Lattner     return bytes_read;
45530fdc8d8SChris Lattner }
45630fdc8d8SChris Lattner 
45730fdc8d8SChris Lattner size_t
45830fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
45930fdc8d8SChris Lattner {
46030fdc8d8SChris Lattner     size_t bytes_written = 0;
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner     if (IsValid())
46330fdc8d8SChris Lattner     {
46430fdc8d8SChris Lattner         Error error;
4656611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
46630fdc8d8SChris Lattner         sb_error.SetError (error);
46730fdc8d8SChris Lattner     }
46830fdc8d8SChris Lattner 
46930fdc8d8SChris Lattner     return bytes_written;
47030fdc8d8SChris Lattner }
47130fdc8d8SChris Lattner 
47230fdc8d8SChris Lattner // Mimic shared pointer...
47330fdc8d8SChris Lattner lldb_private::Process *
47430fdc8d8SChris Lattner SBProcess::get() const
47530fdc8d8SChris Lattner {
4766611103cSGreg Clayton     return m_opaque_sp.get();
47730fdc8d8SChris Lattner }
47830fdc8d8SChris Lattner 
479dde9cff3SCaroline Tice bool
480dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
481dde9cff3SCaroline Tice {
482dde9cff3SCaroline Tice     if (m_opaque_sp)
483dde9cff3SCaroline Tice     {
484dde9cff3SCaroline Tice         char path[PATH_MAX];
485dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
4861d273166SGreg Clayton         Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
4871d273166SGreg Clayton         const char *exe_name = NULL;
4881d273166SGreg Clayton         if (exe_module)
4891d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
4901d273166SGreg Clayton 
491*05faeb71SGreg Clayton         description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
4921d273166SGreg Clayton                             m_opaque_sp->GetID(),
493dde9cff3SCaroline Tice                             SBDebugger::StateAsCString (GetState()),
4941d273166SGreg Clayton                             GetNumThreads(),
495*05faeb71SGreg Clayton                             exe_name ? ", executable = " : "",
4961d273166SGreg Clayton                             exe_name ? exe_name : "");
497dde9cff3SCaroline Tice     }
498dde9cff3SCaroline Tice     else
499dde9cff3SCaroline Tice         description.Printf ("No value");
500dde9cff3SCaroline Tice 
501dde9cff3SCaroline Tice     return true;
502dde9cff3SCaroline Tice }
503