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