blob: 91731bcd3b79426d01309360cf4d2e9a80c9988f [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-defines.h"
13#include "lldb/lldb-types.h"
14
Jim Ingham84cdc152010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000016#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000017#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Core/State.h"
19#include "lldb/Core/Stream.h"
20#include "lldb/Core/StreamFile.h"
21#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000023#include "lldb/Target/Target.h"
24#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025
26// Project includes
27
Eli Friedman7a62c8b2010-06-09 07:44:37 +000028#include "lldb/API/SBBroadcaster.h"
29#include "lldb/API/SBDebugger.h"
30#include "lldb/API/SBCommandReturnObject.h"
31#include "lldb/API/SBEvent.h"
32#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000033#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000034#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000035
36using namespace lldb;
37using namespace lldb_private;
38
39
40
41SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000042 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000043{
44}
45
46
47//----------------------------------------------------------------------
48// SBProcess constructor
49//----------------------------------------------------------------------
50
51SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000052 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000053{
54}
55
56
57SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000058 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60}
61
Greg Clayton538eb822010-11-05 23:17:00 +000062const SBProcess&
63SBProcess::operator = (const SBProcess& rhs)
64{
65 if (this != &rhs)
66 m_opaque_sp = rhs.m_opaque_sp;
67 return *this;
68}
69
Chris Lattner24943d22010-06-08 16:52:24 +000070//----------------------------------------------------------------------
71// Destructor
72//----------------------------------------------------------------------
73SBProcess::~SBProcess()
74{
75}
76
77void
78SBProcess::SetProcess (const ProcessSP &process_sp)
79{
Greg Clayton63094e02010-06-23 01:19:29 +000080 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000081}
82
83void
84SBProcess::Clear ()
85{
Greg Clayton63094e02010-06-23 01:19:29 +000086 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000087}
88
89
90bool
91SBProcess::IsValid() const
92{
Greg Clayton63094e02010-06-23 01:19:29 +000093 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000094}
95
James McIlree38093402011-03-04 00:31:13 +000096bool
97SBProcess::RemoteLaunch (char const **argv,
98 char const **envp,
99 const char *stdin_path,
100 const char *stdout_path,
101 const char *stderr_path,
102 const char *working_directory,
103 uint32_t launch_flags,
104 bool stop_at_entry,
105 lldb::SBError& error)
106{
107 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
108 if (log) {
109 log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...",
110 m_opaque_sp.get(),
111 argv,
112 envp,
113 stdin_path ? stdin_path : "NULL",
114 stdout_path ? stdout_path : "NULL",
115 stderr_path ? stderr_path : "NULL",
116 working_directory ? working_directory : "NULL",
117 launch_flags,
118 stop_at_entry,
119 error.get());
120 }
121
122 if (m_opaque_sp)
123 {
124 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
125 if (m_opaque_sp->GetState() == eStateConnected)
126 {
Greg Clayton36bc5ea2011-11-03 21:22:33 +0000127 if (stop_at_entry)
128 launch_flags |= eLaunchFlagStopAtEntry;
129 ProcessLaunchInfo launch_info (stdin_path,
130 stdout_path,
131 stderr_path,
132 working_directory,
133 launch_flags);
134 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer();
135 if (exe_module)
136 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
137 if (argv)
138 launch_info.GetArguments().AppendArguments (argv);
139 if (envp)
140 launch_info.GetEnvironmentEntries ().SetArguments (envp);
141 error.SetError (m_opaque_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000142 }
143 else
144 {
145 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
146 }
147 }
148 else
149 {
150 error.SetErrorString ("unable to attach pid");
151 }
152
153 if (log) {
154 SBStream sstr;
155 error.GetDescription (sstr);
Johnny Chen42da4da2011-03-05 01:20:11 +0000156 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000157 }
158
159 return error.Success();
160}
161
162bool
163SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
164{
165 if (m_opaque_sp)
166 {
167 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
168 if (m_opaque_sp->GetState() == eStateConnected)
169 {
Greg Clayton527154d2011-11-15 03:53:30 +0000170 ProcessAttachInfo attach_info;
171 attach_info.SetProcessID (pid);
172 error.SetError (m_opaque_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000173 }
174 else
175 {
176 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
177 }
178 }
179 else
180 {
181 error.SetErrorString ("unable to attach pid");
182 }
183
184 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
185 if (log) {
186 SBStream sstr;
187 error.GetDescription (sstr);
Greg Claytond9919d32011-12-01 23:28:38 +0000188 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000189 }
190
191 return error.Success();
192}
193
Chris Lattner24943d22010-06-08 16:52:24 +0000194
195uint32_t
196SBProcess::GetNumThreads ()
197{
Greg Claytone005f2c2010-11-06 01:53:30 +0000198 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000199
Caroline Tice7826c882010-10-26 03:11:13 +0000200 uint32_t num_threads = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000201 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000202 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000203 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000204 const bool can_update = true;
Caroline Tice7826c882010-10-26 03:11:13 +0000205 num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000206 }
Caroline Tice7826c882010-10-26 03:11:13 +0000207
208 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000209 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000210
211 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000212}
213
214SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000215SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000216{
Greg Claytone005f2c2010-11-06 01:53:30 +0000217 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000218
Chris Lattner24943d22010-06-08 16:52:24 +0000219 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000220 ThreadSP thread_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000221 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000222 {
223 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton90c52142012-01-30 02:53:15 +0000224 thread_sp = m_opaque_sp->GetThreadList().GetSelectedThread();
225 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000226 }
Caroline Tice7826c882010-10-26 03:11:13 +0000227
228 if (log)
229 {
Greg Clayton90c52142012-01-30 02:53:15 +0000230 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000231 }
232
Chris Lattner24943d22010-06-08 16:52:24 +0000233 return sb_thread;
234}
235
236SBTarget
237SBProcess::GetTarget() const
238{
Greg Claytone005f2c2010-11-06 01:53:30 +0000239 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000240
Chris Lattner24943d22010-06-08 16:52:24 +0000241 SBTarget sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000242 if (m_opaque_sp)
Greg Clayton13d24fb2012-01-29 20:56:30 +0000243 sb_target = m_opaque_sp->GetTarget().shared_from_this();
Caroline Tice7826c882010-10-26 03:11:13 +0000244
245 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000246 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000247
Chris Lattner24943d22010-06-08 16:52:24 +0000248 return sb_target;
249}
250
251
252size_t
253SBProcess::PutSTDIN (const char *src, size_t src_len)
254{
Greg Claytone005f2c2010-11-06 01:53:30 +0000255 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000256
Caroline Tice7826c882010-10-26 03:11:13 +0000257 size_t ret_val = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000258 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000259 {
260 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000261 ret_val = m_opaque_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000262 }
Caroline Tice7826c882010-10-26 03:11:13 +0000263
264 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000265 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000266 m_opaque_sp.get(),
267 src,
268 (uint32_t) src_len,
269 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000270
271 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000272}
273
274size_t
275SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
276{
Greg Clayton49ce6822010-10-31 03:01:06 +0000277 size_t bytes_read = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000278 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000279 {
280 Error error;
Greg Clayton49ce6822010-10-31 03:01:06 +0000281 bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000282 }
Caroline Tice7826c882010-10-26 03:11:13 +0000283
Greg Claytone005f2c2010-11-06 01:53:30 +0000284 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000285 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000286 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
287 m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000288
Greg Clayton49ce6822010-10-31 03:01:06 +0000289 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000290}
291
292size_t
293SBProcess::GetSTDERR (char *dst, size_t dst_len) const
294{
Greg Clayton49ce6822010-10-31 03:01:06 +0000295 size_t bytes_read = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000296 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000297 {
298 Error error;
Greg Clayton49ce6822010-10-31 03:01:06 +0000299 bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000300 }
Caroline Tice7826c882010-10-26 03:11:13 +0000301
Greg Claytone005f2c2010-11-06 01:53:30 +0000302 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000303 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000304 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
305 m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000306
Greg Clayton49ce6822010-10-31 03:01:06 +0000307 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000308}
309
310void
Jim Inghamc8332952010-08-26 21:32:51 +0000311SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000312{
313 if (out == NULL)
314 return;
315
Greg Claytonbdcda462010-12-20 20:49:23 +0000316 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000317 {
318 const StateType event_state = SBProcess::GetStateFromEvent (event);
319 char message[1024];
320 int message_len = ::snprintf (message,
321 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000322 "Process %llu %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000323 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000324 SBDebugger::StateAsCString (event_state));
325
326 if (message_len > 0)
327 ::fwrite (message, 1, message_len, out);
328 }
329}
330
331void
Jim Inghamc8332952010-08-26 21:32:51 +0000332SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000333{
Greg Claytonbdcda462010-12-20 20:49:23 +0000334 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000335 {
336 const StateType event_state = SBProcess::GetStateFromEvent (event);
337 char message[1024];
338 ::snprintf (message,
339 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000340 "Process %llu %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000341 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000342 SBDebugger::StateAsCString (event_state));
343
344 result.AppendMessage (message);
345 }
346}
347
348bool
Jim Inghamc8332952010-08-26 21:32:51 +0000349SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000350{
Greg Claytonbdcda462010-12-20 20:49:23 +0000351 if (m_opaque_sp)
352 {
353 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Jim Inghamc8332952010-08-26 21:32:51 +0000354 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000355 }
Chris Lattner24943d22010-06-08 16:52:24 +0000356 return false;
357}
358
359bool
Jim Inghamc8332952010-08-26 21:32:51 +0000360SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000361{
Greg Claytone005f2c2010-11-06 01:53:30 +0000362 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000363
Caroline Tice7826c882010-10-26 03:11:13 +0000364 bool ret_val = false;
Greg Claytonbdcda462010-12-20 20:49:23 +0000365 if (m_opaque_sp)
366 {
367 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000368 ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000369 }
Caroline Tice7826c882010-10-26 03:11:13 +0000370
371 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000372 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000373 m_opaque_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000374
375 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000376}
377
378SBThread
379SBProcess::GetThreadAtIndex (size_t index)
380{
Greg Claytone005f2c2010-11-06 01:53:30 +0000381 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000382
Greg Clayton90c52142012-01-30 02:53:15 +0000383 SBThread sb_thread;
384 ThreadSP thread_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000385 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000386 {
387 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton90c52142012-01-30 02:53:15 +0000388 thread_sp = m_opaque_sp->GetThreadList().GetThreadAtIndex(index);
389 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000390 }
Caroline Tice7826c882010-10-26 03:11:13 +0000391
392 if (log)
393 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000394 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton90c52142012-01-30 02:53:15 +0000395 m_opaque_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000396 }
397
Greg Clayton90c52142012-01-30 02:53:15 +0000398 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000399}
400
401StateType
402SBProcess::GetState ()
403{
Caroline Tice7826c882010-10-26 03:11:13 +0000404
Caroline Tice7826c882010-10-26 03:11:13 +0000405 StateType ret_val = eStateInvalid;
Greg Claytonbdcda462010-12-20 20:49:23 +0000406 if (m_opaque_sp)
407 {
408 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000409 ret_val = m_opaque_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000410 }
Caroline Tice7826c882010-10-26 03:11:13 +0000411
Greg Claytone005f2c2010-11-06 01:53:30 +0000412 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000413 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000414 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000415 m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000416 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000417
418 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000419}
420
421
422int
423SBProcess::GetExitStatus ()
424{
Greg Claytona66ba462010-10-30 04:51:46 +0000425 int exit_status = 0;
426 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000427 {
428 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000429 exit_status = m_opaque_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000430 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000431 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000432 if (log)
433 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
434 m_opaque_sp.get(), exit_status, exit_status);
435
436 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000437}
438
439const char *
440SBProcess::GetExitDescription ()
441{
Greg Claytona66ba462010-10-30 04:51:46 +0000442 const char *exit_desc = NULL;
Greg Claytonbdcda462010-12-20 20:49:23 +0000443 if (m_opaque_sp)
444 {
445 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000446 exit_desc = m_opaque_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000447 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000448 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000449 if (log)
450 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
451 m_opaque_sp.get(), exit_desc);
452 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000453}
454
455lldb::pid_t
456SBProcess::GetProcessID ()
457{
Caroline Tice7826c882010-10-26 03:11:13 +0000458 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000459 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000460 ret_val = m_opaque_sp->GetID();
461
Greg Claytone005f2c2010-11-06 01:53:30 +0000462 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000463 if (log)
Greg Claytond9919d32011-12-01 23:28:38 +0000464 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", m_opaque_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000465
466 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000467}
468
Johnny Chen60a544f2011-03-01 22:56:31 +0000469ByteOrder
470SBProcess::GetByteOrder () const
471{
472 ByteOrder byteOrder = eByteOrderInvalid;
473 if (m_opaque_sp)
474 byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder();
475
476 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
477 if (log)
478 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder);
479
480 return byteOrder;
481}
482
Chris Lattner24943d22010-06-08 16:52:24 +0000483uint32_t
484SBProcess::GetAddressByteSize () const
485{
Caroline Tice7826c882010-10-26 03:11:13 +0000486 uint32_t size = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000487 if (m_opaque_sp)
Greg Clayton395fc332011-02-15 21:59:32 +0000488 size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000489
Greg Claytone005f2c2010-11-06 01:53:30 +0000490 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000491 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000492 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000493
494 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000495}
496
Chris Lattner24943d22010-06-08 16:52:24 +0000497SBError
498SBProcess::Continue ()
499{
Greg Claytone005f2c2010-11-06 01:53:30 +0000500 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000501 if (log)
502 log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000503
Chris Lattner24943d22010-06-08 16:52:24 +0000504 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000505 if (m_opaque_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000506 {
Greg Claytonde1dd812011-06-24 03:21:43 +0000507 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
508
Greg Clayton1a3083a2010-10-06 03:53:16 +0000509 Error error (m_opaque_sp->Resume());
510 if (error.Success())
511 {
512 if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000513 {
514 if (log)
515 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000516 m_opaque_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000517 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000518 }
519 sb_error.SetError(error);
520 }
Chris Lattner24943d22010-06-08 16:52:24 +0000521 else
522 sb_error.SetErrorString ("SBProcess is invalid");
523
Caroline Tice7826c882010-10-26 03:11:13 +0000524 if (log)
525 {
526 SBStream sstr;
527 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000528 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000529 }
530
Chris Lattner24943d22010-06-08 16:52:24 +0000531 return sb_error;
532}
533
534
535SBError
536SBProcess::Destroy ()
537{
538 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000539 if (m_opaque_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000540 {
541 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000542 sb_error.SetError(m_opaque_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000543 }
Chris Lattner24943d22010-06-08 16:52:24 +0000544 else
545 sb_error.SetErrorString ("SBProcess is invalid");
546
Greg Claytone005f2c2010-11-06 01:53:30 +0000547 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000548 if (log)
549 {
550 SBStream sstr;
551 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000552 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
553 m_opaque_sp.get(),
554 sb_error.get(),
555 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000556 }
557
Chris Lattner24943d22010-06-08 16:52:24 +0000558 return sb_error;
559}
560
561
562SBError
563SBProcess::Stop ()
564{
565 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000566 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000567 {
568 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000569 sb_error.SetError (m_opaque_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000570 }
Chris Lattner24943d22010-06-08 16:52:24 +0000571 else
572 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000573
Greg Claytone005f2c2010-11-06 01:53:30 +0000574 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000575 if (log)
576 {
577 SBStream sstr;
578 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000579 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
580 m_opaque_sp.get(),
581 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000582 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000583 }
584
Chris Lattner24943d22010-06-08 16:52:24 +0000585 return sb_error;
586}
587
588SBError
589SBProcess::Kill ()
590{
591 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000592 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000593 {
594 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000595 sb_error.SetError (m_opaque_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000596 }
Chris Lattner24943d22010-06-08 16:52:24 +0000597 else
598 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000599
Greg Claytone005f2c2010-11-06 01:53:30 +0000600 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000601 if (log)
602 {
603 SBStream sstr;
604 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000605 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
606 m_opaque_sp.get(),
607 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000608 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000609 }
610
Chris Lattner24943d22010-06-08 16:52:24 +0000611 return sb_error;
612}
613
Chris Lattner24943d22010-06-08 16:52:24 +0000614SBError
615SBProcess::Detach ()
616{
617 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000618 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000619 {
620 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000621 sb_error.SetError (m_opaque_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000622 }
Chris Lattner24943d22010-06-08 16:52:24 +0000623 else
624 sb_error.SetErrorString ("SBProcess is invalid");
625
626 return sb_error;
627}
628
629SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000630SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000631{
632 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000633 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000634 {
635 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000636 sb_error.SetError (m_opaque_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000637 }
Chris Lattner24943d22010-06-08 16:52:24 +0000638 else
639 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000640 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000641 if (log)
642 {
643 SBStream sstr;
644 sb_error.GetDescription (sstr);
645 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
646 m_opaque_sp.get(),
647 signo,
648 sb_error.get(),
649 sstr.GetData());
650 }
Chris Lattner24943d22010-06-08 16:52:24 +0000651 return sb_error;
652}
653
Chris Lattner24943d22010-06-08 16:52:24 +0000654SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000655SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000656{
Greg Claytona66ba462010-10-30 04:51:46 +0000657 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000658 ThreadSP thread_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000659 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000660 {
661 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton90c52142012-01-30 02:53:15 +0000662 thread_sp = m_opaque_sp->GetThreadList().FindThreadByID (tid);
663 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000664 }
Greg Claytona66ba462010-10-30 04:51:46 +0000665
Greg Claytone005f2c2010-11-06 01:53:30 +0000666 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000667 if (log)
668 {
Greg Claytond9919d32011-12-01 23:28:38 +0000669 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000670 m_opaque_sp.get(),
671 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000672 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000673 }
674
675 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000676}
677
Chris Lattner24943d22010-06-08 16:52:24 +0000678StateType
679SBProcess::GetStateFromEvent (const SBEvent &event)
680{
Greg Claytone005f2c2010-11-06 01:53:30 +0000681 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000682
Caroline Tice7826c882010-10-26 03:11:13 +0000683 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
684
685 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000686 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000687 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000688
689 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000690}
691
Chris Lattner24943d22010-06-08 16:52:24 +0000692bool
693SBProcess::GetRestartedFromEvent (const SBEvent &event)
694{
Greg Clayton63094e02010-06-23 01:19:29 +0000695 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000696}
697
698SBProcess
699SBProcess::GetProcessFromEvent (const SBEvent &event)
700{
Greg Clayton63094e02010-06-23 01:19:29 +0000701 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000702 return process;
703}
704
705
706SBBroadcaster
707SBProcess::GetBroadcaster () const
708{
Greg Claytone005f2c2010-11-06 01:53:30 +0000709 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000710
Greg Clayton63094e02010-06-23 01:19:29 +0000711 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000712
713 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000714 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000715 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000716
Chris Lattner24943d22010-06-08 16:52:24 +0000717 return broadcaster;
718}
719
720lldb_private::Process *
721SBProcess::operator->() const
722{
Greg Clayton63094e02010-06-23 01:19:29 +0000723 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000724}
725
726size_t
727SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
728{
Greg Claytone005f2c2010-11-06 01:53:30 +0000729 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000730
Chris Lattner24943d22010-06-08 16:52:24 +0000731 size_t bytes_read = 0;
732
Greg Claytona66ba462010-10-30 04:51:46 +0000733 if (log)
734 {
735 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
736 m_opaque_sp.get(),
737 addr,
738 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000739 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000740 sb_error.get());
741 }
742
Greg Claytonbdcda462010-12-20 20:49:23 +0000743 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000744 {
745 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000746 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000747 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000748 sb_error.SetError (error);
749 }
750 else
751 {
752 sb_error.SetErrorString ("SBProcess is invalid");
753 }
754
Caroline Tice7826c882010-10-26 03:11:13 +0000755 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000756 {
757 SBStream sstr;
758 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000759 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000760 m_opaque_sp.get(),
761 addr,
762 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000763 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000764 sb_error.get(),
765 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000766 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000767 }
Caroline Tice7826c882010-10-26 03:11:13 +0000768
Chris Lattner24943d22010-06-08 16:52:24 +0000769 return bytes_read;
770}
771
772size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000773SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
774{
775 size_t bytes_read = 0;
776 if (m_opaque_sp)
777 {
778 Error error;
779 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
780 bytes_read = m_opaque_sp->ReadCStringFromMemory (addr, (char *)buf, size, error);
781 sb_error.SetError (error);
782 }
783 else
784 {
785 sb_error.SetErrorString ("SBProcess is invalid");
786 }
787 return bytes_read;
788}
789
790uint64_t
791SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
792{
793 if (m_opaque_sp)
794 {
795 Error error;
796 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
797 uint64_t value = m_opaque_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error);
798 sb_error.SetError (error);
799 return value;
800 }
801 else
802 {
803 sb_error.SetErrorString ("SBProcess is invalid");
804 }
805 return 0;
806}
807
808lldb::addr_t
809SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
810{
811 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
812 if (m_opaque_sp)
813 {
814 Error error;
815 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
816 ptr = m_opaque_sp->ReadPointerFromMemory (addr, error);
817 sb_error.SetError (error);
818 }
819 else
820 {
821 sb_error.SetErrorString ("SBProcess is invalid");
822 }
823 return ptr;
824}
825
826size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000827SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
828{
829 size_t bytes_written = 0;
830
Greg Claytone005f2c2010-11-06 01:53:30 +0000831 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000832 if (log)
833 {
834 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
835 m_opaque_sp.get(),
836 addr,
837 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000838 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000839 sb_error.get());
840 }
841
Greg Claytonbdcda462010-12-20 20:49:23 +0000842 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000843 {
844 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000845 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000846 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000847 sb_error.SetError (error);
848 }
849
Greg Claytona66ba462010-10-30 04:51:46 +0000850 if (log)
851 {
852 SBStream sstr;
853 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000854 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Claytona66ba462010-10-30 04:51:46 +0000855 m_opaque_sp.get(),
856 addr,
857 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000858 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000859 sb_error.get(),
860 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000861 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +0000862 }
863
Chris Lattner24943d22010-06-08 16:52:24 +0000864 return bytes_written;
865}
866
867// Mimic shared pointer...
868lldb_private::Process *
869SBProcess::get() const
870{
Greg Clayton63094e02010-06-23 01:19:29 +0000871 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000872}
873
Caroline Tice98f930f2010-09-20 05:20:02 +0000874bool
875SBProcess::GetDescription (SBStream &description)
876{
Greg Clayton96154be2011-11-13 06:57:31 +0000877 Stream &strm = description.ref();
878
Caroline Tice98f930f2010-09-20 05:20:02 +0000879 if (m_opaque_sp)
880 {
881 char path[PATH_MAX];
882 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton5beb99d2011-08-11 02:48:45 +0000883 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +0000884 const char *exe_name = NULL;
885 if (exe_module)
886 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
887
Greg Clayton96154be2011-11-13 06:57:31 +0000888 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
889 m_opaque_sp->GetID(),
890 lldb_private::StateAsCString (GetState()),
891 GetNumThreads(),
892 exe_name ? ", executable = " : "",
893 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000894 }
895 else
Greg Clayton96154be2011-11-13 06:57:31 +0000896 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000897
898 return true;
899}
Greg Clayton0baa3942010-11-04 01:54:29 +0000900
901uint32_t
902SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
903{
904 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000905 {
906 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0e0fd1c2010-12-05 20:38:01 +0000907 return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref());
Greg Claytonbdcda462010-12-20 20:49:23 +0000908 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000909 return LLDB_INVALID_IMAGE_TOKEN;
910}
911
912lldb::SBError
913SBProcess::UnloadImage (uint32_t image_token)
914{
915 lldb::SBError sb_error;
916 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000917 {
918 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0baa3942010-11-04 01:54:29 +0000919 sb_error.SetError (m_opaque_sp->UnloadImage (image_token));
Greg Claytonbdcda462010-12-20 20:49:23 +0000920 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000921 else
922 sb_error.SetErrorString("invalid process");
923 return sb_error;
924}