blob: 8f6f1f1318312f5b5d03f2bd84b348c2254c0a11 [file] [log] [blame]
Chris Lattner30fdc8d2010-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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman4c5de692010-06-09 07:44:37 +000012#include "lldb/API/SBProcess.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Virgile Bellobdae3782013-08-28 12:14:27 +000014// C Includes
15#include <inttypes.h>
16
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/lldb-defines.h"
18#include "lldb/lldb-types.h"
19
Jim Ingham40af72e2010-06-15 19:49:27 +000020#include "lldb/Interpreter/Args.h"
Greg Clayton5d5028b2010-10-06 03:53:16 +000021#include "lldb/Core/Debugger.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000022#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000023#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Core/State.h"
25#include "lldb/Core/Stream.h"
26#include "lldb/Core/StreamFile.h"
27#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Target/RegisterContext.h"
Greg Clayton66111032010-06-23 01:19:29 +000029#include "lldb/Target/Target.h"
30#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
32// Project includes
33
Eli Friedman4c5de692010-06-09 07:44:37 +000034#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000035#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000036#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000037#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000038#include "lldb/API/SBFileSpec.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000039#include "lldb/API/SBThread.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000040#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000041#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042
43using namespace lldb;
44using namespace lldb_private;
45
46
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000048 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049{
50}
51
52
53//----------------------------------------------------------------------
54// SBProcess constructor
55//----------------------------------------------------------------------
56
57SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000058 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059{
60}
61
62
63SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000064 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065{
66}
67
Greg Claytonefabb122010-11-05 23:17:00 +000068const SBProcess&
69SBProcess::operator = (const SBProcess& rhs)
70{
71 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000072 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000073 return *this;
74}
75
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076//----------------------------------------------------------------------
77// Destructor
78//----------------------------------------------------------------------
79SBProcess::~SBProcess()
80{
81}
82
Jim Ingham4bddaeb2012-02-16 06:50:00 +000083const char *
84SBProcess::GetBroadcasterClassName ()
85{
86 return Process::GetStaticBroadcasterClass().AsCString();
87}
88
Jim Inghamd7b30ef2012-10-26 19:18:04 +000089const char *
90SBProcess::GetPluginName ()
91{
92 ProcessSP process_sp(GetSP());
93 if (process_sp)
94 {
Greg Clayton57abc5d2013-05-10 21:47:16 +000095 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +000096 }
97 return "<Unknown>";
98}
99
100const char *
101SBProcess::GetShortPluginName ()
102{
103 ProcessSP process_sp(GetSP());
104 if (process_sp)
105 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000106 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000107 }
108 return "<Unknown>";
109}
110
111
Greg Claytonb9556ac2012-01-30 07:41:31 +0000112lldb::ProcessSP
113SBProcess::GetSP() const
114{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000115 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000116}
117
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000118void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000119SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000121 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122}
123
124void
125SBProcess::Clear ()
126{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000127 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128}
129
130
131bool
132SBProcess::IsValid() const
133{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000134 ProcessSP process_sp(m_opaque_wp.lock());
135 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136}
137
James McIlree9631aae2011-03-04 00:31:13 +0000138bool
139SBProcess::RemoteLaunch (char const **argv,
140 char const **envp,
141 const char *stdin_path,
142 const char *stdout_path,
143 const char *stderr_path,
144 const char *working_directory,
145 uint32_t launch_flags,
146 bool stop_at_entry,
147 lldb::SBError& error)
148{
Greg Clayton5160ce52013-03-27 23:08:40 +0000149 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000150 if (log) {
151 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))...",
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000152 m_opaque_wp.lock().get(),
James McIlree9631aae2011-03-04 00:31:13 +0000153 argv,
154 envp,
155 stdin_path ? stdin_path : "NULL",
156 stdout_path ? stdout_path : "NULL",
157 stderr_path ? stderr_path : "NULL",
158 working_directory ? working_directory : "NULL",
159 launch_flags,
160 stop_at_entry,
161 error.get());
162 }
163
Greg Claytonacdbe812012-01-30 09:04:36 +0000164 ProcessSP process_sp(GetSP());
165 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000166 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000167 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
168 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000169 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000170 if (stop_at_entry)
171 launch_flags |= eLaunchFlagStopAtEntry;
172 ProcessLaunchInfo launch_info (stdin_path,
173 stdout_path,
174 stderr_path,
175 working_directory,
176 launch_flags);
177 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
178 if (exe_module)
Greg Clayton14715c62013-06-29 00:10:32 +0000179 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000180 if (argv)
181 launch_info.GetArguments().AppendArguments (argv);
182 if (envp)
183 launch_info.GetEnvironmentEntries ().SetArguments (envp);
184 error.SetError (process_sp->Launch (launch_info));
James McIlree9631aae2011-03-04 00:31:13 +0000185 }
186 else
187 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000188 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-03-04 00:31:13 +0000189 }
190 }
191 else
192 {
193 error.SetErrorString ("unable to attach pid");
194 }
195
196 if (log) {
197 SBStream sstr;
198 error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000199 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000200 }
201
202 return error.Success();
203}
204
205bool
206SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
207{
Greg Claytonacdbe812012-01-30 09:04:36 +0000208 ProcessSP process_sp(GetSP());
209 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000210 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000211 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
212 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000213 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000214 ProcessAttachInfo attach_info;
215 attach_info.SetProcessID (pid);
216 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000217 }
218 else
219 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000220 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-03-04 00:31:13 +0000221 }
222 }
223 else
224 {
225 error.SetErrorString ("unable to attach pid");
226 }
227
Greg Clayton5160ce52013-03-27 23:08:40 +0000228 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000229 if (log) {
230 SBStream sstr;
231 error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +0000232 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000233 }
234
235 return error.Success();
236}
237
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238
239uint32_t
240SBProcess::GetNumThreads ()
241{
Greg Clayton5160ce52013-03-27 23:08:40 +0000242 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000243
Caroline Ticeceb6b132010-10-26 03:11:13 +0000244 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000245 ProcessSP process_sp(GetSP());
246 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000247 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000248 Process::StopLocker stop_locker;
249
250 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000251 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000252 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000253 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000254
255 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000256 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000257
258 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000259}
260
261SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000262SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263{
Greg Clayton5160ce52013-03-27 23:08:40 +0000264 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000265
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000267 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000268 ProcessSP process_sp(GetSP());
269 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000270 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000271 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
272 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000273 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000274 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000275
276 if (log)
277 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000278 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000279 }
280
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281 return sb_thread;
282}
283
Greg Claytona4d87472013-01-18 23:41:08 +0000284SBThread
285SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
286{
Greg Clayton5160ce52013-03-27 23:08:40 +0000287 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona4d87472013-01-18 23:41:08 +0000288
289 SBThread sb_thread;
290 ThreadSP thread_sp;
291 ProcessSP process_sp(GetSP());
292 if (process_sp)
293 {
294 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
295 thread_sp = process_sp->CreateOSPluginThread(tid, context);
296 sb_thread.SetThread (thread_sp);
297 }
298
299 if (log)
300 log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get());
301
302 return sb_thread;
303}
304
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000305SBTarget
306SBProcess::GetTarget() const
307{
Greg Clayton5160ce52013-03-27 23:08:40 +0000308 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000309
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000310 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000311 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000312 ProcessSP process_sp(GetSP());
313 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000314 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000315 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000316 sb_target.SetSP (target_sp);
317 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000318
319 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000320 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000321
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000322 return sb_target;
323}
324
325
326size_t
327SBProcess::PutSTDIN (const char *src, size_t src_len)
328{
Greg Clayton5160ce52013-03-27 23:08:40 +0000329 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000330
Caroline Ticeceb6b132010-10-26 03:11:13 +0000331 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000332 ProcessSP process_sp(GetSP());
333 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334 {
335 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000336 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000337 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000338
339 if (log)
Sylvestre Ledru779f9212013-10-31 23:55:19 +0000340 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %zu",
Greg Claytonacdbe812012-01-30 09:04:36 +0000341 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000342 src,
343 (uint32_t) src_len,
344 ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000345
346 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000347}
348
349size_t
350SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
351{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000352 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000353 ProcessSP process_sp(GetSP());
354 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000355 {
356 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000357 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000359
Greg Clayton5160ce52013-03-27 23:08:40 +0000360 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000361 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000362 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Greg Clayton43e0af02012-09-18 18:04:04 +0000363 process_sp.get(),
364 (int) bytes_read,
365 dst,
366 (uint64_t)dst_len,
367 (uint64_t)bytes_read);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000368
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000369 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370}
371
372size_t
373SBProcess::GetSTDERR (char *dst, size_t dst_len) const
374{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000375 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000376 ProcessSP process_sp(GetSP());
377 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000378 {
379 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000380 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000381 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000382
Greg Clayton5160ce52013-03-27 23:08:40 +0000383 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000384 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000385 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Greg Clayton43e0af02012-09-18 18:04:04 +0000386 process_sp.get(),
387 (int) bytes_read,
388 dst,
389 (uint64_t)dst_len,
390 (uint64_t)bytes_read);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000391
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000392 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393}
394
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000395size_t
396SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
397{
398 size_t bytes_read = 0;
399 ProcessSP process_sp(GetSP());
400 if (process_sp)
401 {
402 Error error;
403 bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
404 }
405
Greg Clayton5160ce52013-03-27 23:08:40 +0000406 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000407 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000408 log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000409 process_sp.get(),
410 (int) bytes_read,
411 dst,
412 (uint64_t)dst_len,
413 (uint64_t)bytes_read);
414
415 return bytes_read;
416}
417
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000418void
Jim Ingham2976d002010-08-26 21:32:51 +0000419SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000420{
421 if (out == NULL)
422 return;
423
Greg Claytonacdbe812012-01-30 09:04:36 +0000424 ProcessSP process_sp(GetSP());
425 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000426 {
427 const StateType event_state = SBProcess::GetStateFromEvent (event);
428 char message[1024];
429 int message_len = ::snprintf (message,
430 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000431 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000432 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433 SBDebugger::StateAsCString (event_state));
434
435 if (message_len > 0)
436 ::fwrite (message, 1, message_len, out);
437 }
438}
439
440void
Jim Ingham2976d002010-08-26 21:32:51 +0000441SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000442{
Greg Claytonacdbe812012-01-30 09:04:36 +0000443 ProcessSP process_sp(GetSP());
444 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000445 {
446 const StateType event_state = SBProcess::GetStateFromEvent (event);
447 char message[1024];
448 ::snprintf (message,
449 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000450 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000451 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000452 SBDebugger::StateAsCString (event_state));
453
454 result.AppendMessage (message);
455 }
456}
457
458bool
Jim Ingham2976d002010-08-26 21:32:51 +0000459SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460{
Greg Claytonacdbe812012-01-30 09:04:36 +0000461 ProcessSP process_sp(GetSP());
462 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000463 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000464 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
465 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000466 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000467 return false;
468}
469
470bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000471SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
472{
Greg Clayton5160ce52013-03-27 23:08:40 +0000473 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000474
Caroline Ticeceb6b132010-10-26 03:11:13 +0000475 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000476 ProcessSP process_sp(GetSP());
477 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000478 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000479 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
480 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000481 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000482
483 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000484 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000485 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000486
487 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488}
489
Jim Ingham18b46892012-07-13 20:18:18 +0000490bool
491SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
492{
Greg Clayton5160ce52013-03-27 23:08:40 +0000493 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000494
495 bool ret_val = false;
496 ProcessSP process_sp(GetSP());
497 if (process_sp)
498 {
499 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
500 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
501 }
502
503 if (log)
504 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
505 process_sp.get(), index_id, (ret_val ? "true" : "false"));
506
507 return ret_val;
508}
509
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000510SBThread
511SBProcess::GetThreadAtIndex (size_t index)
512{
Greg Clayton5160ce52013-03-27 23:08:40 +0000513 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000514
Greg Clayton17a6ad02012-01-30 02:53:15 +0000515 SBThread sb_thread;
516 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000517 ProcessSP process_sp(GetSP());
518 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000519 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000520 Process::StopLocker stop_locker;
521 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000522 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000523 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000524 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000525 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000526
527 if (log)
528 {
Greg Clayton93aa84e2010-10-29 04:59:35 +0000529 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000530 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000531 }
532
Greg Clayton17a6ad02012-01-30 02:53:15 +0000533 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000534}
535
Jim Inghambf2956a22013-01-08 23:22:42 +0000536uint32_t
537SBProcess::GetStopID(bool include_expression_stops)
538{
539 ProcessSP process_sp(GetSP());
540 if (process_sp)
541 {
542 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
543 if (include_expression_stops)
544 return process_sp->GetStopID();
545 else
546 return process_sp->GetLastNaturalStopID();
547 }
548 return 0;
549}
550
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551StateType
552SBProcess::GetState ()
553{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000554
Caroline Ticeceb6b132010-10-26 03:11:13 +0000555 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000556 ProcessSP process_sp(GetSP());
557 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000558 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000559 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
560 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000561 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000562
Greg Clayton5160ce52013-03-27 23:08:40 +0000563 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000564 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000565 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000566 process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000567 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000568
569 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570}
571
572
573int
574SBProcess::GetExitStatus ()
575{
Greg Clayton48381312010-10-30 04:51:46 +0000576 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000577 ProcessSP process_sp(GetSP());
578 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000579 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000580 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
581 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000582 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000583 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000584 if (log)
585 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000586 process_sp.get(), exit_status, exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000587
588 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000589}
590
591const char *
592SBProcess::GetExitDescription ()
593{
Greg Clayton48381312010-10-30 04:51:46 +0000594 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000595 ProcessSP process_sp(GetSP());
596 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000597 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000598 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
599 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000600 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000601 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000602 if (log)
603 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000604 process_sp.get(), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000605 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000606}
607
608lldb::pid_t
609SBProcess::GetProcessID ()
610{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000611 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000612 ProcessSP process_sp(GetSP());
613 if (process_sp)
614 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000615
Greg Clayton5160ce52013-03-27 23:08:40 +0000616 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000617 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000618 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000619
620 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000621}
622
Greg Clayton949e8222013-01-16 17:29:04 +0000623uint32_t
624SBProcess::GetUniqueID()
625{
626 uint32_t ret_val = 0;
627 ProcessSP process_sp(GetSP());
628 if (process_sp)
629 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000630 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000631 if (log)
632 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
633 return ret_val;
634}
635
Johnny Chencf386e22011-03-01 22:56:31 +0000636ByteOrder
637SBProcess::GetByteOrder () const
638{
639 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000640 ProcessSP process_sp(GetSP());
641 if (process_sp)
642 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chencf386e22011-03-01 22:56:31 +0000643
Greg Clayton5160ce52013-03-27 23:08:40 +0000644 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000645 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000646 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000647
648 return byteOrder;
649}
650
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000651uint32_t
652SBProcess::GetAddressByteSize () const
653{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000654 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000655 ProcessSP process_sp(GetSP());
656 if (process_sp)
657 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000658
Greg Clayton5160ce52013-03-27 23:08:40 +0000659 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000660 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000661 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000662
663 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000664}
665
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000666SBError
667SBProcess::Continue ()
668{
Greg Clayton5160ce52013-03-27 23:08:40 +0000669 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000670
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000671 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000672 ProcessSP process_sp(GetSP());
673
674 if (log)
675 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
676
677 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000678 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000679 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0c74e782011-06-24 03:21:43 +0000680
Greg Claytonacdbe812012-01-30 09:04:36 +0000681 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000682 if (error.Success())
683 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000684 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000685 {
686 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000687 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
688 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000689 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000690 }
691 sb_error.SetError(error);
692 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000693 else
694 sb_error.SetErrorString ("SBProcess is invalid");
695
Caroline Ticeceb6b132010-10-26 03:11:13 +0000696 if (log)
697 {
698 SBStream sstr;
699 sb_error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000700 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000701 }
702
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000703 return sb_error;
704}
705
706
707SBError
708SBProcess::Destroy ()
709{
710 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000711 ProcessSP process_sp(GetSP());
712 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000713 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000714 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
715 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000716 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000717 else
718 sb_error.SetErrorString ("SBProcess is invalid");
719
Greg Clayton5160ce52013-03-27 23:08:40 +0000720 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000721 if (log)
722 {
723 SBStream sstr;
724 sb_error.GetDescription (sstr);
Greg Clayton6779606a2011-01-22 23:43:18 +0000725 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000726 process_sp.get(),
Greg Clayton6779606a2011-01-22 23:43:18 +0000727 sb_error.get(),
728 sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000729 }
730
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731 return sb_error;
732}
733
734
735SBError
736SBProcess::Stop ()
737{
738 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000739 ProcessSP process_sp(GetSP());
740 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000741 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000742 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
743 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000744 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000745 else
746 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000747
Greg Clayton5160ce52013-03-27 23:08:40 +0000748 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000749 if (log)
750 {
751 SBStream sstr;
752 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000753 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000754 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000755 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000756 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000757 }
758
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000759 return sb_error;
760}
761
762SBError
763SBProcess::Kill ()
764{
765 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000766 ProcessSP process_sp(GetSP());
767 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000768 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000769 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
770 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000771 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000772 else
773 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000774
Greg Clayton5160ce52013-03-27 23:08:40 +0000775 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000776 if (log)
777 {
778 SBStream sstr;
779 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000780 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000781 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000782 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000783 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000784 }
785
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786 return sb_error;
787}
788
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000789SBError
790SBProcess::Detach ()
791{
Jim Inghamacff8952013-05-02 00:27:30 +0000792 // FIXME: This should come from a process default.
793 bool keep_stopped = false;
794 return Detach (keep_stopped);
795}
796
797SBError
798SBProcess::Detach (bool keep_stopped)
799{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000801 ProcessSP process_sp(GetSP());
802 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000803 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000804 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000805 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000806 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807 else
808 sb_error.SetErrorString ("SBProcess is invalid");
809
810 return sb_error;
811}
812
813SBError
Greg Clayton48381312010-10-30 04:51:46 +0000814SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000815{
816 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000817 ProcessSP process_sp(GetSP());
818 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000819 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000820 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
821 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000822 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000823 else
824 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000825 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000826 if (log)
827 {
828 SBStream sstr;
829 sb_error.GetDescription (sstr);
830 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000831 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000832 signo,
833 sb_error.get(),
834 sstr.GetData());
835 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000836 return sb_error;
837}
838
Jim Inghamcfc09352012-07-27 23:57:19 +0000839void
840SBProcess::SendAsyncInterrupt ()
841{
842 ProcessSP process_sp(GetSP());
843 if (process_sp)
844 {
845 process_sp->SendAsyncInterrupt ();
846 }
847}
848
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000850SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000851{
Greg Clayton48381312010-10-30 04:51:46 +0000852 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000853 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000854 ProcessSP process_sp(GetSP());
855 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000856 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000857 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000858 Process::StopLocker stop_locker;
859 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
860 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000861 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000862 }
Greg Clayton48381312010-10-30 04:51:46 +0000863
Greg Clayton5160ce52013-03-27 23:08:40 +0000864 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000865 if (log)
866 {
Daniel Malead01b2952012-11-29 21:49:15 +0000867 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000868 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000869 tid,
Greg Clayton17a6ad02012-01-30 02:53:15 +0000870 thread_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000871 }
872
873 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000874}
875
Jim Ingham18b46892012-07-13 20:18:18 +0000876SBThread
877SBProcess::GetThreadByIndexID (uint32_t index_id)
878{
879 SBThread sb_thread;
880 ThreadSP thread_sp;
881 ProcessSP process_sp(GetSP());
882 if (process_sp)
883 {
884 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
885 Process::StopLocker stop_locker;
886 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
887 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
888 sb_thread.SetThread (thread_sp);
889 }
890
Greg Clayton5160ce52013-03-27 23:08:40 +0000891 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000892 if (log)
893 {
894 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
895 process_sp.get(),
896 index_id,
897 thread_sp.get());
898 }
899
900 return sb_thread;
901}
902
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000903StateType
904SBProcess::GetStateFromEvent (const SBEvent &event)
905{
Greg Clayton5160ce52013-03-27 23:08:40 +0000906 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000907
Caroline Ticeceb6b132010-10-26 03:11:13 +0000908 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
909
910 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000911 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000912 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000913
914 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000915}
916
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917bool
918SBProcess::GetRestartedFromEvent (const SBEvent &event)
919{
Greg Clayton66111032010-06-23 01:19:29 +0000920 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000921}
922
Jim Ingham0161b492013-02-09 01:29:05 +0000923size_t
924SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
925{
926 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
927}
928
929const char *
930SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
931{
932 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
933}
934
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000935SBProcess
936SBProcess::GetProcessFromEvent (const SBEvent &event)
937{
Greg Clayton66111032010-06-23 01:19:29 +0000938 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000939 return process;
940}
941
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000942bool
943SBProcess::EventIsProcessEvent (const SBEvent &event)
944{
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000945 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000946}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000947
948SBBroadcaster
949SBProcess::GetBroadcaster () const
950{
Greg Clayton5160ce52013-03-27 23:08:40 +0000951 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000952
Greg Claytonacdbe812012-01-30 09:04:36 +0000953 ProcessSP process_sp(GetSP());
954
955 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000956
957 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000958 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000959 broadcaster.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000960
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000961 return broadcaster;
962}
963
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000964const char *
965SBProcess::GetBroadcasterClass ()
966{
967 return Process::GetStaticBroadcasterClass().AsCString();
968}
969
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000970size_t
971SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
972{
Greg Clayton5160ce52013-03-27 23:08:40 +0000973 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000974
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000975 size_t bytes_read = 0;
976
Greg Claytonacdbe812012-01-30 09:04:36 +0000977 ProcessSP process_sp(GetSP());
978
Greg Clayton48381312010-10-30 04:51:46 +0000979 if (log)
980 {
Daniel Malead01b2952012-11-29 21:49:15 +0000981 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +0000982 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000983 addr,
984 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +0000985 (uint64_t)dst_len,
Greg Clayton48381312010-10-30 04:51:46 +0000986 sb_error.get());
987 }
Greg Claytonacdbe812012-01-30 09:04:36 +0000988
989 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000990 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000991 Process::StopLocker stop_locker;
992 if (stop_locker.TryLock(&process_sp->GetRunLock()))
993 {
994 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
995 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
996 }
997 else
998 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000999 if (log)
1000 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001001 sb_error.SetErrorString("process is running");
1002 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001003 }
1004 else
1005 {
1006 sb_error.SetErrorString ("SBProcess is invalid");
1007 }
1008
Caroline Ticeceb6b132010-10-26 03:11:13 +00001009 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001010 {
1011 SBStream sstr;
1012 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001013 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001014 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +00001015 addr,
1016 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +00001017 (uint64_t)dst_len,
Greg Clayton93aa84e2010-10-29 04:59:35 +00001018 sb_error.get(),
1019 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001020 (uint64_t)bytes_read);
Greg Clayton93aa84e2010-10-29 04:59:35 +00001021 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001022
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001023 return bytes_read;
1024}
1025
1026size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001027SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1028{
1029 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001030 ProcessSP process_sp(GetSP());
1031 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001032 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001033 Process::StopLocker stop_locker;
1034 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1035 {
1036 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1037 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1038 }
1039 else
1040 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001042 if (log)
1043 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001044 sb_error.SetErrorString("process is running");
1045 }
Greg Claytone91b7952011-12-15 03:14:23 +00001046 }
1047 else
1048 {
1049 sb_error.SetErrorString ("SBProcess is invalid");
1050 }
1051 return bytes_read;
1052}
1053
1054uint64_t
1055SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1056{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001057 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001058 ProcessSP process_sp(GetSP());
1059 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001060 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001061 Process::StopLocker stop_locker;
1062 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1063 {
1064 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1065 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1066 }
1067 else
1068 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001069 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001070 if (log)
1071 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001072 sb_error.SetErrorString("process is running");
1073 }
Greg Claytone91b7952011-12-15 03:14:23 +00001074 }
1075 else
1076 {
1077 sb_error.SetErrorString ("SBProcess is invalid");
1078 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001079 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001080}
1081
1082lldb::addr_t
1083SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1084{
1085 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001086 ProcessSP process_sp(GetSP());
1087 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001088 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001089 Process::StopLocker stop_locker;
1090 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1091 {
1092 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1093 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1094 }
1095 else
1096 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001097 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001098 if (log)
1099 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001100 sb_error.SetErrorString("process is running");
1101 }
Greg Claytone91b7952011-12-15 03:14:23 +00001102 }
1103 else
1104 {
1105 sb_error.SetErrorString ("SBProcess is invalid");
1106 }
1107 return ptr;
1108}
1109
1110size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001111SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1112{
1113 size_t bytes_written = 0;
1114
Greg Clayton5160ce52013-03-27 23:08:40 +00001115 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001116
1117 ProcessSP process_sp(GetSP());
1118
Greg Clayton48381312010-10-30 04:51:46 +00001119 if (log)
1120 {
Daniel Malead01b2952012-11-29 21:49:15 +00001121 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +00001122 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001123 addr,
1124 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001125 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001126 sb_error.get());
1127 }
1128
Greg Claytonacdbe812012-01-30 09:04:36 +00001129 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001130 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001131 Process::StopLocker stop_locker;
1132 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1133 {
1134 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1135 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1136 }
1137 else
1138 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001139 if (log)
1140 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001141 sb_error.SetErrorString("process is running");
1142 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001143 }
1144
Greg Clayton48381312010-10-30 04:51:46 +00001145 if (log)
1146 {
1147 SBStream sstr;
1148 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001149 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001150 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001151 addr,
1152 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001153 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001154 sb_error.get(),
1155 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001156 (uint64_t)bytes_written);
Greg Clayton48381312010-10-30 04:51:46 +00001157 }
1158
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001159 return bytes_written;
1160}
1161
Caroline Ticedde9cff2010-09-20 05:20:02 +00001162bool
1163SBProcess::GetDescription (SBStream &description)
1164{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001165 Stream &strm = description.ref();
1166
Greg Claytonacdbe812012-01-30 09:04:36 +00001167 ProcessSP process_sp(GetSP());
1168 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001169 {
1170 char path[PATH_MAX];
1171 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001172 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001173 const char *exe_name = NULL;
1174 if (exe_module)
1175 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1176
Daniel Malead01b2952012-11-29 21:49:15 +00001177 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001178 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001179 lldb_private::StateAsCString (GetState()),
1180 GetNumThreads(),
1181 exe_name ? ", executable = " : "",
1182 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001183 }
1184 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001185 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001186
1187 return true;
1188}
Greg Clayton8f343b02010-11-04 01:54:29 +00001189
1190uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001191SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1192{
Greg Clayton5160ce52013-03-27 23:08:40 +00001193 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001194
1195 uint32_t num = 0;
1196 ProcessSP process_sp(GetSP());
1197 if (process_sp)
1198 {
1199 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1200 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001201 if (log)
1202 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1203 process_sp.get(), num);
1204 }
1205 else
1206 {
1207 sb_error.SetErrorString ("SBProcess is invalid");
1208 }
1209 return num;
1210}
1211
1212uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001213SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1214{
Greg Claytonacdbe812012-01-30 09:04:36 +00001215 ProcessSP process_sp(GetSP());
1216 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001217 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001218 Process::StopLocker stop_locker;
1219 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1220 {
1221 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1222 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1223 }
1224 else
1225 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001226 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001227 if (log)
1228 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001229 sb_error.SetErrorString("process is running");
1230 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001231 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001232 return LLDB_INVALID_IMAGE_TOKEN;
1233}
1234
1235lldb::SBError
1236SBProcess::UnloadImage (uint32_t image_token)
1237{
1238 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001239 ProcessSP process_sp(GetSP());
1240 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001241 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001242 Process::StopLocker stop_locker;
1243 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1244 {
1245 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1246 sb_error.SetError (process_sp->UnloadImage (image_token));
1247 }
1248 else
1249 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001250 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001251 if (log)
1252 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001253 sb_error.SetErrorString("process is running");
1254 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001255 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001256 else
1257 sb_error.SetErrorString("invalid process");
1258 return sb_error;
1259}