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 {
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
606611103cSGreg Clayton     m_opaque_sp (process_sp)
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner //----------------------------------------------------------------------
6530fdc8d8SChris Lattner // Destructor
6630fdc8d8SChris Lattner //----------------------------------------------------------------------
6730fdc8d8SChris Lattner SBProcess::~SBProcess()
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner void
7230fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
7330fdc8d8SChris Lattner {
746611103cSGreg Clayton     m_opaque_sp = process_sp;
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner void
7830fdc8d8SChris Lattner SBProcess::Clear ()
7930fdc8d8SChris Lattner {
806611103cSGreg Clayton     m_opaque_sp.reset();
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner bool
8530fdc8d8SChris Lattner SBProcess::IsValid() const
8630fdc8d8SChris Lattner {
876611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
8830fdc8d8SChris Lattner }
8930fdc8d8SChris Lattner 
9030fdc8d8SChris Lattner 
9130fdc8d8SChris Lattner uint32_t
9230fdc8d8SChris Lattner SBProcess::GetNumThreads ()
9330fdc8d8SChris Lattner {
94ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
95ceb6b139SCaroline Tice 
96ceb6b139SCaroline Tice     uint32_t num_threads = 0;
976611103cSGreg Clayton     if (m_opaque_sp)
9830fdc8d8SChris Lattner     {
9930fdc8d8SChris Lattner         const bool can_update = true;
100ceb6b139SCaroline Tice         num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
10130fdc8d8SChris Lattner     }
102ceb6b139SCaroline Tice 
103ceb6b139SCaroline Tice     if (log)
10493aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads);
105ceb6b139SCaroline Tice 
106ceb6b139SCaroline Tice     return num_threads;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner SBThread
1102976d00aSJim Ingham SBProcess::GetSelectedThread () const
11130fdc8d8SChris Lattner {
112ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
113ceb6b139SCaroline Tice 
11430fdc8d8SChris Lattner     SBThread sb_thread;
1156611103cSGreg Clayton     if (m_opaque_sp)
1162976d00aSJim Ingham         sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
117ceb6b139SCaroline Tice 
118ceb6b139SCaroline Tice     if (log)
119ceb6b139SCaroline Tice     {
1204838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get());
121ceb6b139SCaroline Tice     }
122ceb6b139SCaroline Tice 
12330fdc8d8SChris Lattner     return sb_thread;
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner SBTarget
12730fdc8d8SChris Lattner SBProcess::GetTarget() const
12830fdc8d8SChris Lattner {
129ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
130ceb6b139SCaroline Tice 
13130fdc8d8SChris Lattner     SBTarget sb_target;
1326611103cSGreg Clayton     if (m_opaque_sp)
1336611103cSGreg Clayton         sb_target = m_opaque_sp->GetTarget().GetSP();
134ceb6b139SCaroline Tice 
135ceb6b139SCaroline Tice     if (log)
13693aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
137ceb6b139SCaroline Tice 
13830fdc8d8SChris Lattner     return sb_target;
13930fdc8d8SChris Lattner }
14030fdc8d8SChris Lattner 
14130fdc8d8SChris Lattner 
14230fdc8d8SChris Lattner size_t
14330fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
14430fdc8d8SChris Lattner {
145ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
146ceb6b139SCaroline Tice 
147ceb6b139SCaroline Tice     size_t ret_val = 0;
1486611103cSGreg Clayton     if (m_opaque_sp != NULL)
14930fdc8d8SChris Lattner     {
15030fdc8d8SChris Lattner         Error error;
151ceb6b139SCaroline Tice         ret_val =  m_opaque_sp->PutSTDIN (src, src_len, error);
15230fdc8d8SChris Lattner     }
153ceb6b139SCaroline Tice 
154ceb6b139SCaroline Tice     if (log)
155*cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %d",
15693aa84e8SGreg Clayton                      m_opaque_sp.get(),
15793aa84e8SGreg Clayton                      src,
15893aa84e8SGreg Clayton                      (uint32_t) src_len,
15993aa84e8SGreg Clayton                      ret_val);
160ceb6b139SCaroline Tice 
161ceb6b139SCaroline Tice     return ret_val;
16230fdc8d8SChris Lattner }
16330fdc8d8SChris Lattner 
16430fdc8d8SChris Lattner size_t
16530fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
16630fdc8d8SChris Lattner {
167*cfd1acedSGreg Clayton     size_t bytes_read = 0;
1686611103cSGreg Clayton     if (m_opaque_sp != NULL)
16930fdc8d8SChris Lattner     {
17030fdc8d8SChris Lattner         Error error;
171*cfd1acedSGreg Clayton         bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
17230fdc8d8SChris Lattner     }
173ceb6b139SCaroline Tice 
174*cfd1acedSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
175ceb6b139SCaroline Tice     if (log)
176*cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
177*cfd1acedSGreg Clayton                      m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
178ceb6b139SCaroline Tice 
179*cfd1acedSGreg Clayton     return bytes_read;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner size_t
18330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
18430fdc8d8SChris Lattner {
185*cfd1acedSGreg Clayton     size_t bytes_read = 0;
1866611103cSGreg Clayton     if (m_opaque_sp != NULL)
18730fdc8d8SChris Lattner     {
18830fdc8d8SChris Lattner         Error error;
189*cfd1acedSGreg Clayton         bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error);
19030fdc8d8SChris Lattner     }
191ceb6b139SCaroline Tice 
192*cfd1acedSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
193ceb6b139SCaroline Tice     if (log)
194*cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
195*cfd1acedSGreg Clayton                      m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
196ceb6b139SCaroline Tice 
197*cfd1acedSGreg Clayton     return bytes_read;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner void
2012976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
20230fdc8d8SChris Lattner {
20330fdc8d8SChris Lattner     if (out == NULL)
20430fdc8d8SChris Lattner         return;
20530fdc8d8SChris Lattner 
2066611103cSGreg Clayton     if (m_opaque_sp != NULL)
20730fdc8d8SChris Lattner     {
20830fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
20930fdc8d8SChris Lattner         char message[1024];
21030fdc8d8SChris Lattner         int message_len = ::snprintf (message,
21130fdc8d8SChris Lattner                                       sizeof (message),
21230fdc8d8SChris Lattner                                       "Process %d %s\n",
2136611103cSGreg Clayton                                       m_opaque_sp->GetID(),
21430fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner         if (message_len > 0)
21730fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
21830fdc8d8SChris Lattner     }
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner void
2222976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
22330fdc8d8SChris Lattner {
2246611103cSGreg Clayton     if (m_opaque_sp != NULL)
22530fdc8d8SChris Lattner     {
22630fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
22730fdc8d8SChris Lattner         char message[1024];
22830fdc8d8SChris Lattner         ::snprintf (message,
22930fdc8d8SChris Lattner                     sizeof (message),
23030fdc8d8SChris Lattner                     "Process %d %s\n",
2316611103cSGreg Clayton                     m_opaque_sp->GetID(),
23230fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
23330fdc8d8SChris Lattner 
23430fdc8d8SChris Lattner         result.AppendMessage (message);
23530fdc8d8SChris Lattner     }
23630fdc8d8SChris Lattner }
23730fdc8d8SChris Lattner 
23830fdc8d8SChris Lattner bool
2392976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
24030fdc8d8SChris Lattner {
2416611103cSGreg Clayton     if (m_opaque_sp != NULL)
2422976d00aSJim Ingham         return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
24330fdc8d8SChris Lattner     return false;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner bool
2472976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid)
24830fdc8d8SChris Lattner {
249ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
250ceb6b139SCaroline Tice 
251ceb6b139SCaroline Tice     bool ret_val = false;
2526611103cSGreg Clayton     if (m_opaque_sp != NULL)
253ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
254ceb6b139SCaroline Tice 
255ceb6b139SCaroline Tice     if (log)
256*cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
25793aa84e8SGreg Clayton                      m_opaque_sp.get(), tid, (ret_val ? "true" : "false"));
258ceb6b139SCaroline Tice 
259ceb6b139SCaroline Tice     return ret_val;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner SBThread
26330fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
26430fdc8d8SChris Lattner {
265ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
266ceb6b139SCaroline Tice 
26730fdc8d8SChris Lattner     SBThread thread;
2686611103cSGreg Clayton     if (m_opaque_sp)
2696611103cSGreg Clayton         thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
270ceb6b139SCaroline Tice 
271ceb6b139SCaroline Tice     if (log)
272ceb6b139SCaroline Tice     {
27393aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
2744838131bSGreg Clayton                      m_opaque_sp.get(), (uint32_t) index, thread.get());
275ceb6b139SCaroline Tice     }
276ceb6b139SCaroline Tice 
27730fdc8d8SChris Lattner     return thread;
27830fdc8d8SChris Lattner }
27930fdc8d8SChris Lattner 
28030fdc8d8SChris Lattner StateType
28130fdc8d8SChris Lattner SBProcess::GetState ()
28230fdc8d8SChris Lattner {
283ceb6b139SCaroline Tice 
284ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
2856611103cSGreg Clayton     if (m_opaque_sp != NULL)
286ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetState();
287ceb6b139SCaroline Tice 
2884838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
289ceb6b139SCaroline Tice     if (log)
290*cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
29193aa84e8SGreg Clayton                      m_opaque_sp.get(),
292750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
293ceb6b139SCaroline Tice 
294ceb6b139SCaroline Tice     return ret_val;
29530fdc8d8SChris Lattner }
29630fdc8d8SChris Lattner 
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner int
29930fdc8d8SChris Lattner SBProcess::GetExitStatus ()
30030fdc8d8SChris Lattner {
3014838131bSGreg Clayton     int exit_status = 0;
3024838131bSGreg Clayton     if (m_opaque_sp)
3034838131bSGreg Clayton         exit_status = m_opaque_sp->GetExitStatus ();
3044838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
3054838131bSGreg Clayton     if (log)
3064838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
3074838131bSGreg Clayton                      m_opaque_sp.get(), exit_status, exit_status);
3084838131bSGreg Clayton 
3094838131bSGreg Clayton     return exit_status;
31030fdc8d8SChris Lattner }
31130fdc8d8SChris Lattner 
31230fdc8d8SChris Lattner const char *
31330fdc8d8SChris Lattner SBProcess::GetExitDescription ()
31430fdc8d8SChris Lattner {
3154838131bSGreg Clayton     const char *exit_desc = NULL;
3166611103cSGreg Clayton     if (m_opaque_sp != NULL)
3174838131bSGreg Clayton         exit_desc = m_opaque_sp->GetExitDescription ();
3184838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
3194838131bSGreg Clayton     if (log)
3204838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
3214838131bSGreg Clayton                      m_opaque_sp.get(), exit_desc);
3224838131bSGreg Clayton     return exit_desc;
32330fdc8d8SChris Lattner }
32430fdc8d8SChris Lattner 
32530fdc8d8SChris Lattner lldb::pid_t
32630fdc8d8SChris Lattner SBProcess::GetProcessID ()
32730fdc8d8SChris Lattner {
328ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
3296611103cSGreg Clayton     if (m_opaque_sp)
330ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetID();
331ceb6b139SCaroline Tice 
3324838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
333ceb6b139SCaroline Tice     if (log)
33493aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val);
335ceb6b139SCaroline Tice 
336ceb6b139SCaroline Tice     return ret_val;
33730fdc8d8SChris Lattner }
33830fdc8d8SChris Lattner 
33930fdc8d8SChris Lattner uint32_t
34030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
34130fdc8d8SChris Lattner {
342ceb6b139SCaroline Tice     uint32_t size = 0;
3436611103cSGreg Clayton     if (m_opaque_sp)
344ceb6b139SCaroline Tice         size =  m_opaque_sp->GetAddressByteSize();
345ceb6b139SCaroline Tice 
3464838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
347ceb6b139SCaroline Tice     if (log)
34893aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size);
349ceb6b139SCaroline Tice 
350ceb6b139SCaroline Tice     return size;
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner 
35330fdc8d8SChris Lattner SBError
35430fdc8d8SChris Lattner SBProcess::Continue ()
35530fdc8d8SChris Lattner {
3564838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
3574838131bSGreg Clayton     if (log)
3584838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get());
359ceb6b139SCaroline Tice 
36030fdc8d8SChris Lattner     SBError sb_error;
36130fdc8d8SChris Lattner     if (IsValid())
3625d5028b5SGreg Clayton     {
3635d5028b5SGreg Clayton         Error error (m_opaque_sp->Resume());
3645d5028b5SGreg Clayton         if (error.Success())
3655d5028b5SGreg Clayton         {
3665d5028b5SGreg Clayton             if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
3674838131bSGreg Clayton             {
3684838131bSGreg Clayton                 if (log)
3694838131bSGreg Clayton                     log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get());
3705d5028b5SGreg Clayton                 m_opaque_sp->WaitForProcessToStop (NULL);
3715d5028b5SGreg Clayton             }
3724838131bSGreg Clayton         }
3735d5028b5SGreg Clayton         sb_error.SetError(error);
3745d5028b5SGreg Clayton     }
37530fdc8d8SChris Lattner     else
37630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
37730fdc8d8SChris Lattner 
378ceb6b139SCaroline Tice     if (log)
379ceb6b139SCaroline Tice     {
380ceb6b139SCaroline Tice         SBStream sstr;
381ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
38293aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
383ceb6b139SCaroline Tice     }
384ceb6b139SCaroline Tice 
38530fdc8d8SChris Lattner     return sb_error;
38630fdc8d8SChris Lattner }
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner 
38930fdc8d8SChris Lattner SBError
39030fdc8d8SChris Lattner SBProcess::Destroy ()
39130fdc8d8SChris Lattner {
39230fdc8d8SChris Lattner     SBError sb_error;
3936611103cSGreg Clayton     if (m_opaque_sp)
3946611103cSGreg Clayton         sb_error.SetError(m_opaque_sp->Destroy());
39530fdc8d8SChris Lattner     else
39630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
39730fdc8d8SChris Lattner 
3984838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
3994838131bSGreg Clayton     if (log)
4004838131bSGreg Clayton     {
4014838131bSGreg Clayton         SBStream sstr;
4024838131bSGreg Clayton         sb_error.GetDescription (sstr);
4034838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
4044838131bSGreg Clayton     }
4054838131bSGreg Clayton 
40630fdc8d8SChris Lattner     return sb_error;
40730fdc8d8SChris Lattner }
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner 
41030fdc8d8SChris Lattner SBError
41130fdc8d8SChris Lattner SBProcess::Stop ()
41230fdc8d8SChris Lattner {
413ceb6b139SCaroline Tice 
41430fdc8d8SChris Lattner     SBError sb_error;
41530fdc8d8SChris Lattner     if (IsValid())
4166611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Halt());
41730fdc8d8SChris Lattner     else
41830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
419ceb6b139SCaroline Tice 
42020ad3c40SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
421ceb6b139SCaroline Tice     if (log)
422ceb6b139SCaroline Tice     {
423ceb6b139SCaroline Tice         SBStream sstr;
424ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
42593aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
42693aa84e8SGreg Clayton                      m_opaque_sp.get(),
42793aa84e8SGreg Clayton                      sb_error.get(),
428750cd175SCaroline Tice                      sstr.GetData());
429ceb6b139SCaroline Tice     }
430ceb6b139SCaroline Tice 
43130fdc8d8SChris Lattner     return sb_error;
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner SBError
43530fdc8d8SChris Lattner SBProcess::Kill ()
43630fdc8d8SChris Lattner {
437ceb6b139SCaroline Tice 
43830fdc8d8SChris Lattner     SBError sb_error;
4396611103cSGreg Clayton     if (m_opaque_sp)
4406611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Destroy());
44130fdc8d8SChris Lattner     else
44230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
443ceb6b139SCaroline Tice 
44420ad3c40SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
445ceb6b139SCaroline Tice     if (log)
446ceb6b139SCaroline Tice     {
447ceb6b139SCaroline Tice         SBStream sstr;
448ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
44993aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
45093aa84e8SGreg Clayton                      m_opaque_sp.get(),
45193aa84e8SGreg Clayton                      sb_error.get(),
452750cd175SCaroline Tice                      sstr.GetData());
453ceb6b139SCaroline Tice     }
454ceb6b139SCaroline Tice 
45530fdc8d8SChris Lattner     return sb_error;
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner 
45930fdc8d8SChris Lattner SBError
4604838131bSGreg Clayton SBProcess::AttachByName (const char *name, bool wait_for_launch) // DEPRECATED
46130fdc8d8SChris Lattner {
46230fdc8d8SChris Lattner     SBError sb_error;
4636611103cSGreg Clayton     if (m_opaque_sp)
4646611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
46530fdc8d8SChris Lattner     else
46630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
46730fdc8d8SChris Lattner     return sb_error;
46830fdc8d8SChris Lattner }
46930fdc8d8SChris Lattner 
47030fdc8d8SChris Lattner lldb::pid_t
4714838131bSGreg Clayton SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED
47230fdc8d8SChris Lattner {
47330fdc8d8SChris Lattner     Attach (attach_pid);
47430fdc8d8SChris Lattner     return GetProcessID();
47530fdc8d8SChris Lattner }
47630fdc8d8SChris Lattner 
47730fdc8d8SChris Lattner 
47830fdc8d8SChris Lattner SBError
4794838131bSGreg Clayton SBProcess::Attach (lldb::pid_t attach_pid) // DEPRECATED
48030fdc8d8SChris Lattner {
48130fdc8d8SChris Lattner     SBError sb_error;
4826611103cSGreg Clayton     if (m_opaque_sp)
4836611103cSGreg Clayton         sb_error.SetError  (m_opaque_sp->Attach (attach_pid));
48430fdc8d8SChris Lattner     else
48530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
48630fdc8d8SChris Lattner     return sb_error;
48730fdc8d8SChris Lattner }
48830fdc8d8SChris Lattner 
48930fdc8d8SChris Lattner SBError
49030fdc8d8SChris Lattner SBProcess::Detach ()
49130fdc8d8SChris Lattner {
49230fdc8d8SChris Lattner     SBError sb_error;
4936611103cSGreg Clayton     if (m_opaque_sp)
4946611103cSGreg Clayton         sb_error.SetError (m_opaque_sp->Detach());
49530fdc8d8SChris Lattner     else
49630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
49730fdc8d8SChris Lattner 
49830fdc8d8SChris Lattner     return sb_error;
49930fdc8d8SChris Lattner }
50030fdc8d8SChris Lattner 
50130fdc8d8SChris Lattner SBError
5024838131bSGreg Clayton SBProcess::Signal (int signo)
50330fdc8d8SChris Lattner {
50430fdc8d8SChris Lattner     SBError sb_error;
5056611103cSGreg Clayton     if (m_opaque_sp)
5064838131bSGreg Clayton         sb_error.SetError (m_opaque_sp->Signal (signo));
50730fdc8d8SChris Lattner     else
50830fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
5094838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
5104838131bSGreg Clayton     if (log)
5114838131bSGreg Clayton     {
5124838131bSGreg Clayton         SBStream sstr;
5134838131bSGreg Clayton         sb_error.GetDescription (sstr);
5144838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
5154838131bSGreg Clayton                      m_opaque_sp.get(),
5164838131bSGreg Clayton                      signo,
5174838131bSGreg Clayton                      sb_error.get(),
5184838131bSGreg Clayton                      sstr.GetData());
5194838131bSGreg Clayton     }
52030fdc8d8SChris Lattner     return sb_error;
52130fdc8d8SChris Lattner }
52230fdc8d8SChris Lattner 
52330fdc8d8SChris Lattner SBThread
5244838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
52530fdc8d8SChris Lattner {
5264838131bSGreg Clayton     SBThread sb_thread;
5276611103cSGreg Clayton     if (m_opaque_sp)
5284838131bSGreg Clayton         sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid));
5294838131bSGreg Clayton 
5304838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
5314838131bSGreg Clayton     if (log)
5324838131bSGreg Clayton     {
5334838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)",
5344838131bSGreg Clayton                      m_opaque_sp.get(),
5354838131bSGreg Clayton                      tid,
5364838131bSGreg Clayton                      sb_thread.get());
5374838131bSGreg Clayton     }
5384838131bSGreg Clayton 
5394838131bSGreg Clayton     return sb_thread;
54030fdc8d8SChris Lattner }
54130fdc8d8SChris Lattner 
54230fdc8d8SChris Lattner StateType
54330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
54430fdc8d8SChris Lattner {
545ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
546ceb6b139SCaroline Tice 
547ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
548ceb6b139SCaroline Tice 
549ceb6b139SCaroline Tice     if (log)
550*cfd1acedSGreg Clayton         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
551750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
552ceb6b139SCaroline Tice 
553ceb6b139SCaroline Tice     return ret_val;
55430fdc8d8SChris Lattner }
55530fdc8d8SChris Lattner 
55630fdc8d8SChris Lattner bool
55730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
55830fdc8d8SChris Lattner {
5596611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
56030fdc8d8SChris Lattner }
56130fdc8d8SChris Lattner 
56230fdc8d8SChris Lattner SBProcess
56330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
56430fdc8d8SChris Lattner {
5656611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
56630fdc8d8SChris Lattner     return process;
56730fdc8d8SChris Lattner }
56830fdc8d8SChris Lattner 
56930fdc8d8SChris Lattner 
57030fdc8d8SChris Lattner SBBroadcaster
57130fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
57230fdc8d8SChris Lattner {
573ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
574ceb6b139SCaroline Tice 
5756611103cSGreg Clayton     SBBroadcaster broadcaster(m_opaque_sp.get(), false);
576ceb6b139SCaroline Tice 
577ceb6b139SCaroline Tice     if (log)
57893aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  m_opaque_sp.get(),
579750cd175SCaroline Tice                      broadcaster.get());
580ceb6b139SCaroline Tice 
58130fdc8d8SChris Lattner     return broadcaster;
58230fdc8d8SChris Lattner }
58330fdc8d8SChris Lattner 
58430fdc8d8SChris Lattner lldb_private::Process *
58530fdc8d8SChris Lattner SBProcess::operator->() const
58630fdc8d8SChris Lattner {
5876611103cSGreg Clayton     return m_opaque_sp.get();
58830fdc8d8SChris Lattner }
58930fdc8d8SChris Lattner 
59030fdc8d8SChris Lattner size_t
59130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
59230fdc8d8SChris Lattner {
593ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
594ceb6b139SCaroline Tice 
59530fdc8d8SChris Lattner     size_t bytes_read = 0;
59630fdc8d8SChris Lattner 
5974838131bSGreg Clayton     if (log)
5984838131bSGreg Clayton     {
5994838131bSGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
6004838131bSGreg Clayton                      m_opaque_sp.get(),
6014838131bSGreg Clayton                      addr,
6024838131bSGreg Clayton                      dst,
6034838131bSGreg Clayton                      (uint32_t) dst_len,
6044838131bSGreg Clayton                      sb_error.get());
6054838131bSGreg Clayton     }
6064838131bSGreg Clayton 
60730fdc8d8SChris Lattner     if (IsValid())
60830fdc8d8SChris Lattner     {
60930fdc8d8SChris Lattner         Error error;
6106611103cSGreg Clayton         bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
61130fdc8d8SChris Lattner         sb_error.SetError (error);
61230fdc8d8SChris Lattner     }
61330fdc8d8SChris Lattner     else
61430fdc8d8SChris Lattner     {
61530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
61630fdc8d8SChris Lattner     }
61730fdc8d8SChris Lattner 
618ceb6b139SCaroline Tice     if (log)
61993aa84e8SGreg Clayton     {
62093aa84e8SGreg Clayton         SBStream sstr;
62193aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
6224838131bSGreg Clayton         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d",
62393aa84e8SGreg Clayton                      m_opaque_sp.get(),
62493aa84e8SGreg Clayton                      addr,
62593aa84e8SGreg Clayton                      dst,
62693aa84e8SGreg Clayton                      (uint32_t) dst_len,
62793aa84e8SGreg Clayton                      sb_error.get(),
62893aa84e8SGreg Clayton                      sstr.GetData(),
62993aa84e8SGreg Clayton                      (uint32_t) bytes_read);
63093aa84e8SGreg Clayton     }
631ceb6b139SCaroline Tice 
63230fdc8d8SChris Lattner     return bytes_read;
63330fdc8d8SChris Lattner }
63430fdc8d8SChris Lattner 
63530fdc8d8SChris Lattner size_t
63630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
63730fdc8d8SChris Lattner {
63830fdc8d8SChris Lattner     size_t bytes_written = 0;
63930fdc8d8SChris Lattner 
6404838131bSGreg Clayton     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
6414838131bSGreg Clayton     if (log)
6424838131bSGreg Clayton     {
6434838131bSGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
6444838131bSGreg Clayton                      m_opaque_sp.get(),
6454838131bSGreg Clayton                      addr,
6464838131bSGreg Clayton                      src,
6474838131bSGreg Clayton                      (uint32_t) src_len,
6484838131bSGreg Clayton                      sb_error.get());
6494838131bSGreg Clayton     }
6504838131bSGreg Clayton 
65130fdc8d8SChris Lattner     if (IsValid())
65230fdc8d8SChris Lattner     {
65330fdc8d8SChris Lattner         Error error;
6546611103cSGreg Clayton         bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
65530fdc8d8SChris Lattner         sb_error.SetError (error);
65630fdc8d8SChris Lattner     }
65730fdc8d8SChris Lattner 
6584838131bSGreg Clayton     if (log)
6594838131bSGreg Clayton     {
6604838131bSGreg Clayton         SBStream sstr;
6614838131bSGreg Clayton         sb_error.GetDescription (sstr);
6624838131bSGreg Clayton         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d",
6634838131bSGreg Clayton                      m_opaque_sp.get(),
6644838131bSGreg Clayton                      addr,
6654838131bSGreg Clayton                      src,
6664838131bSGreg Clayton                      (uint32_t) src_len,
6674838131bSGreg Clayton                      sb_error.get(),
6684838131bSGreg Clayton                      sstr.GetData(),
6694838131bSGreg Clayton                      (uint32_t) bytes_written);
6704838131bSGreg Clayton     }
6714838131bSGreg Clayton 
67230fdc8d8SChris Lattner     return bytes_written;
67330fdc8d8SChris Lattner }
67430fdc8d8SChris Lattner 
67530fdc8d8SChris Lattner // Mimic shared pointer...
67630fdc8d8SChris Lattner lldb_private::Process *
67730fdc8d8SChris Lattner SBProcess::get() const
67830fdc8d8SChris Lattner {
6796611103cSGreg Clayton     return m_opaque_sp.get();
68030fdc8d8SChris Lattner }
68130fdc8d8SChris Lattner 
682dde9cff3SCaroline Tice bool
683dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
684dde9cff3SCaroline Tice {
685dde9cff3SCaroline Tice     if (m_opaque_sp)
686dde9cff3SCaroline Tice     {
687dde9cff3SCaroline Tice         char path[PATH_MAX];
688dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
6891d273166SGreg Clayton         Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
6901d273166SGreg Clayton         const char *exe_name = NULL;
6911d273166SGreg Clayton         if (exe_module)
6921d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
6931d273166SGreg Clayton 
69405faeb71SGreg Clayton         description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
6951d273166SGreg Clayton                             m_opaque_sp->GetID(),
696ceb6b139SCaroline Tice                             lldb_private::StateAsCString (GetState()),
6971d273166SGreg Clayton                             GetNumThreads(),
69805faeb71SGreg Clayton                             exe_name ? ", executable = " : "",
6991d273166SGreg Clayton                             exe_name ? exe_name : "");
700dde9cff3SCaroline Tice     }
701dde9cff3SCaroline Tice     else
702dde9cff3SCaroline Tice         description.Printf ("No value");
703dde9cff3SCaroline Tice 
704dde9cff3SCaroline Tice     return true;
705dde9cff3SCaroline Tice }
706