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"
19*ceb6b139SCaroline 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 {
46*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
47*ceb6b139SCaroline Tice 
48*ceb6b139SCaroline Tice     if (log)
49*ceb6b139SCaroline Tice         log->Printf ("SBProcess::SBProcess () ==> this = %p", this);
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner 
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner //----------------------------------------------------------------------
5430fdc8d8SChris Lattner // SBProcess constructor
5530fdc8d8SChris Lattner //----------------------------------------------------------------------
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
586611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
5930fdc8d8SChris Lattner {
60*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
61*ceb6b139SCaroline Tice 
62*ceb6b139SCaroline Tice     if (log)
63*ceb6b139SCaroline Tice         log->Printf ("SBProcess::SBProcess (const SBProcess &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p",
64*ceb6b139SCaroline Tice                      rhs.m_opaque_sp.get(), this);
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
696611103cSGreg Clayton     m_opaque_sp (process_sp)
7030fdc8d8SChris Lattner {
71*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
72*ceb6b139SCaroline Tice 
73*ceb6b139SCaroline Tice     if (log)
74*ceb6b139SCaroline Tice         log->Printf ("SBProcess::SBProcess (const lldb::ProcessSP &process_sp)  process_sp.get() = %p ==> this = %p",
75*ceb6b139SCaroline Tice                      process_sp.get(), this);
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner //----------------------------------------------------------------------
7930fdc8d8SChris Lattner // Destructor
8030fdc8d8SChris Lattner //----------------------------------------------------------------------
8130fdc8d8SChris Lattner SBProcess::~SBProcess()
8230fdc8d8SChris Lattner {
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner void
8630fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
8730fdc8d8SChris Lattner {
886611103cSGreg Clayton     m_opaque_sp = process_sp;
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner void
9230fdc8d8SChris Lattner SBProcess::Clear ()
9330fdc8d8SChris Lattner {
946611103cSGreg Clayton     m_opaque_sp.reset();
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner bool
9930fdc8d8SChris Lattner SBProcess::IsValid() const
10030fdc8d8SChris Lattner {
1016611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner uint32_t
10630fdc8d8SChris Lattner SBProcess::GetNumThreads ()
10730fdc8d8SChris Lattner {
108*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
109*ceb6b139SCaroline Tice 
110*ceb6b139SCaroline Tice     if (log)
111*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetNumThreads ()");
112*ceb6b139SCaroline Tice 
113*ceb6b139SCaroline Tice     uint32_t num_threads = 0;
1146611103cSGreg Clayton     if (m_opaque_sp)
11530fdc8d8SChris Lattner     {
11630fdc8d8SChris Lattner         const bool can_update = true;
117*ceb6b139SCaroline Tice         num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
11830fdc8d8SChris Lattner     }
119*ceb6b139SCaroline Tice 
120*ceb6b139SCaroline Tice     if (log)
121*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetNumThreads ==> %d", num_threads);
122*ceb6b139SCaroline Tice 
123*ceb6b139SCaroline Tice     return num_threads;
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner SBThread
1272976d00aSJim Ingham SBProcess::GetSelectedThread () const
12830fdc8d8SChris Lattner {
129*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
130*ceb6b139SCaroline Tice 
131*ceb6b139SCaroline Tice     if (log)
132*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSelectedThread ()");
133*ceb6b139SCaroline Tice 
13430fdc8d8SChris Lattner     SBThread sb_thread;
1356611103cSGreg Clayton     if (m_opaque_sp)
1362976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
137*ceb6b139SCaroline Tice 
138*ceb6b139SCaroline Tice     if (log)
139*ceb6b139SCaroline Tice     {
140*ceb6b139SCaroline Tice         SBStream sstr;
141*ceb6b139SCaroline Tice         sb_thread.GetDescription (sstr);
142*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSelectedThread ==> SBThread (this = %p, '%s')", &sb_thread, sstr.GetData());
143*ceb6b139SCaroline Tice     }
144*ceb6b139SCaroline Tice 
14530fdc8d8SChris Lattner     return sb_thread;
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner SBTarget
14930fdc8d8SChris Lattner SBProcess::GetTarget() const
15030fdc8d8SChris Lattner {
151*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
152*ceb6b139SCaroline Tice 
153*ceb6b139SCaroline Tice     if (log)
154*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetTarget ()");
155*ceb6b139SCaroline Tice 
15630fdc8d8SChris Lattner     SBTarget sb_target;
1576611103cSGreg Clayton     if (m_opaque_sp)
1586611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
159*ceb6b139SCaroline Tice 
160*ceb6b139SCaroline Tice     if (log)
161*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetTarget ==> SBTarget (this = %p, m_opaque_sp.get())", &sb_target,
162*ceb6b139SCaroline Tice                      sb_target.get());
163*ceb6b139SCaroline Tice 
16430fdc8d8SChris Lattner     return sb_target;
16530fdc8d8SChris Lattner }
16630fdc8d8SChris Lattner 
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner size_t
16930fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
17030fdc8d8SChris Lattner {
171*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
172*ceb6b139SCaroline Tice 
173*ceb6b139SCaroline Tice     if (log)
174*ceb6b139SCaroline Tice         log->Printf ("SBProcess::PutSTDIN (%s, %d)", src, src_len);
175*ceb6b139SCaroline Tice 
176*ceb6b139SCaroline Tice     size_t ret_val = 0;
1776611103cSGreg Clayton     if (m_opaque_sp != NULL)
17830fdc8d8SChris Lattner     {
17930fdc8d8SChris Lattner         Error error;
180*ceb6b139SCaroline Tice         ret_val =  m_opaque_sp->PutSTDIN (src, src_len, error);
18130fdc8d8SChris Lattner     }
182*ceb6b139SCaroline Tice 
183*ceb6b139SCaroline Tice     if (log)
184*ceb6b139SCaroline Tice         log->Printf ("SBProcess::PutSTDIN ==> %d", ret_val);
185*ceb6b139SCaroline Tice 
186*ceb6b139SCaroline Tice     return ret_val;
18730fdc8d8SChris Lattner }
18830fdc8d8SChris Lattner 
18930fdc8d8SChris Lattner size_t
19030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
19130fdc8d8SChris Lattner {
192*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
193*ceb6b139SCaroline Tice 
194*ceb6b139SCaroline Tice     if (log)
195*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSTDOUT (char *dst, size_t dst_Len)");
196*ceb6b139SCaroline Tice 
197*ceb6b139SCaroline Tice     size_t ret_val = 0;
1986611103cSGreg Clayton     if (m_opaque_sp != NULL)
19930fdc8d8SChris Lattner     {
20030fdc8d8SChris Lattner         Error error;
201*ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
20230fdc8d8SChris Lattner     }
203*ceb6b139SCaroline Tice 
204*ceb6b139SCaroline Tice     if (log)
205*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSTDOUT ==> %d", ret_val);
206*ceb6b139SCaroline Tice 
207*ceb6b139SCaroline Tice     return ret_val;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner size_t
21130fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
21230fdc8d8SChris Lattner {
213*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
214*ceb6b139SCaroline Tice 
215*ceb6b139SCaroline Tice     if (log)
216*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSTDERR (char *dst, size_t dst_len)");
217*ceb6b139SCaroline Tice 
218*ceb6b139SCaroline Tice     size_t ret_val = 0;
2196611103cSGreg Clayton     if (m_opaque_sp != NULL)
22030fdc8d8SChris Lattner     {
22130fdc8d8SChris Lattner         Error error;
222*ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error);
22330fdc8d8SChris Lattner     }
224*ceb6b139SCaroline Tice 
225*ceb6b139SCaroline Tice     if (log)
226*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetSTDERR ==> %d", ret_val);
227*ceb6b139SCaroline Tice 
228*ceb6b139SCaroline Tice     return ret_val;
22930fdc8d8SChris Lattner }
23030fdc8d8SChris Lattner 
23130fdc8d8SChris Lattner void
2322976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
23330fdc8d8SChris Lattner {
23430fdc8d8SChris Lattner     if (out == NULL)
23530fdc8d8SChris Lattner         return;
23630fdc8d8SChris Lattner 
2376611103cSGreg Clayton     if (m_opaque_sp != NULL)
23830fdc8d8SChris Lattner     {
23930fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
24030fdc8d8SChris Lattner         char message[1024];
24130fdc8d8SChris Lattner         int message_len = ::snprintf (message,
24230fdc8d8SChris Lattner                                       sizeof (message),
24330fdc8d8SChris Lattner                                       "Process %d %s\n",
2446611103cSGreg Clayton                                       m_opaque_sp->GetID(),
24530fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
24630fdc8d8SChris Lattner 
24730fdc8d8SChris Lattner         if (message_len > 0)
24830fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
24930fdc8d8SChris Lattner     }
25030fdc8d8SChris Lattner }
25130fdc8d8SChris Lattner 
25230fdc8d8SChris Lattner void
2532976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
25430fdc8d8SChris Lattner {
2556611103cSGreg Clayton     if (m_opaque_sp != NULL)
25630fdc8d8SChris Lattner     {
25730fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
25830fdc8d8SChris Lattner         char message[1024];
25930fdc8d8SChris Lattner         ::snprintf (message,
26030fdc8d8SChris Lattner                     sizeof (message),
26130fdc8d8SChris Lattner                     "Process %d %s\n",
2626611103cSGreg Clayton                     m_opaque_sp->GetID(),
26330fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
26430fdc8d8SChris Lattner 
26530fdc8d8SChris Lattner         result.AppendMessage (message);
26630fdc8d8SChris Lattner     }
26730fdc8d8SChris Lattner }
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner bool
2702976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
27130fdc8d8SChris Lattner {
2726611103cSGreg Clayton     if (m_opaque_sp != NULL)
2732976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
27430fdc8d8SChris Lattner     return false;
27530fdc8d8SChris Lattner }
27630fdc8d8SChris Lattner 
27730fdc8d8SChris Lattner bool
2782976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
27930fdc8d8SChris Lattner {
280*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
281*ceb6b139SCaroline Tice 
282*ceb6b139SCaroline Tice     if (log)
283*ceb6b139SCaroline Tice         log->Printf ("SBProcess::SetSelectedThreadByID (%d)", tid);
284*ceb6b139SCaroline Tice 
285*ceb6b139SCaroline Tice     bool ret_val = false;
2866611103cSGreg Clayton     if (m_opaque_sp != NULL)
287*ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
288*ceb6b139SCaroline Tice 
289*ceb6b139SCaroline Tice     if (log)
290*ceb6b139SCaroline Tice         log->Printf ("SBProcess::SetSelectedThreadByID ==> %s", (ret_val ? "true" : "false"));
291*ceb6b139SCaroline Tice 
292*ceb6b139SCaroline Tice     return ret_val;
29330fdc8d8SChris Lattner }
29430fdc8d8SChris Lattner 
29530fdc8d8SChris Lattner SBThread
29630fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
29730fdc8d8SChris Lattner {
298*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
299*ceb6b139SCaroline Tice 
300*ceb6b139SCaroline Tice     if (log)
301*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetThreadAtIndex (%d)");
302*ceb6b139SCaroline Tice 
30330fdc8d8SChris Lattner     SBThread thread;
3046611103cSGreg Clayton     if (m_opaque_sp)
3056611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
306*ceb6b139SCaroline Tice 
307*ceb6b139SCaroline Tice     if (log)
308*ceb6b139SCaroline Tice     {
309*ceb6b139SCaroline Tice         SBStream sstr;
310*ceb6b139SCaroline Tice         thread.GetDescription (sstr);
311*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetThreadAtIndex ==> SBThread (this = %p, '%s')", &thread, sstr.GetData());
312*ceb6b139SCaroline Tice     }
313*ceb6b139SCaroline Tice 
31430fdc8d8SChris Lattner     return thread;
31530fdc8d8SChris Lattner }
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner StateType
31830fdc8d8SChris Lattner SBProcess::GetState ()
31930fdc8d8SChris Lattner {
320*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
321*ceb6b139SCaroline Tice 
322*ceb6b139SCaroline Tice     if (log)
323*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetState ()");
324*ceb6b139SCaroline Tice 
325*ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
3266611103cSGreg Clayton     if (m_opaque_sp != NULL)
327*ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetState();
328*ceb6b139SCaroline Tice 
329*ceb6b139SCaroline Tice     if (log)
330*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetState ==> %s", lldb_private::StateAsCString (ret_val));
331*ceb6b139SCaroline Tice 
332*ceb6b139SCaroline Tice     return ret_val;
33330fdc8d8SChris Lattner }
33430fdc8d8SChris Lattner 
33530fdc8d8SChris Lattner 
33630fdc8d8SChris Lattner int
33730fdc8d8SChris Lattner SBProcess::GetExitStatus ()
33830fdc8d8SChris Lattner {
3396611103cSGreg Clayton     if (m_opaque_sp != NULL)
3406611103cSGreg Clayton         return m_opaque_sp->GetExitStatus ();
34130fdc8d8SChris Lattner     else
34230fdc8d8SChris Lattner         return 0;
34330fdc8d8SChris Lattner }
34430fdc8d8SChris Lattner 
34530fdc8d8SChris Lattner const char *
34630fdc8d8SChris Lattner SBProcess::GetExitDescription ()
34730fdc8d8SChris Lattner {
3486611103cSGreg Clayton     if (m_opaque_sp != NULL)
3496611103cSGreg Clayton         return m_opaque_sp->GetExitDescription ();
35030fdc8d8SChris Lattner     else
35130fdc8d8SChris Lattner         return NULL;
35230fdc8d8SChris Lattner }
35330fdc8d8SChris Lattner 
35430fdc8d8SChris Lattner lldb::pid_t
35530fdc8d8SChris Lattner SBProcess::GetProcessID ()
35630fdc8d8SChris Lattner {
357*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
358*ceb6b139SCaroline Tice 
359*ceb6b139SCaroline Tice     if (log)
360*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetProcessID ()");
361*ceb6b139SCaroline Tice 
362*ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
3636611103cSGreg Clayton     if (m_opaque_sp)
364*ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetID();
365*ceb6b139SCaroline Tice 
366*ceb6b139SCaroline Tice     if (log)
367*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetProcessID ==> %d", ret_val);
368*ceb6b139SCaroline Tice 
369*ceb6b139SCaroline Tice     return ret_val;
37030fdc8d8SChris Lattner }
37130fdc8d8SChris Lattner 
37230fdc8d8SChris Lattner uint32_t
37330fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
37430fdc8d8SChris Lattner {
375*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
376*ceb6b139SCaroline Tice 
377*ceb6b139SCaroline Tice     if (log)
378*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetAddressByteSize()");
379*ceb6b139SCaroline Tice 
380*ceb6b139SCaroline Tice     uint32_t size = 0;
3816611103cSGreg Clayton     if (m_opaque_sp)
382*ceb6b139SCaroline Tice         size =  m_opaque_sp->GetAddressByteSize();
383*ceb6b139SCaroline Tice 
384*ceb6b139SCaroline Tice     if (log)
385*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetAddressByteSize ==> %d", size);
386*ceb6b139SCaroline Tice 
387*ceb6b139SCaroline Tice     return size;
38830fdc8d8SChris Lattner }
38930fdc8d8SChris Lattner 
39030fdc8d8SChris Lattner bool
39130fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
39230fdc8d8SChris Lattner {
39330fdc8d8SChris Lattner     bool state_changed = false;
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner     if (IsValid())
39630fdc8d8SChris Lattner     {
39730fdc8d8SChris Lattner         EventSP event_sp;
3986611103cSGreg Clayton         StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner         while (StateIsStoppedState (state))
40130fdc8d8SChris Lattner         {
4026611103cSGreg Clayton             state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
40330fdc8d8SChris Lattner             SBEvent event (event_sp);
4042976d00aSJim Ingham             AppendEventStateReport (event, result);
40530fdc8d8SChris Lattner             state_changed = true;
40630fdc8d8SChris Lattner         }
40730fdc8d8SChris Lattner     }
40830fdc8d8SChris Lattner     return state_changed;
40930fdc8d8SChris Lattner }
41030fdc8d8SChris Lattner 
41130fdc8d8SChris Lattner SBError
41230fdc8d8SChris Lattner SBProcess::Continue ()
41330fdc8d8SChris Lattner {
414*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
415*ceb6b139SCaroline Tice 
416*ceb6b139SCaroline Tice     if (log)
417*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Continue ()");
418*ceb6b139SCaroline Tice 
41930fdc8d8SChris Lattner     SBError sb_error;
42030fdc8d8SChris Lattner     if (IsValid())
4215d5028b5SGreg Clayton     {
4225d5028b5SGreg Clayton         Error error (m_opaque_sp->Resume());
4235d5028b5SGreg Clayton         if (error.Success())
4245d5028b5SGreg Clayton         {
4255d5028b5SGreg Clayton             if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
4265d5028b5SGreg Clayton                 m_opaque_sp->WaitForProcessToStop (NULL);
4275d5028b5SGreg Clayton         }
4285d5028b5SGreg Clayton         sb_error.SetError(error);
4295d5028b5SGreg Clayton     }
43030fdc8d8SChris Lattner     else
43130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
43230fdc8d8SChris Lattner 
433*ceb6b139SCaroline Tice     if (log)
434*ceb6b139SCaroline Tice     {
435*ceb6b139SCaroline Tice         SBStream sstr;
436*ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
437*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Continue ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData());
438*ceb6b139SCaroline Tice     }
439*ceb6b139SCaroline Tice 
44030fdc8d8SChris Lattner     return sb_error;
44130fdc8d8SChris Lattner }
44230fdc8d8SChris Lattner 
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner SBError
44530fdc8d8SChris Lattner SBProcess::Destroy ()
44630fdc8d8SChris Lattner {
44730fdc8d8SChris Lattner     SBError sb_error;
4486611103cSGreg Clayton     if (m_opaque_sp)
4496611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
45030fdc8d8SChris Lattner     else
45130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
45230fdc8d8SChris Lattner 
45330fdc8d8SChris Lattner     return sb_error;
45430fdc8d8SChris Lattner }
45530fdc8d8SChris Lattner 
45630fdc8d8SChris Lattner 
45730fdc8d8SChris Lattner SBError
45830fdc8d8SChris Lattner SBProcess::Stop ()
45930fdc8d8SChris Lattner {
460*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
461*ceb6b139SCaroline Tice 
462*ceb6b139SCaroline Tice     if (log)
463*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Stop ()");
464*ceb6b139SCaroline Tice 
46530fdc8d8SChris Lattner     SBError sb_error;
46630fdc8d8SChris Lattner     if (IsValid())
4676611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
46830fdc8d8SChris Lattner     else
46930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
470*ceb6b139SCaroline Tice 
471*ceb6b139SCaroline Tice     if (log)
472*ceb6b139SCaroline Tice     {
473*ceb6b139SCaroline Tice         SBStream sstr;
474*ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
475*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Stop ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData());
476*ceb6b139SCaroline Tice     }
477*ceb6b139SCaroline Tice 
47830fdc8d8SChris Lattner     return sb_error;
47930fdc8d8SChris Lattner }
48030fdc8d8SChris Lattner 
48130fdc8d8SChris Lattner SBError
48230fdc8d8SChris Lattner SBProcess::Kill ()
48330fdc8d8SChris Lattner {
484*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
485*ceb6b139SCaroline Tice 
486*ceb6b139SCaroline Tice     if (log)
487*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Kill ()");
488*ceb6b139SCaroline Tice 
48930fdc8d8SChris Lattner     SBError sb_error;
4906611103cSGreg Clayton     if (m_opaque_sp)
4916611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
49230fdc8d8SChris Lattner     else
49330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
494*ceb6b139SCaroline Tice 
495*ceb6b139SCaroline Tice     if (log)
496*ceb6b139SCaroline Tice     {
497*ceb6b139SCaroline Tice         SBStream sstr;
498*ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
499*ceb6b139SCaroline Tice         log->Printf ("SBProcess::Kill ==> SBError (this = %p,'%s')", &sb_error, sstr.GetData());
500*ceb6b139SCaroline Tice     }
501*ceb6b139SCaroline Tice 
50230fdc8d8SChris Lattner     return sb_error;
50330fdc8d8SChris Lattner }
50430fdc8d8SChris Lattner 
50530fdc8d8SChris Lattner 
50630fdc8d8SChris Lattner SBError
50730fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
50830fdc8d8SChris Lattner {
50930fdc8d8SChris Lattner     SBError sb_error;
5106611103cSGreg Clayton     if (m_opaque_sp)
5116611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
51230fdc8d8SChris Lattner     else
51330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
51430fdc8d8SChris Lattner     return sb_error;
51530fdc8d8SChris Lattner }
51630fdc8d8SChris Lattner 
51730fdc8d8SChris Lattner lldb::pid_t
51830fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
51930fdc8d8SChris Lattner {
52030fdc8d8SChris Lattner     Attach (attach_pid);
52130fdc8d8SChris Lattner     return GetProcessID();
52230fdc8d8SChris Lattner }
52330fdc8d8SChris Lattner 
52430fdc8d8SChris Lattner 
52530fdc8d8SChris Lattner SBError
52630fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
52730fdc8d8SChris Lattner {
52830fdc8d8SChris Lattner     SBError sb_error;
5296611103cSGreg Clayton     if (m_opaque_sp)
5306611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
53130fdc8d8SChris Lattner     else
53230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
53330fdc8d8SChris Lattner     return sb_error;
53430fdc8d8SChris Lattner }
53530fdc8d8SChris Lattner 
53630fdc8d8SChris Lattner SBError
53730fdc8d8SChris Lattner SBProcess::Detach ()
53830fdc8d8SChris Lattner {
53930fdc8d8SChris Lattner     SBError sb_error;
5406611103cSGreg Clayton     if (m_opaque_sp)
5416611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
54230fdc8d8SChris Lattner     else
54330fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
54430fdc8d8SChris Lattner 
54530fdc8d8SChris Lattner     return sb_error;
54630fdc8d8SChris Lattner }
54730fdc8d8SChris Lattner 
54830fdc8d8SChris Lattner SBError
54930fdc8d8SChris Lattner SBProcess::Signal (int signal)
55030fdc8d8SChris Lattner {
55130fdc8d8SChris Lattner     SBError sb_error;
5526611103cSGreg Clayton     if (m_opaque_sp)
5536611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signal));
55430fdc8d8SChris Lattner     else
55530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
55630fdc8d8SChris Lattner     return sb_error;
55730fdc8d8SChris Lattner }
55830fdc8d8SChris Lattner 
55930fdc8d8SChris Lattner SBThread
56030fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
56130fdc8d8SChris Lattner {
56230fdc8d8SChris Lattner     SBThread thread;
5636611103cSGreg Clayton     if (m_opaque_sp)
5646611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
56530fdc8d8SChris Lattner     return thread;
56630fdc8d8SChris Lattner }
56730fdc8d8SChris Lattner 
56830fdc8d8SChris Lattner StateType
56930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
57030fdc8d8SChris Lattner {
571*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
572*ceb6b139SCaroline Tice 
573*ceb6b139SCaroline Tice     if (log)
574*ceb6b139SCaroline Tice     {
575*ceb6b139SCaroline Tice         SBStream sstr;
576*ceb6b139SCaroline Tice         event.GetDescription (sstr);
577*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetStateFromEvent (%s)", sstr.GetData());
578*ceb6b139SCaroline Tice     }
579*ceb6b139SCaroline Tice 
580*ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
581*ceb6b139SCaroline Tice 
582*ceb6b139SCaroline Tice     if (log)
583*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetStateFromEvent ==> %s", lldb_private::StateAsCString (ret_val));
584*ceb6b139SCaroline Tice 
585*ceb6b139SCaroline Tice     return ret_val;
58630fdc8d8SChris Lattner }
58730fdc8d8SChris Lattner 
58830fdc8d8SChris Lattner bool
58930fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
59030fdc8d8SChris Lattner {
5916611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
59230fdc8d8SChris Lattner }
59330fdc8d8SChris Lattner 
59430fdc8d8SChris Lattner SBProcess
59530fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
59630fdc8d8SChris Lattner {
5976611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
59830fdc8d8SChris Lattner     return process;
59930fdc8d8SChris Lattner }
60030fdc8d8SChris Lattner 
60130fdc8d8SChris Lattner 
60230fdc8d8SChris Lattner SBBroadcaster
60330fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
60430fdc8d8SChris Lattner {
605*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
606*ceb6b139SCaroline Tice 
607*ceb6b139SCaroline Tice     if (log)
608*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetBroadcaster ()");
6096611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
610*ceb6b139SCaroline Tice 
611*ceb6b139SCaroline Tice     if (log)
612*ceb6b139SCaroline Tice         log->Printf ("SBProcess::GetBroadcaster ==> SBBroadcaster (this = %p, m_opaque = %p)",  &broadcaster,
613*ceb6b139SCaroline Tice                      m_opaque_sp.get());
614*ceb6b139SCaroline Tice 
61530fdc8d8SChris Lattner     return broadcaster;
61630fdc8d8SChris Lattner }
61730fdc8d8SChris Lattner 
61830fdc8d8SChris Lattner lldb_private::Process *
61930fdc8d8SChris Lattner SBProcess::operator->() const
62030fdc8d8SChris Lattner {
6216611103cSGreg Clayton     return m_opaque_sp.get();
62230fdc8d8SChris Lattner }
62330fdc8d8SChris Lattner 
62430fdc8d8SChris Lattner size_t
62530fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
62630fdc8d8SChris Lattner {
627*ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
628*ceb6b139SCaroline Tice 
629*ceb6b139SCaroline Tice     if (log)
630*ceb6b139SCaroline Tice         log->Printf ("SBProcess::ReadMemory (%p, %p, %d, sb_error)", addr, dst, dst_len);
631*ceb6b139SCaroline Tice 
63230fdc8d8SChris Lattner     size_t bytes_read = 0;
63330fdc8d8SChris Lattner 
63430fdc8d8SChris Lattner     if (IsValid())
63530fdc8d8SChris Lattner     {
63630fdc8d8SChris Lattner         Error error;
6376611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
63830fdc8d8SChris Lattner         sb_error.SetError (error);
63930fdc8d8SChris Lattner     }
64030fdc8d8SChris Lattner     else
64130fdc8d8SChris Lattner     {
64230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
64330fdc8d8SChris Lattner     }
64430fdc8d8SChris Lattner 
645*ceb6b139SCaroline Tice     if (log)
646*ceb6b139SCaroline Tice         log->Printf ("SBProcess::ReadMemory ==> %d", bytes_read);
647*ceb6b139SCaroline Tice 
64830fdc8d8SChris Lattner     return bytes_read;
64930fdc8d8SChris Lattner }
65030fdc8d8SChris Lattner 
65130fdc8d8SChris Lattner size_t
65230fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
65330fdc8d8SChris Lattner {
65430fdc8d8SChris Lattner     size_t bytes_written = 0;
65530fdc8d8SChris Lattner 
65630fdc8d8SChris Lattner     if (IsValid())
65730fdc8d8SChris Lattner     {
65830fdc8d8SChris Lattner         Error error;
6596611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
66030fdc8d8SChris Lattner         sb_error.SetError (error);
66130fdc8d8SChris Lattner     }
66230fdc8d8SChris Lattner 
66330fdc8d8SChris Lattner     return bytes_written;
66430fdc8d8SChris Lattner }
66530fdc8d8SChris Lattner 
66630fdc8d8SChris Lattner // Mimic shared pointer...
66730fdc8d8SChris Lattner lldb_private::Process *
66830fdc8d8SChris Lattner SBProcess::get() const
66930fdc8d8SChris Lattner {
6706611103cSGreg Clayton     return m_opaque_sp.get();
67130fdc8d8SChris Lattner }
67230fdc8d8SChris Lattner 
673dde9cff3SCaroline Tice bool
674dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
675dde9cff3SCaroline Tice {
676dde9cff3SCaroline Tice     if (m_opaque_sp)
677dde9cff3SCaroline Tice     {
678dde9cff3SCaroline Tice         char path[PATH_MAX];
679dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
6801d273166SGreg Clayton         Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
6811d273166SGreg Clayton         const char *exe_name = NULL;
6821d273166SGreg Clayton         if (exe_module)
6831d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
6841d273166SGreg Clayton 
68505faeb71SGreg Clayton         description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
6861d273166SGreg Clayton                             m_opaque_sp->GetID(),
687*ceb6b139SCaroline Tice                             lldb_private::StateAsCString (GetState()),
6881d273166SGreg Clayton                             GetNumThreads(),
68905faeb71SGreg Clayton                             exe_name ? ", executable = " : "",
6901d273166SGreg Clayton                             exe_name ? exe_name : "");
691dde9cff3SCaroline Tice     }
692dde9cff3SCaroline Tice     else
693dde9cff3SCaroline Tice         description.Printf ("No value");
694dde9cff3SCaroline Tice 
695dde9cff3SCaroline Tice     return true;
696dde9cff3SCaroline Tice }
697