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"
19ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/State.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2330fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
256611103cSGreg Clayton #include "lldb/Target/Target.h"
266611103cSGreg Clayton #include "lldb/Target/Thread.h"
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner // Project includes
2930fdc8d8SChris Lattner 
304c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
314c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
334c5de699SEli Friedman #include "lldb/API/SBEvent.h"
344c5de699SEli Friedman #include "lldb/API/SBThread.h"
35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
364c5de699SEli Friedman #include "lldb/API/SBStringList.h"
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner using namespace lldb;
3930fdc8d8SChris Lattner using namespace lldb_private;
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner SBProcess::SBProcess () :
446611103cSGreg Clayton     m_opaque_sp()
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner //----------------------------------------------------------------------
5030fdc8d8SChris Lattner // SBProcess constructor
5130fdc8d8SChris Lattner //----------------------------------------------------------------------
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
546611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5530fdc8d8SChris Lattner {
56*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
57ceb6b139SCaroline Tice 
58ceb6b139SCaroline Tice     if (log)
59*750cd175SCaroline Tice         log->Printf ("SBProcess::SBProcess (rhs.sp=%p) => this.sp = %p", rhs.m_opaque_sp.get(), m_opaque_sp.get());
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
646611103cSGreg Clayton     m_opaque_sp (process_sp)
6530fdc8d8SChris Lattner {
66*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
67ceb6b139SCaroline Tice 
68ceb6b139SCaroline Tice     if (log)
69*750cd175SCaroline Tice         log->Printf ("SBProcess::SBProcess (process_sp=%p) => this.sp = %p", process_sp.get(), m_opaque_sp.get());
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
7230fdc8d8SChris Lattner //----------------------------------------------------------------------
7330fdc8d8SChris Lattner // Destructor
7430fdc8d8SChris Lattner //----------------------------------------------------------------------
7530fdc8d8SChris Lattner SBProcess::~SBProcess()
7630fdc8d8SChris Lattner {
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner void
8030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
8130fdc8d8SChris Lattner {
826611103cSGreg Clayton     m_opaque_sp = process_sp;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner void
8630fdc8d8SChris Lattner SBProcess::Clear ()
8730fdc8d8SChris Lattner {
886611103cSGreg Clayton     m_opaque_sp.reset();
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner bool
9330fdc8d8SChris Lattner SBProcess::IsValid() const
9430fdc8d8SChris Lattner {
956611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner uint32_t
10030fdc8d8SChris Lattner SBProcess::GetNumThreads ()
10130fdc8d8SChris Lattner {
102ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
103ceb6b139SCaroline Tice 
104*750cd175SCaroline Tice     //if (log)
105*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetNumThreads ()");
106ceb6b139SCaroline Tice 
107ceb6b139SCaroline Tice     uint32_t num_threads = 0;
1086611103cSGreg Clayton     if (m_opaque_sp)
10930fdc8d8SChris Lattner     {
11030fdc8d8SChris Lattner         const bool can_update = true;
111ceb6b139SCaroline Tice         num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
11230fdc8d8SChris Lattner     }
113ceb6b139SCaroline Tice 
114ceb6b139SCaroline Tice     if (log)
115*750cd175SCaroline Tice         log->Printf ("SBProcess::GetNumThreads (this.sp=%p) => %d", m_opaque_sp.get(), num_threads);
116ceb6b139SCaroline Tice 
117ceb6b139SCaroline Tice     return num_threads;
11830fdc8d8SChris Lattner }
11930fdc8d8SChris Lattner 
12030fdc8d8SChris Lattner SBThread
1212976d00aSJim Ingham SBProcess::GetSelectedThread () const
12230fdc8d8SChris Lattner {
123ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
124ceb6b139SCaroline Tice 
125*750cd175SCaroline Tice     //if (log)
126*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetSelectedThread ()");
127ceb6b139SCaroline Tice 
12830fdc8d8SChris Lattner     SBThread sb_thread;
1296611103cSGreg Clayton     if (m_opaque_sp)
1302976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
131ceb6b139SCaroline Tice 
132ceb6b139SCaroline Tice     if (log)
133ceb6b139SCaroline Tice     {
134ceb6b139SCaroline Tice         SBStream sstr;
135ceb6b139SCaroline Tice         sb_thread.GetDescription (sstr);
136*750cd175SCaroline Tice         log->Printf ("SBProcess::GetSelectedThread (this.sp=%p) => SBThread : this = %p, '%s'", m_opaque_sp.get(),
137*750cd175SCaroline Tice                      &sb_thread, sstr.GetData());
138ceb6b139SCaroline Tice     }
139ceb6b139SCaroline Tice 
14030fdc8d8SChris Lattner     return sb_thread;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner SBTarget
14430fdc8d8SChris Lattner SBProcess::GetTarget() const
14530fdc8d8SChris Lattner {
146ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
147ceb6b139SCaroline Tice 
148*750cd175SCaroline Tice     //if (log)
149*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetTarget ()");
150ceb6b139SCaroline Tice 
15130fdc8d8SChris Lattner     SBTarget sb_target;
1526611103cSGreg Clayton     if (m_opaque_sp)
1536611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
154ceb6b139SCaroline Tice 
155ceb6b139SCaroline Tice     if (log)
156*750cd175SCaroline Tice         log->Printf ("SBProcess::GetTarget (this.sp=%p) => SBTarget (this.sp = %p)", m_opaque_sp.get(),
157ceb6b139SCaroline Tice                      sb_target.get());
158ceb6b139SCaroline Tice 
15930fdc8d8SChris Lattner     return sb_target;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner size_t
16430fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
16530fdc8d8SChris Lattner {
166ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
167ceb6b139SCaroline Tice 
168*750cd175SCaroline Tice     //if (log)
169*750cd175SCaroline Tice     //    log->Printf ("SBProcess::PutSTDIN (%s, %d)", src, src_len);
170ceb6b139SCaroline Tice 
171ceb6b139SCaroline Tice     size_t ret_val = 0;
1726611103cSGreg Clayton     if (m_opaque_sp != NULL)
17330fdc8d8SChris Lattner     {
17430fdc8d8SChris Lattner         Error error;
175ceb6b139SCaroline Tice         ret_val =  m_opaque_sp->PutSTDIN (src, src_len, error);
17630fdc8d8SChris Lattner     }
177ceb6b139SCaroline Tice 
178ceb6b139SCaroline Tice     if (log)
179*750cd175SCaroline Tice         log->Printf ("SBProcess::PutSTDIN (this.sp=%p, src='%s', src_len=%d) => %d", m_opaque_sp.get(), src,
180*750cd175SCaroline Tice                      (uint32_t) src_len, ret_val);
181ceb6b139SCaroline Tice 
182ceb6b139SCaroline Tice     return ret_val;
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner size_t
18630fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
18730fdc8d8SChris Lattner {
188ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
189ceb6b139SCaroline Tice 
190*750cd175SCaroline Tice     //if (log)
191*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetSTDOUT (char *dst, size_t dst_Len)");
192ceb6b139SCaroline Tice 
193ceb6b139SCaroline Tice     size_t ret_val = 0;
1946611103cSGreg Clayton     if (m_opaque_sp != NULL)
19530fdc8d8SChris Lattner     {
19630fdc8d8SChris Lattner         Error error;
197ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
19830fdc8d8SChris Lattner     }
199ceb6b139SCaroline Tice 
200ceb6b139SCaroline Tice     if (log)
201*750cd175SCaroline Tice         log->Printf ("SBProcess::GetSTDOUT (this.sp=%p, dst='%s', dst_len=%d) => %d", m_opaque_sp.get(), dst,
202*750cd175SCaroline Tice                      (uint32_t) dst_len, (uint32_t) ret_val);
203ceb6b139SCaroline Tice 
204ceb6b139SCaroline Tice     return ret_val;
20530fdc8d8SChris Lattner }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner size_t
20830fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
20930fdc8d8SChris Lattner {
210ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
211ceb6b139SCaroline Tice 
212*750cd175SCaroline Tice     //if (log)
213*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetSTDERR (char *dst, size_t dst_len)");
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice     size_t ret_val = 0;
2166611103cSGreg Clayton     if (m_opaque_sp != NULL)
21730fdc8d8SChris Lattner     {
21830fdc8d8SChris Lattner         Error error;
219ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error);
22030fdc8d8SChris Lattner     }
221ceb6b139SCaroline Tice 
222ceb6b139SCaroline Tice     if (log)
223*750cd175SCaroline Tice         log->Printf ("SBProcess::GetSTDERR (this.sp=%p, dst='%s', dst_len=%d) => %d", m_opaque_sp.get(), dst,
224*750cd175SCaroline Tice                      (uint32_t) dst_len, (uint32_t) ret_val);
225ceb6b139SCaroline Tice 
226ceb6b139SCaroline Tice     return ret_val;
22730fdc8d8SChris Lattner }
22830fdc8d8SChris Lattner 
22930fdc8d8SChris Lattner void
2302976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
23130fdc8d8SChris Lattner {
23230fdc8d8SChris Lattner     if (out == NULL)
23330fdc8d8SChris Lattner         return;
23430fdc8d8SChris Lattner 
2356611103cSGreg Clayton     if (m_opaque_sp != NULL)
23630fdc8d8SChris Lattner     {
23730fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
23830fdc8d8SChris Lattner         char message[1024];
23930fdc8d8SChris Lattner         int message_len = ::snprintf (message,
24030fdc8d8SChris Lattner                                       sizeof (message),
24130fdc8d8SChris Lattner                                       "Process %d %s\n",
2426611103cSGreg Clayton                                       m_opaque_sp->GetID(),
24330fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner         if (message_len > 0)
24630fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
24730fdc8d8SChris Lattner     }
24830fdc8d8SChris Lattner }
24930fdc8d8SChris Lattner 
25030fdc8d8SChris Lattner void
2512976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
25230fdc8d8SChris Lattner {
2536611103cSGreg Clayton     if (m_opaque_sp != NULL)
25430fdc8d8SChris Lattner     {
25530fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
25630fdc8d8SChris Lattner         char message[1024];
25730fdc8d8SChris Lattner         ::snprintf (message,
25830fdc8d8SChris Lattner                     sizeof (message),
25930fdc8d8SChris Lattner                     "Process %d %s\n",
2606611103cSGreg Clayton                     m_opaque_sp->GetID(),
26130fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
26230fdc8d8SChris Lattner 
26330fdc8d8SChris Lattner         result.AppendMessage (message);
26430fdc8d8SChris Lattner     }
26530fdc8d8SChris Lattner }
26630fdc8d8SChris Lattner 
26730fdc8d8SChris Lattner bool
2682976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
26930fdc8d8SChris Lattner {
2706611103cSGreg Clayton     if (m_opaque_sp != NULL)
2712976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
27230fdc8d8SChris Lattner     return false;
27330fdc8d8SChris Lattner }
27430fdc8d8SChris Lattner 
27530fdc8d8SChris Lattner bool
2762976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
27730fdc8d8SChris Lattner {
278ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
279ceb6b139SCaroline Tice 
280*750cd175SCaroline Tice     //if (log)
281*750cd175SCaroline Tice     //    log->Printf ("SBProcess::SetSelectedThreadByID (%d)", tid);
282ceb6b139SCaroline Tice 
283ceb6b139SCaroline Tice     bool ret_val = false;
2846611103cSGreg Clayton     if (m_opaque_sp != NULL)
285ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
286ceb6b139SCaroline Tice 
287ceb6b139SCaroline Tice     if (log)
288*750cd175SCaroline Tice         log->Printf ("SBProcess::SetSelectedThreadByID (this.sp=%p, tid=%d) => '%s'", m_opaque_sp.get(),
289*750cd175SCaroline Tice                      tid, (ret_val ? "true" : "false"));
290ceb6b139SCaroline Tice 
291ceb6b139SCaroline Tice     return ret_val;
29230fdc8d8SChris Lattner }
29330fdc8d8SChris Lattner 
29430fdc8d8SChris Lattner SBThread
29530fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
29630fdc8d8SChris Lattner {
297ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
298ceb6b139SCaroline Tice 
299*750cd175SCaroline Tice     //if (log)
300*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetThreadAtIndex (%d)");
301ceb6b139SCaroline Tice 
30230fdc8d8SChris Lattner     SBThread thread;
3036611103cSGreg Clayton     if (m_opaque_sp)
3046611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
305ceb6b139SCaroline Tice 
306ceb6b139SCaroline Tice     if (log)
307ceb6b139SCaroline Tice     {
308ceb6b139SCaroline Tice         SBStream sstr;
309ceb6b139SCaroline Tice         thread.GetDescription (sstr);
310*750cd175SCaroline Tice         log->Printf ("SBProcess::GetThreadAtIndex (this.sp=%p, index=%d) => SBThread : this.sp = %p, '%s'",
311*750cd175SCaroline Tice                      m_opaque_sp.get(), (uint32_t) index, thread.GetLLDBObjectPtr(), sstr.GetData());
312ceb6b139SCaroline Tice     }
313ceb6b139SCaroline Tice 
31430fdc8d8SChris Lattner     return thread;
31530fdc8d8SChris Lattner }
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner StateType
31830fdc8d8SChris Lattner SBProcess::GetState ()
31930fdc8d8SChris Lattner {
320ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
321ceb6b139SCaroline Tice 
322*750cd175SCaroline Tice     //if (log)
323*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetState ()");
324ceb6b139SCaroline Tice 
325ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
3266611103cSGreg Clayton     if (m_opaque_sp != NULL)
327ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetState();
328ceb6b139SCaroline Tice 
329ceb6b139SCaroline Tice     if (log)
330*750cd175SCaroline Tice         log->Printf ("SBProcess::GetState (this.sp=%p) => '%s'", m_opaque_sp.get(),
331*750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
332ceb6b139SCaroline Tice 
333ceb6b139SCaroline Tice     return ret_val;
33430fdc8d8SChris Lattner }
33530fdc8d8SChris Lattner 
33630fdc8d8SChris Lattner 
33730fdc8d8SChris Lattner int
33830fdc8d8SChris Lattner SBProcess::GetExitStatus ()
33930fdc8d8SChris Lattner {
3406611103cSGreg Clayton     if (m_opaque_sp != NULL)
3416611103cSGreg Clayton         return m_opaque_sp->GetExitStatus ();
34230fdc8d8SChris Lattner     else
34330fdc8d8SChris Lattner         return 0;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner const char *
34730fdc8d8SChris Lattner SBProcess::GetExitDescription ()
34830fdc8d8SChris Lattner {
3496611103cSGreg Clayton     if (m_opaque_sp != NULL)
3506611103cSGreg Clayton         return m_opaque_sp->GetExitDescription ();
35130fdc8d8SChris Lattner     else
35230fdc8d8SChris Lattner         return NULL;
35330fdc8d8SChris Lattner }
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner lldb::pid_t
35630fdc8d8SChris Lattner SBProcess::GetProcessID ()
35730fdc8d8SChris Lattner {
358ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
359ceb6b139SCaroline Tice 
360*750cd175SCaroline Tice     //if (log)
361*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetProcessID ()");
362ceb6b139SCaroline Tice 
363ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
3646611103cSGreg Clayton     if (m_opaque_sp)
365ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetID();
366ceb6b139SCaroline Tice 
367ceb6b139SCaroline Tice     if (log)
368*750cd175SCaroline Tice         log->Printf ("SBProcess::GetProcessID (this.sp=%p) => %d", m_opaque_sp.get(), ret_val);
369ceb6b139SCaroline Tice 
370ceb6b139SCaroline Tice     return ret_val;
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner uint32_t
37430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
37530fdc8d8SChris Lattner {
376ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
377ceb6b139SCaroline Tice 
378*750cd175SCaroline Tice     //if (log)
379*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetAddressByteSize()");
380ceb6b139SCaroline Tice 
381ceb6b139SCaroline Tice     uint32_t size = 0;
3826611103cSGreg Clayton     if (m_opaque_sp)
383ceb6b139SCaroline Tice         size =  m_opaque_sp->GetAddressByteSize();
384ceb6b139SCaroline Tice 
385ceb6b139SCaroline Tice     if (log)
386*750cd175SCaroline Tice         log->Printf ("SBProcess::GetAddressByteSize (this.sp=%p) => %d", m_opaque_sp.get(), size);
387ceb6b139SCaroline Tice 
388ceb6b139SCaroline Tice     return size;
38930fdc8d8SChris Lattner }
39030fdc8d8SChris Lattner 
39130fdc8d8SChris Lattner bool
39230fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
39330fdc8d8SChris Lattner {
39430fdc8d8SChris Lattner     bool state_changed = false;
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner     if (IsValid())
39730fdc8d8SChris Lattner     {
39830fdc8d8SChris Lattner         EventSP event_sp;
3996611103cSGreg Clayton         StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner         while (StateIsStoppedState (state))
40230fdc8d8SChris Lattner         {
4036611103cSGreg Clayton             state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
40430fdc8d8SChris Lattner             SBEvent event (event_sp);
4052976d00aSJim Ingham             AppendEventStateReport (event, result);
40630fdc8d8SChris Lattner             state_changed = true;
40730fdc8d8SChris Lattner         }
40830fdc8d8SChris Lattner     }
40930fdc8d8SChris Lattner     return state_changed;
41030fdc8d8SChris Lattner }
41130fdc8d8SChris Lattner 
41230fdc8d8SChris Lattner SBError
41330fdc8d8SChris Lattner SBProcess::Continue ()
41430fdc8d8SChris Lattner {
415ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
416ceb6b139SCaroline Tice 
417*750cd175SCaroline Tice     //if (log)
418*750cd175SCaroline Tice     //    log->Printf ("SBProcess::Continue ()");
419ceb6b139SCaroline Tice 
42030fdc8d8SChris Lattner     SBError sb_error;
42130fdc8d8SChris Lattner     if (IsValid())
4225d5028b5SGreg Clayton     {
4235d5028b5SGreg Clayton         Error error (m_opaque_sp->Resume());
4245d5028b5SGreg Clayton         if (error.Success())
4255d5028b5SGreg Clayton         {
4265d5028b5SGreg Clayton             if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
4275d5028b5SGreg Clayton                 m_opaque_sp->WaitForProcessToStop (NULL);
4285d5028b5SGreg Clayton         }
4295d5028b5SGreg Clayton         sb_error.SetError(error);
4305d5028b5SGreg Clayton     }
43130fdc8d8SChris Lattner     else
43230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
43330fdc8d8SChris Lattner 
434ceb6b139SCaroline Tice     if (log)
435ceb6b139SCaroline Tice     {
436ceb6b139SCaroline Tice         SBStream sstr;
437ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
438*750cd175SCaroline Tice         log->Printf ("SBProcess::Continue (this.sp=%p) => SBError (this.ap = %p, '%s')", m_opaque_sp.get(),
439*750cd175SCaroline Tice                      sb_error.get(), sstr.GetData());
440ceb6b139SCaroline Tice     }
441ceb6b139SCaroline Tice 
44230fdc8d8SChris Lattner     return sb_error;
44330fdc8d8SChris Lattner }
44430fdc8d8SChris Lattner 
44530fdc8d8SChris Lattner 
44630fdc8d8SChris Lattner SBError
44730fdc8d8SChris Lattner SBProcess::Destroy ()
44830fdc8d8SChris Lattner {
44930fdc8d8SChris Lattner     SBError sb_error;
4506611103cSGreg Clayton     if (m_opaque_sp)
4516611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
45230fdc8d8SChris Lattner     else
45330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner     return sb_error;
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner 
45930fdc8d8SChris Lattner SBError
46030fdc8d8SChris Lattner SBProcess::Stop ()
46130fdc8d8SChris Lattner {
462ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
463ceb6b139SCaroline Tice 
464*750cd175SCaroline Tice     //if (log)
465*750cd175SCaroline Tice     //    log->Printf ("SBProcess::Stop ()");
466ceb6b139SCaroline Tice 
46730fdc8d8SChris Lattner     SBError sb_error;
46830fdc8d8SChris Lattner     if (IsValid())
4696611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
47030fdc8d8SChris Lattner     else
47130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
472ceb6b139SCaroline Tice 
473ceb6b139SCaroline Tice     if (log)
474ceb6b139SCaroline Tice     {
475ceb6b139SCaroline Tice         SBStream sstr;
476ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
477*750cd175SCaroline Tice         log->Printf ("SBProcess::Stop (this.sp=%p) => SBError (this.ap = %p, '%s')", m_opaque_sp.get(), sb_error.get(),
478*750cd175SCaroline Tice                      sstr.GetData());
479ceb6b139SCaroline Tice     }
480ceb6b139SCaroline Tice 
48130fdc8d8SChris Lattner     return sb_error;
48230fdc8d8SChris Lattner }
48330fdc8d8SChris Lattner 
48430fdc8d8SChris Lattner SBError
48530fdc8d8SChris Lattner SBProcess::Kill ()
48630fdc8d8SChris Lattner {
487ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
488ceb6b139SCaroline Tice 
489*750cd175SCaroline Tice     //if (log)
490*750cd175SCaroline Tice     //    log->Printf ("SBProcess::Kill ()");
491ceb6b139SCaroline Tice 
49230fdc8d8SChris Lattner     SBError sb_error;
4936611103cSGreg Clayton     if (m_opaque_sp)
4946611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
49530fdc8d8SChris Lattner     else
49630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
497ceb6b139SCaroline Tice 
498ceb6b139SCaroline Tice     if (log)
499ceb6b139SCaroline Tice     {
500ceb6b139SCaroline Tice         SBStream sstr;
501ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
502*750cd175SCaroline Tice         log->Printf ("SBProcess::Kill (this.sp=%p) => SBError (this.ap = %p,'%s')", m_opaque_sp.get(), sb_error.get(),
503*750cd175SCaroline Tice                      sstr.GetData());
504ceb6b139SCaroline Tice     }
505ceb6b139SCaroline Tice 
50630fdc8d8SChris Lattner     return sb_error;
50730fdc8d8SChris Lattner }
50830fdc8d8SChris Lattner 
50930fdc8d8SChris Lattner 
51030fdc8d8SChris Lattner SBError
51130fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
51230fdc8d8SChris Lattner {
51330fdc8d8SChris Lattner     SBError sb_error;
5146611103cSGreg Clayton     if (m_opaque_sp)
5156611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
51630fdc8d8SChris Lattner     else
51730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
51830fdc8d8SChris Lattner     return sb_error;
51930fdc8d8SChris Lattner }
52030fdc8d8SChris Lattner 
52130fdc8d8SChris Lattner lldb::pid_t
52230fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
52330fdc8d8SChris Lattner {
52430fdc8d8SChris Lattner     Attach (attach_pid);
52530fdc8d8SChris Lattner     return GetProcessID();
52630fdc8d8SChris Lattner }
52730fdc8d8SChris Lattner 
52830fdc8d8SChris Lattner 
52930fdc8d8SChris Lattner SBError
53030fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
53130fdc8d8SChris Lattner {
53230fdc8d8SChris Lattner     SBError sb_error;
5336611103cSGreg Clayton     if (m_opaque_sp)
5346611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
53530fdc8d8SChris Lattner     else
53630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
53730fdc8d8SChris Lattner     return sb_error;
53830fdc8d8SChris Lattner }
53930fdc8d8SChris Lattner 
54030fdc8d8SChris Lattner SBError
54130fdc8d8SChris Lattner SBProcess::Detach ()
54230fdc8d8SChris Lattner {
54330fdc8d8SChris Lattner     SBError sb_error;
5446611103cSGreg Clayton     if (m_opaque_sp)
5456611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
54630fdc8d8SChris Lattner     else
54730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
54830fdc8d8SChris Lattner 
54930fdc8d8SChris Lattner     return sb_error;
55030fdc8d8SChris Lattner }
55130fdc8d8SChris Lattner 
55230fdc8d8SChris Lattner SBError
55330fdc8d8SChris Lattner SBProcess::Signal (int signal)
55430fdc8d8SChris Lattner {
55530fdc8d8SChris Lattner     SBError sb_error;
5566611103cSGreg Clayton     if (m_opaque_sp)
5576611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signal));
55830fdc8d8SChris Lattner     else
55930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
56030fdc8d8SChris Lattner     return sb_error;
56130fdc8d8SChris Lattner }
56230fdc8d8SChris Lattner 
56330fdc8d8SChris Lattner SBThread
56430fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
56530fdc8d8SChris Lattner {
56630fdc8d8SChris Lattner     SBThread thread;
5676611103cSGreg Clayton     if (m_opaque_sp)
5686611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
56930fdc8d8SChris Lattner     return thread;
57030fdc8d8SChris Lattner }
57130fdc8d8SChris Lattner 
57230fdc8d8SChris Lattner StateType
57330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
57430fdc8d8SChris Lattner {
575ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
576ceb6b139SCaroline Tice 
577*750cd175SCaroline Tice     //if (log)
578*750cd175SCaroline Tice     //{
579*750cd175SCaroline Tice     //    SBStream sstr;
580*750cd175SCaroline Tice     //    event.GetDescription (sstr);
581*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetStateFromEvent (%s)", sstr.GetData());
582*750cd175SCaroline Tice     //}
583ceb6b139SCaroline Tice 
584ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
585ceb6b139SCaroline Tice 
586ceb6b139SCaroline Tice     if (log)
587*750cd175SCaroline Tice         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => '%s'", event.get(),
588*750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
589ceb6b139SCaroline Tice 
590ceb6b139SCaroline Tice     return ret_val;
59130fdc8d8SChris Lattner }
59230fdc8d8SChris Lattner 
59330fdc8d8SChris Lattner bool
59430fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
59530fdc8d8SChris Lattner {
5966611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
59730fdc8d8SChris Lattner }
59830fdc8d8SChris Lattner 
59930fdc8d8SChris Lattner SBProcess
60030fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
60130fdc8d8SChris Lattner {
6026611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
60330fdc8d8SChris Lattner     return process;
60430fdc8d8SChris Lattner }
60530fdc8d8SChris Lattner 
60630fdc8d8SChris Lattner 
60730fdc8d8SChris Lattner SBBroadcaster
60830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
60930fdc8d8SChris Lattner {
610ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
611ceb6b139SCaroline Tice 
612*750cd175SCaroline Tice     //if (log)
613*750cd175SCaroline Tice     //    log->Printf ("SBProcess::GetBroadcaster ()");
614*750cd175SCaroline Tice 
6156611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
616ceb6b139SCaroline Tice 
617ceb6b139SCaroline Tice     if (log)
618*750cd175SCaroline Tice         log->Printf ("SBProcess::GetBroadcaster (this.sp=%p) => SBBroadcaster (this.obj = %p)",  m_opaque_sp.get(),
619*750cd175SCaroline Tice                      broadcaster.get());
620ceb6b139SCaroline Tice 
62130fdc8d8SChris Lattner     return broadcaster;
62230fdc8d8SChris Lattner }
62330fdc8d8SChris Lattner 
62430fdc8d8SChris Lattner lldb_private::Process *
62530fdc8d8SChris Lattner SBProcess::operator->() const
62630fdc8d8SChris Lattner {
6276611103cSGreg Clayton     return m_opaque_sp.get();
62830fdc8d8SChris Lattner }
62930fdc8d8SChris Lattner 
63030fdc8d8SChris Lattner size_t
63130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
63230fdc8d8SChris Lattner {
633ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
634ceb6b139SCaroline Tice 
635*750cd175SCaroline Tice     //if (log)
636*750cd175SCaroline Tice     //    log->Printf ("SBProcess::ReadMemory (%p, %p, %d, sb_error)", addr, dst, dst_len);
637ceb6b139SCaroline Tice 
63830fdc8d8SChris Lattner     size_t bytes_read = 0;
63930fdc8d8SChris Lattner 
64030fdc8d8SChris Lattner     if (IsValid())
64130fdc8d8SChris Lattner     {
64230fdc8d8SChris Lattner         Error error;
6436611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
64430fdc8d8SChris Lattner         sb_error.SetError (error);
64530fdc8d8SChris Lattner     }
64630fdc8d8SChris Lattner     else
64730fdc8d8SChris Lattner     {
64830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
64930fdc8d8SChris Lattner     }
65030fdc8d8SChris Lattner 
651ceb6b139SCaroline Tice     if (log)
652*750cd175SCaroline Tice         log->Printf ("SBProcess::ReadMemory (this.sp=%p, addr=%p, dst=%p, dst_len=%d, sb_error.ap=%p) => %d",
653*750cd175SCaroline Tice                      m_opaque_sp.get(), addr, dst, (uint32_t) dst_len, sb_error.get(), (uint32_t) bytes_read);
654ceb6b139SCaroline Tice 
65530fdc8d8SChris Lattner     return bytes_read;
65630fdc8d8SChris Lattner }
65730fdc8d8SChris Lattner 
65830fdc8d8SChris Lattner size_t
65930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
66030fdc8d8SChris Lattner {
66130fdc8d8SChris Lattner     size_t bytes_written = 0;
66230fdc8d8SChris Lattner 
66330fdc8d8SChris Lattner     if (IsValid())
66430fdc8d8SChris Lattner     {
66530fdc8d8SChris Lattner         Error error;
6666611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
66730fdc8d8SChris Lattner         sb_error.SetError (error);
66830fdc8d8SChris Lattner     }
66930fdc8d8SChris Lattner 
67030fdc8d8SChris Lattner     return bytes_written;
67130fdc8d8SChris Lattner }
67230fdc8d8SChris Lattner 
67330fdc8d8SChris Lattner // Mimic shared pointer...
67430fdc8d8SChris Lattner lldb_private::Process *
67530fdc8d8SChris Lattner SBProcess::get() const
67630fdc8d8SChris Lattner {
6776611103cSGreg Clayton     return m_opaque_sp.get();
67830fdc8d8SChris Lattner }
67930fdc8d8SChris Lattner 
680dde9cff3SCaroline Tice bool
681dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
682dde9cff3SCaroline Tice {
683dde9cff3SCaroline Tice     if (m_opaque_sp)
684dde9cff3SCaroline Tice     {
685dde9cff3SCaroline Tice         char path[PATH_MAX];
686dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
6871d273166SGreg Clayton         Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
6881d273166SGreg Clayton         const char *exe_name = NULL;
6891d273166SGreg Clayton         if (exe_module)
6901d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
6911d273166SGreg Clayton 
69205faeb71SGreg Clayton         description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
6931d273166SGreg Clayton                             m_opaque_sp->GetID(),
694ceb6b139SCaroline Tice                             lldb_private::StateAsCString (GetState()),
6951d273166SGreg Clayton                             GetNumThreads(),
69605faeb71SGreg Clayton                             exe_name ? ", executable = " : "",
6971d273166SGreg Clayton                             exe_name ? exe_name : "");
698dde9cff3SCaroline Tice     }
699dde9cff3SCaroline Tice     else
700dde9cff3SCaroline Tice         description.Printf ("No value");
701dde9cff3SCaroline Tice 
702dde9cff3SCaroline Tice     return true;
703dde9cff3SCaroline Tice }
704