blob: ce8109fa0905d908e975c1c24ee6e11d0115ef3f [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"
Chris Lattner24943d22010-06-08 16:52:24 +000016#include "lldb/Core/DataBufferHeap.h"
17#include "lldb/Core/DataExtractor.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000018#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/State.h"
21#include "lldb/Core/Stream.h"
22#include "lldb/Core/StreamFile.h"
23#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000025#include "lldb/Target/Target.h"
26#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027
28// Project includes
29
Eli Friedman7a62c8b2010-06-09 07:44:37 +000030#include "lldb/API/SBBroadcaster.h"
31#include "lldb/API/SBDebugger.h"
32#include "lldb/API/SBCommandReturnObject.h"
33#include "lldb/API/SBEvent.h"
34#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000035#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037
38using namespace lldb;
39using namespace lldb_private;
40
41
42
43SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000044 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000045{
46}
47
48
49//----------------------------------------------------------------------
50// SBProcess constructor
51//----------------------------------------------------------------------
52
53SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000054 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000055{
56}
57
58
59SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000060 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000061{
62}
63
Greg Clayton538eb822010-11-05 23:17:00 +000064const SBProcess&
65SBProcess::operator = (const SBProcess& rhs)
66{
67 if (this != &rhs)
68 m_opaque_sp = rhs.m_opaque_sp;
69 return *this;
70}
71
Chris Lattner24943d22010-06-08 16:52:24 +000072//----------------------------------------------------------------------
73// Destructor
74//----------------------------------------------------------------------
75SBProcess::~SBProcess()
76{
77}
78
79void
80SBProcess::SetProcess (const ProcessSP &process_sp)
81{
Greg Clayton63094e02010-06-23 01:19:29 +000082 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
85void
86SBProcess::Clear ()
87{
Greg Clayton63094e02010-06-23 01:19:29 +000088 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91
92bool
93SBProcess::IsValid() const
94{
Greg Clayton63094e02010-06-23 01:19:29 +000095 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000096}
97
James McIlree38093402011-03-04 00:31:13 +000098bool
99SBProcess::RemoteLaunch (char const **argv,
100 char const **envp,
101 const char *stdin_path,
102 const char *stdout_path,
103 const char *stderr_path,
104 const char *working_directory,
105 uint32_t launch_flags,
106 bool stop_at_entry,
107 lldb::SBError& error)
108{
109 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
110 if (log) {
111 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))...",
112 m_opaque_sp.get(),
113 argv,
114 envp,
115 stdin_path ? stdin_path : "NULL",
116 stdout_path ? stdout_path : "NULL",
117 stderr_path ? stderr_path : "NULL",
118 working_directory ? working_directory : "NULL",
119 launch_flags,
120 stop_at_entry,
121 error.get());
122 }
123
124 if (m_opaque_sp)
125 {
126 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
127 if (m_opaque_sp->GetState() == eStateConnected)
128 {
Greg Clayton36bc5ea2011-11-03 21:22:33 +0000129 if (stop_at_entry)
130 launch_flags |= eLaunchFlagStopAtEntry;
131 ProcessLaunchInfo launch_info (stdin_path,
132 stdout_path,
133 stderr_path,
134 working_directory,
135 launch_flags);
136 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer();
137 if (exe_module)
138 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
139 if (argv)
140 launch_info.GetArguments().AppendArguments (argv);
141 if (envp)
142 launch_info.GetEnvironmentEntries ().SetArguments (envp);
143 error.SetError (m_opaque_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000144 }
145 else
146 {
147 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
148 }
149 }
150 else
151 {
152 error.SetErrorString ("unable to attach pid");
153 }
154
155 if (log) {
156 SBStream sstr;
157 error.GetDescription (sstr);
Johnny Chen42da4da2011-03-05 01:20:11 +0000158 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000159 }
160
161 return error.Success();
162}
163
164bool
165SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
166{
167 if (m_opaque_sp)
168 {
169 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
170 if (m_opaque_sp->GetState() == eStateConnected)
171 {
Greg Clayton527154d2011-11-15 03:53:30 +0000172 ProcessAttachInfo attach_info;
173 attach_info.SetProcessID (pid);
174 error.SetError (m_opaque_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000175 }
176 else
177 {
178 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
179 }
180 }
181 else
182 {
183 error.SetErrorString ("unable to attach pid");
184 }
185
186 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
187 if (log) {
188 SBStream sstr;
189 error.GetDescription (sstr);
Greg Claytond9919d32011-12-01 23:28:38 +0000190 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 +0000191 }
192
193 return error.Success();
194}
195
Chris Lattner24943d22010-06-08 16:52:24 +0000196
197uint32_t
198SBProcess::GetNumThreads ()
199{
Greg Claytone005f2c2010-11-06 01:53:30 +0000200 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000201
Caroline Tice7826c882010-10-26 03:11:13 +0000202 uint32_t num_threads = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000203 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000204 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000205 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000206 const bool can_update = true;
Caroline Tice7826c882010-10-26 03:11:13 +0000207 num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000208 }
Caroline Tice7826c882010-10-26 03:11:13 +0000209
210 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000211 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000212
213 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000214}
215
216SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000217SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000218{
Greg Claytone005f2c2010-11-06 01:53:30 +0000219 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000220
Chris Lattner24943d22010-06-08 16:52:24 +0000221 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000222 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000223 {
224 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Jim Inghamc8332952010-08-26 21:32:51 +0000225 sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
Greg Claytonbdcda462010-12-20 20:49:23 +0000226 }
Caroline Tice7826c882010-10-26 03:11:13 +0000227
228 if (log)
229 {
Greg Claytona66ba462010-10-30 04:51:46 +0000230 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.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)
243 sb_target = m_opaque_sp->GetTarget().GetSP();
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
Chris Lattner24943d22010-06-08 16:52:24 +0000383 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000384 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000385 {
386 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000387 thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
Greg Claytonbdcda462010-12-20 20:49:23 +0000388 }
Caroline Tice7826c882010-10-26 03:11:13 +0000389
390 if (log)
391 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000392 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000393 m_opaque_sp.get(), (uint32_t) index, thread.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000394 }
395
Chris Lattner24943d22010-06-08 16:52:24 +0000396 return thread;
397}
398
399StateType
400SBProcess::GetState ()
401{
Caroline Tice7826c882010-10-26 03:11:13 +0000402
Caroline Tice7826c882010-10-26 03:11:13 +0000403 StateType ret_val = eStateInvalid;
Greg Claytonbdcda462010-12-20 20:49:23 +0000404 if (m_opaque_sp)
405 {
406 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000407 ret_val = m_opaque_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000408 }
Caroline Tice7826c882010-10-26 03:11:13 +0000409
Greg Claytone005f2c2010-11-06 01:53:30 +0000410 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000411 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000412 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000413 m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000414 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000415
416 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000417}
418
419
420int
421SBProcess::GetExitStatus ()
422{
Greg Claytona66ba462010-10-30 04:51:46 +0000423 int exit_status = 0;
424 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000425 {
426 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000427 exit_status = m_opaque_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000428 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000429 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000430 if (log)
431 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
432 m_opaque_sp.get(), exit_status, exit_status);
433
434 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000435}
436
437const char *
438SBProcess::GetExitDescription ()
439{
Greg Claytona66ba462010-10-30 04:51:46 +0000440 const char *exit_desc = NULL;
Greg Claytonbdcda462010-12-20 20:49:23 +0000441 if (m_opaque_sp)
442 {
443 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000444 exit_desc = m_opaque_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000445 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000446 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000447 if (log)
448 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
449 m_opaque_sp.get(), exit_desc);
450 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000451}
452
453lldb::pid_t
454SBProcess::GetProcessID ()
455{
Caroline Tice7826c882010-10-26 03:11:13 +0000456 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000457 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000458 ret_val = m_opaque_sp->GetID();
459
Greg Claytone005f2c2010-11-06 01:53:30 +0000460 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000461 if (log)
Greg Claytond9919d32011-12-01 23:28:38 +0000462 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", m_opaque_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000463
464 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000465}
466
Johnny Chen60a544f2011-03-01 22:56:31 +0000467ByteOrder
468SBProcess::GetByteOrder () const
469{
470 ByteOrder byteOrder = eByteOrderInvalid;
471 if (m_opaque_sp)
472 byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder();
473
474 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
475 if (log)
476 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder);
477
478 return byteOrder;
479}
480
Chris Lattner24943d22010-06-08 16:52:24 +0000481uint32_t
482SBProcess::GetAddressByteSize () const
483{
Caroline Tice7826c882010-10-26 03:11:13 +0000484 uint32_t size = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000485 if (m_opaque_sp)
Greg Clayton395fc332011-02-15 21:59:32 +0000486 size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000487
Greg Claytone005f2c2010-11-06 01:53:30 +0000488 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000489 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000490 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000491
492 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000493}
494
Chris Lattner24943d22010-06-08 16:52:24 +0000495SBError
496SBProcess::Continue ()
497{
Greg Claytone005f2c2010-11-06 01:53:30 +0000498 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000499 if (log)
500 log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000501
Chris Lattner24943d22010-06-08 16:52:24 +0000502 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000503 if (m_opaque_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000504 {
Greg Claytonde1dd812011-06-24 03:21:43 +0000505 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
506
Greg Clayton1a3083a2010-10-06 03:53:16 +0000507 Error error (m_opaque_sp->Resume());
508 if (error.Success())
509 {
510 if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000511 {
512 if (log)
513 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000514 m_opaque_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000515 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000516 }
517 sb_error.SetError(error);
518 }
Chris Lattner24943d22010-06-08 16:52:24 +0000519 else
520 sb_error.SetErrorString ("SBProcess is invalid");
521
Caroline Tice7826c882010-10-26 03:11:13 +0000522 if (log)
523 {
524 SBStream sstr;
525 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000526 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000527 }
528
Chris Lattner24943d22010-06-08 16:52:24 +0000529 return sb_error;
530}
531
532
533SBError
534SBProcess::Destroy ()
535{
536 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000537 if (m_opaque_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000538 {
539 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000540 sb_error.SetError(m_opaque_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000541 }
Chris Lattner24943d22010-06-08 16:52:24 +0000542 else
543 sb_error.SetErrorString ("SBProcess is invalid");
544
Greg Claytone005f2c2010-11-06 01:53:30 +0000545 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000546 if (log)
547 {
548 SBStream sstr;
549 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000550 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
551 m_opaque_sp.get(),
552 sb_error.get(),
553 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000554 }
555
Chris Lattner24943d22010-06-08 16:52:24 +0000556 return sb_error;
557}
558
559
560SBError
561SBProcess::Stop ()
562{
563 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000564 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000565 {
566 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000567 sb_error.SetError (m_opaque_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000568 }
Chris Lattner24943d22010-06-08 16:52:24 +0000569 else
570 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000571
Greg Claytone005f2c2010-11-06 01:53:30 +0000572 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000573 if (log)
574 {
575 SBStream sstr;
576 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000577 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
578 m_opaque_sp.get(),
579 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000580 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000581 }
582
Chris Lattner24943d22010-06-08 16:52:24 +0000583 return sb_error;
584}
585
586SBError
587SBProcess::Kill ()
588{
589 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000590 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000591 {
592 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000593 sb_error.SetError (m_opaque_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000594 }
Chris Lattner24943d22010-06-08 16:52:24 +0000595 else
596 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000597
Greg Claytone005f2c2010-11-06 01:53:30 +0000598 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000599 if (log)
600 {
601 SBStream sstr;
602 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000603 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
604 m_opaque_sp.get(),
605 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000606 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000607 }
608
Chris Lattner24943d22010-06-08 16:52:24 +0000609 return sb_error;
610}
611
Chris Lattner24943d22010-06-08 16:52:24 +0000612SBError
613SBProcess::Detach ()
614{
615 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000616 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000617 {
618 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000619 sb_error.SetError (m_opaque_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000620 }
Chris Lattner24943d22010-06-08 16:52:24 +0000621 else
622 sb_error.SetErrorString ("SBProcess is invalid");
623
624 return sb_error;
625}
626
627SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000628SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000629{
630 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000631 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000632 {
633 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000634 sb_error.SetError (m_opaque_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000635 }
Chris Lattner24943d22010-06-08 16:52:24 +0000636 else
637 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000638 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000639 if (log)
640 {
641 SBStream sstr;
642 sb_error.GetDescription (sstr);
643 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
644 m_opaque_sp.get(),
645 signo,
646 sb_error.get(),
647 sstr.GetData());
648 }
Chris Lattner24943d22010-06-08 16:52:24 +0000649 return sb_error;
650}
651
Chris Lattner24943d22010-06-08 16:52:24 +0000652SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000653SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000654{
Greg Claytona66ba462010-10-30 04:51:46 +0000655 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000656 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000657 {
658 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000659 sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000660 }
Greg Claytona66ba462010-10-30 04:51:46 +0000661
Greg Claytone005f2c2010-11-06 01:53:30 +0000662 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000663 if (log)
664 {
Greg Claytond9919d32011-12-01 23:28:38 +0000665 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000666 m_opaque_sp.get(),
667 tid,
668 sb_thread.get());
669 }
670
671 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000672}
673
Chris Lattner24943d22010-06-08 16:52:24 +0000674StateType
675SBProcess::GetStateFromEvent (const SBEvent &event)
676{
Greg Claytone005f2c2010-11-06 01:53:30 +0000677 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000678
Caroline Tice7826c882010-10-26 03:11:13 +0000679 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
680
681 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000682 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000683 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000684
685 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000686}
687
Chris Lattner24943d22010-06-08 16:52:24 +0000688bool
689SBProcess::GetRestartedFromEvent (const SBEvent &event)
690{
Greg Clayton63094e02010-06-23 01:19:29 +0000691 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000692}
693
694SBProcess
695SBProcess::GetProcessFromEvent (const SBEvent &event)
696{
Greg Clayton63094e02010-06-23 01:19:29 +0000697 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000698 return process;
699}
700
701
702SBBroadcaster
703SBProcess::GetBroadcaster () const
704{
Greg Claytone005f2c2010-11-06 01:53:30 +0000705 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000706
Greg Clayton63094e02010-06-23 01:19:29 +0000707 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000708
709 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000710 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000711 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000712
Chris Lattner24943d22010-06-08 16:52:24 +0000713 return broadcaster;
714}
715
716lldb_private::Process *
717SBProcess::operator->() const
718{
Greg Clayton63094e02010-06-23 01:19:29 +0000719 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000720}
721
722size_t
723SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
724{
Greg Claytone005f2c2010-11-06 01:53:30 +0000725 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000726
Chris Lattner24943d22010-06-08 16:52:24 +0000727 size_t bytes_read = 0;
728
Greg Claytona66ba462010-10-30 04:51:46 +0000729 if (log)
730 {
731 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
732 m_opaque_sp.get(),
733 addr,
734 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000735 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000736 sb_error.get());
737 }
738
Greg Claytonbdcda462010-12-20 20:49:23 +0000739 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000740 {
741 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000742 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000743 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000744 sb_error.SetError (error);
745 }
746 else
747 {
748 sb_error.SetErrorString ("SBProcess is invalid");
749 }
750
Caroline Tice7826c882010-10-26 03:11:13 +0000751 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000752 {
753 SBStream sstr;
754 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000755 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000756 m_opaque_sp.get(),
757 addr,
758 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000759 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000760 sb_error.get(),
761 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000762 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000763 }
Caroline Tice7826c882010-10-26 03:11:13 +0000764
Chris Lattner24943d22010-06-08 16:52:24 +0000765 return bytes_read;
766}
767
768size_t
769SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
770{
771 size_t bytes_written = 0;
772
Greg Claytone005f2c2010-11-06 01:53:30 +0000773 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000774 if (log)
775 {
776 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
777 m_opaque_sp.get(),
778 addr,
779 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000780 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000781 sb_error.get());
782 }
783
Greg Claytonbdcda462010-12-20 20:49:23 +0000784 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000785 {
786 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000787 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000788 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000789 sb_error.SetError (error);
790 }
791
Greg Claytona66ba462010-10-30 04:51:46 +0000792 if (log)
793 {
794 SBStream sstr;
795 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000796 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Claytona66ba462010-10-30 04:51:46 +0000797 m_opaque_sp.get(),
798 addr,
799 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000800 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000801 sb_error.get(),
802 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000803 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +0000804 }
805
Chris Lattner24943d22010-06-08 16:52:24 +0000806 return bytes_written;
807}
808
809// Mimic shared pointer...
810lldb_private::Process *
811SBProcess::get() const
812{
Greg Clayton63094e02010-06-23 01:19:29 +0000813 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000814}
815
Caroline Tice98f930f2010-09-20 05:20:02 +0000816bool
817SBProcess::GetDescription (SBStream &description)
818{
Greg Clayton96154be2011-11-13 06:57:31 +0000819 Stream &strm = description.ref();
820
Caroline Tice98f930f2010-09-20 05:20:02 +0000821 if (m_opaque_sp)
822 {
823 char path[PATH_MAX];
824 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton5beb99d2011-08-11 02:48:45 +0000825 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +0000826 const char *exe_name = NULL;
827 if (exe_module)
828 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
829
Greg Clayton96154be2011-11-13 06:57:31 +0000830 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
831 m_opaque_sp->GetID(),
832 lldb_private::StateAsCString (GetState()),
833 GetNumThreads(),
834 exe_name ? ", executable = " : "",
835 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000836 }
837 else
Greg Clayton96154be2011-11-13 06:57:31 +0000838 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000839
840 return true;
841}
Greg Clayton0baa3942010-11-04 01:54:29 +0000842
843uint32_t
844SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
845{
846 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000847 {
848 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0e0fd1c2010-12-05 20:38:01 +0000849 return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref());
Greg Claytonbdcda462010-12-20 20:49:23 +0000850 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000851 return LLDB_INVALID_IMAGE_TOKEN;
852}
853
854lldb::SBError
855SBProcess::UnloadImage (uint32_t image_token)
856{
857 lldb::SBError sb_error;
858 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000859 {
860 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0baa3942010-11-04 01:54:29 +0000861 sb_error.SetError (m_opaque_sp->UnloadImage (image_token));
Greg Claytonbdcda462010-12-20 20:49:23 +0000862 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000863 else
864 sb_error.SetErrorString("invalid process");
865 return sb_error;
866}
867
868