blob: 15b677d5c7b0b4f5354897b8214449b7848f1685 [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"
Jason Molenda8c713372013-11-05 11:00:35 +000029#include "lldb/Target/SystemRuntime.h"
Greg Clayton66111032010-06-23 01:19:29 +000030#include "lldb/Target/Target.h"
31#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
33// Project includes
34
Eli Friedman4c5de692010-06-09 07:44:37 +000035#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000036#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000037#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000038#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000039#include "lldb/API/SBFileSpec.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000040#include "lldb/API/SBThread.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000041#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000042#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
44using namespace lldb;
45using namespace lldb_private;
46
47
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000049 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050{
51}
52
53
54//----------------------------------------------------------------------
55// SBProcess constructor
56//----------------------------------------------------------------------
57
58SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000059 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060{
61}
62
63
64SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000065 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000066{
67}
68
Greg Claytonefabb122010-11-05 23:17:00 +000069const SBProcess&
70SBProcess::operator = (const SBProcess& rhs)
71{
72 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000073 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000074 return *this;
75}
76
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077//----------------------------------------------------------------------
78// Destructor
79//----------------------------------------------------------------------
80SBProcess::~SBProcess()
81{
82}
83
Jim Ingham4bddaeb2012-02-16 06:50:00 +000084const char *
85SBProcess::GetBroadcasterClassName ()
86{
87 return Process::GetStaticBroadcasterClass().AsCString();
88}
89
Jim Inghamd7b30ef2012-10-26 19:18:04 +000090const char *
91SBProcess::GetPluginName ()
92{
93 ProcessSP process_sp(GetSP());
94 if (process_sp)
95 {
Greg Clayton57abc5d2013-05-10 21:47:16 +000096 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +000097 }
98 return "<Unknown>";
99}
100
101const char *
102SBProcess::GetShortPluginName ()
103{
104 ProcessSP process_sp(GetSP());
105 if (process_sp)
106 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000107 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000108 }
109 return "<Unknown>";
110}
111
112
Greg Claytonb9556ac2012-01-30 07:41:31 +0000113lldb::ProcessSP
114SBProcess::GetSP() const
115{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000116 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000117}
118
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000120SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000122 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123}
124
125void
126SBProcess::Clear ()
127{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000128 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129}
130
131
132bool
133SBProcess::IsValid() const
134{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000135 ProcessSP process_sp(m_opaque_wp.lock());
136 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000137}
138
James McIlree9631aae2011-03-04 00:31:13 +0000139bool
140SBProcess::RemoteLaunch (char const **argv,
141 char const **envp,
142 const char *stdin_path,
143 const char *stdout_path,
144 const char *stderr_path,
145 const char *working_directory,
146 uint32_t launch_flags,
147 bool stop_at_entry,
148 lldb::SBError& error)
149{
Greg Clayton5160ce52013-03-27 23:08:40 +0000150 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000151 if (log) {
152 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 +0000153 m_opaque_wp.lock().get(),
James McIlree9631aae2011-03-04 00:31:13 +0000154 argv,
155 envp,
156 stdin_path ? stdin_path : "NULL",
157 stdout_path ? stdout_path : "NULL",
158 stderr_path ? stderr_path : "NULL",
159 working_directory ? working_directory : "NULL",
160 launch_flags,
161 stop_at_entry,
162 error.get());
163 }
164
Greg Claytonacdbe812012-01-30 09:04:36 +0000165 ProcessSP process_sp(GetSP());
166 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000167 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000168 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
169 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000170 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000171 if (stop_at_entry)
172 launch_flags |= eLaunchFlagStopAtEntry;
173 ProcessLaunchInfo launch_info (stdin_path,
174 stdout_path,
175 stderr_path,
176 working_directory,
177 launch_flags);
178 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
179 if (exe_module)
Greg Clayton14715c62013-06-29 00:10:32 +0000180 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000181 if (argv)
182 launch_info.GetArguments().AppendArguments (argv);
183 if (envp)
184 launch_info.GetEnvironmentEntries ().SetArguments (envp);
185 error.SetError (process_sp->Launch (launch_info));
James McIlree9631aae2011-03-04 00:31:13 +0000186 }
187 else
188 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000189 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-03-04 00:31:13 +0000190 }
191 }
192 else
193 {
194 error.SetErrorString ("unable to attach pid");
195 }
196
197 if (log) {
198 SBStream sstr;
199 error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000200 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000201 }
202
203 return error.Success();
204}
205
206bool
207SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
208{
Greg Claytonacdbe812012-01-30 09:04:36 +0000209 ProcessSP process_sp(GetSP());
210 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000211 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000212 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
213 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000214 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000215 ProcessAttachInfo attach_info;
216 attach_info.SetProcessID (pid);
217 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000218 }
219 else
220 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000221 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-03-04 00:31:13 +0000222 }
223 }
224 else
225 {
226 error.SetErrorString ("unable to attach pid");
227 }
228
Greg Clayton5160ce52013-03-27 23:08:40 +0000229 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000230 if (log) {
231 SBStream sstr;
232 error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +0000233 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000234 }
235
236 return error.Success();
237}
238
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000239
240uint32_t
241SBProcess::GetNumThreads ()
242{
Greg Clayton5160ce52013-03-27 23:08:40 +0000243 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000244
Caroline Ticeceb6b132010-10-26 03:11:13 +0000245 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000246 ProcessSP process_sp(GetSP());
247 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000249 Process::StopLocker stop_locker;
250
251 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000252 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000253 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000254 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000255
256 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000257 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000258
259 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000260}
261
262SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000263SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000264{
Greg Clayton5160ce52013-03-27 23:08:40 +0000265 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000266
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000267 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000268 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000269 ProcessSP process_sp(GetSP());
270 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000271 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000272 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
273 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000274 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000275 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000276
277 if (log)
278 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000279 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000280 }
281
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000282 return sb_thread;
283}
284
Greg Claytona4d87472013-01-18 23:41:08 +0000285SBThread
286SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
287{
Greg Clayton5160ce52013-03-27 23:08:40 +0000288 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona4d87472013-01-18 23:41:08 +0000289
290 SBThread sb_thread;
291 ThreadSP thread_sp;
292 ProcessSP process_sp(GetSP());
293 if (process_sp)
294 {
295 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
296 thread_sp = process_sp->CreateOSPluginThread(tid, context);
297 sb_thread.SetThread (thread_sp);
298 }
299
300 if (log)
301 log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get());
302
303 return sb_thread;
304}
305
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306SBTarget
307SBProcess::GetTarget() const
308{
Greg Clayton5160ce52013-03-27 23:08:40 +0000309 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000310
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000311 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000312 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000313 ProcessSP process_sp(GetSP());
314 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000315 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000316 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000317 sb_target.SetSP (target_sp);
318 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000319
320 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000321 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000322
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323 return sb_target;
324}
325
326
327size_t
328SBProcess::PutSTDIN (const char *src, size_t src_len)
329{
Greg Clayton5160ce52013-03-27 23:08:40 +0000330 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000331
Caroline Ticeceb6b132010-10-26 03:11:13 +0000332 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000333 ProcessSP process_sp(GetSP());
334 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000335 {
336 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000337 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000339
340 if (log)
Sylvestre Ledru779f9212013-10-31 23:55:19 +0000341 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %zu",
Greg Claytonacdbe812012-01-30 09:04:36 +0000342 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000343 src,
344 (uint32_t) src_len,
345 ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000346
347 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348}
349
350size_t
351SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
352{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000353 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000354 ProcessSP process_sp(GetSP());
355 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000356 {
357 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000358 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000360
Greg Clayton5160ce52013-03-27 23:08:40 +0000361 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000362 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000363 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Greg Clayton43e0af02012-09-18 18:04:04 +0000364 process_sp.get(),
365 (int) bytes_read,
366 dst,
367 (uint64_t)dst_len,
368 (uint64_t)bytes_read);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000369
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000370 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000371}
372
373size_t
374SBProcess::GetSTDERR (char *dst, size_t dst_len) const
375{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000376 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000377 ProcessSP process_sp(GetSP());
378 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000379 {
380 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000381 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000383
Greg Clayton5160ce52013-03-27 23:08:40 +0000384 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000385 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000386 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Greg Clayton43e0af02012-09-18 18:04:04 +0000387 process_sp.get(),
388 (int) bytes_read,
389 dst,
390 (uint64_t)dst_len,
391 (uint64_t)bytes_read);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000392
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000393 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000394}
395
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000396size_t
397SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
398{
399 size_t bytes_read = 0;
400 ProcessSP process_sp(GetSP());
401 if (process_sp)
402 {
403 Error error;
404 bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
405 }
406
Greg Clayton5160ce52013-03-27 23:08:40 +0000407 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000408 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000409 log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000410 process_sp.get(),
411 (int) bytes_read,
412 dst,
413 (uint64_t)dst_len,
414 (uint64_t)bytes_read);
415
416 return bytes_read;
417}
418
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000419void
Jim Ingham2976d002010-08-26 21:32:51 +0000420SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421{
422 if (out == NULL)
423 return;
424
Greg Claytonacdbe812012-01-30 09:04:36 +0000425 ProcessSP process_sp(GetSP());
426 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000427 {
428 const StateType event_state = SBProcess::GetStateFromEvent (event);
429 char message[1024];
430 int message_len = ::snprintf (message,
431 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000432 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000433 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000434 SBDebugger::StateAsCString (event_state));
435
436 if (message_len > 0)
437 ::fwrite (message, 1, message_len, out);
438 }
439}
440
441void
Jim Ingham2976d002010-08-26 21:32:51 +0000442SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000443{
Greg Claytonacdbe812012-01-30 09:04:36 +0000444 ProcessSP process_sp(GetSP());
445 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000446 {
447 const StateType event_state = SBProcess::GetStateFromEvent (event);
448 char message[1024];
449 ::snprintf (message,
450 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000451 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000452 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000453 SBDebugger::StateAsCString (event_state));
454
455 result.AppendMessage (message);
456 }
457}
458
459bool
Jim Ingham2976d002010-08-26 21:32:51 +0000460SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461{
Greg Claytonacdbe812012-01-30 09:04:36 +0000462 ProcessSP process_sp(GetSP());
463 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000464 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000465 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
466 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000467 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468 return false;
469}
470
471bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000472SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
473{
Greg Clayton5160ce52013-03-27 23:08:40 +0000474 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000475
Caroline Ticeceb6b132010-10-26 03:11:13 +0000476 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000477 ProcessSP process_sp(GetSP());
478 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000479 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000480 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
481 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000482 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000483
484 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000485 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000486 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000487
488 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489}
490
Jim Ingham18b46892012-07-13 20:18:18 +0000491bool
492SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
493{
Greg Clayton5160ce52013-03-27 23:08:40 +0000494 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000495
496 bool ret_val = false;
497 ProcessSP process_sp(GetSP());
498 if (process_sp)
499 {
500 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
501 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
502 }
503
504 if (log)
505 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
506 process_sp.get(), index_id, (ret_val ? "true" : "false"));
507
508 return ret_val;
509}
510
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000511SBThread
512SBProcess::GetThreadAtIndex (size_t index)
513{
Greg Clayton5160ce52013-03-27 23:08:40 +0000514 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000515
Greg Clayton17a6ad02012-01-30 02:53:15 +0000516 SBThread sb_thread;
517 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000518 ProcessSP process_sp(GetSP());
519 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000520 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000521 Process::StopLocker stop_locker;
522 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000523 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000524 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000525 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000526 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000527
528 if (log)
529 {
Greg Clayton93aa84e2010-10-29 04:59:35 +0000530 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000531 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000532 }
533
Greg Clayton17a6ad02012-01-30 02:53:15 +0000534 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000535}
536
Jim Inghambf2956a22013-01-08 23:22:42 +0000537uint32_t
538SBProcess::GetStopID(bool include_expression_stops)
539{
540 ProcessSP process_sp(GetSP());
541 if (process_sp)
542 {
543 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
544 if (include_expression_stops)
545 return process_sp->GetStopID();
546 else
547 return process_sp->GetLastNaturalStopID();
548 }
549 return 0;
550}
551
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000552StateType
553SBProcess::GetState ()
554{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000555
Caroline Ticeceb6b132010-10-26 03:11:13 +0000556 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000557 ProcessSP process_sp(GetSP());
558 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000559 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000560 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
561 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000562 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000563
Greg Clayton5160ce52013-03-27 23:08:40 +0000564 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000565 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000566 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000567 process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000568 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000569
570 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000571}
572
573
574int
575SBProcess::GetExitStatus ()
576{
Greg Clayton48381312010-10-30 04:51:46 +0000577 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000578 ProcessSP process_sp(GetSP());
579 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000580 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000581 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
582 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000583 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000584 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000585 if (log)
586 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000587 process_sp.get(), exit_status, exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000588
589 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000590}
591
592const char *
593SBProcess::GetExitDescription ()
594{
Greg Clayton48381312010-10-30 04:51:46 +0000595 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000596 ProcessSP process_sp(GetSP());
597 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000598 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000599 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
600 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000601 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000602 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000603 if (log)
604 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000605 process_sp.get(), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000606 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000607}
608
609lldb::pid_t
610SBProcess::GetProcessID ()
611{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000612 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000613 ProcessSP process_sp(GetSP());
614 if (process_sp)
615 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000616
Greg Clayton5160ce52013-03-27 23:08:40 +0000617 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000618 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000619 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000620
621 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000622}
623
Greg Clayton949e8222013-01-16 17:29:04 +0000624uint32_t
625SBProcess::GetUniqueID()
626{
627 uint32_t ret_val = 0;
628 ProcessSP process_sp(GetSP());
629 if (process_sp)
630 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000631 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000632 if (log)
633 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
634 return ret_val;
635}
636
Johnny Chencf386e22011-03-01 22:56:31 +0000637ByteOrder
638SBProcess::GetByteOrder () const
639{
640 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000641 ProcessSP process_sp(GetSP());
642 if (process_sp)
643 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chencf386e22011-03-01 22:56:31 +0000644
Greg Clayton5160ce52013-03-27 23:08:40 +0000645 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000646 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000647 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000648
649 return byteOrder;
650}
651
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000652uint32_t
653SBProcess::GetAddressByteSize () const
654{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000655 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000656 ProcessSP process_sp(GetSP());
657 if (process_sp)
658 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000659
Greg Clayton5160ce52013-03-27 23:08:40 +0000660 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000661 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000662 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000663
664 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000665}
666
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000667SBError
668SBProcess::Continue ()
669{
Greg Clayton5160ce52013-03-27 23:08:40 +0000670 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000671
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000672 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000673 ProcessSP process_sp(GetSP());
674
675 if (log)
676 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
677
678 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000679 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000680 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0c74e782011-06-24 03:21:43 +0000681
Greg Claytonacdbe812012-01-30 09:04:36 +0000682 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000683 if (error.Success())
684 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000685 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000686 {
687 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000688 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
689 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000690 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000691 }
692 sb_error.SetError(error);
693 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000694 else
695 sb_error.SetErrorString ("SBProcess is invalid");
696
Caroline Ticeceb6b132010-10-26 03:11:13 +0000697 if (log)
698 {
699 SBStream sstr;
700 sb_error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000701 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000702 }
703
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000704 return sb_error;
705}
706
707
708SBError
709SBProcess::Destroy ()
710{
711 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000712 ProcessSP process_sp(GetSP());
713 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000714 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000715 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
716 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000717 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000718 else
719 sb_error.SetErrorString ("SBProcess is invalid");
720
Greg Clayton5160ce52013-03-27 23:08:40 +0000721 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000722 if (log)
723 {
724 SBStream sstr;
725 sb_error.GetDescription (sstr);
Greg Clayton6779606a2011-01-22 23:43:18 +0000726 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000727 process_sp.get(),
Greg Clayton6779606a2011-01-22 23:43:18 +0000728 sb_error.get(),
729 sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000730 }
731
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000732 return sb_error;
733}
734
735
736SBError
737SBProcess::Stop ()
738{
739 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000740 ProcessSP process_sp(GetSP());
741 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000742 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000743 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
744 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000745 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000746 else
747 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000748
Greg Clayton5160ce52013-03-27 23:08:40 +0000749 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000750 if (log)
751 {
752 SBStream sstr;
753 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000754 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000755 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000756 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000757 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000758 }
759
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000760 return sb_error;
761}
762
763SBError
764SBProcess::Kill ()
765{
766 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000767 ProcessSP process_sp(GetSP());
768 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000769 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000770 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
771 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000772 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000773 else
774 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000775
Greg Clayton5160ce52013-03-27 23:08:40 +0000776 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000777 if (log)
778 {
779 SBStream sstr;
780 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000781 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000782 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000783 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000784 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000785 }
786
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787 return sb_error;
788}
789
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790SBError
791SBProcess::Detach ()
792{
Jim Inghamacff8952013-05-02 00:27:30 +0000793 // FIXME: This should come from a process default.
794 bool keep_stopped = false;
795 return Detach (keep_stopped);
796}
797
798SBError
799SBProcess::Detach (bool keep_stopped)
800{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000801 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000802 ProcessSP process_sp(GetSP());
803 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000804 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000805 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000806 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000807 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000808 else
809 sb_error.SetErrorString ("SBProcess is invalid");
810
811 return sb_error;
812}
813
814SBError
Greg Clayton48381312010-10-30 04:51:46 +0000815SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000816{
817 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000818 ProcessSP process_sp(GetSP());
819 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000820 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000821 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
822 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000823 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000824 else
825 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000826 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000827 if (log)
828 {
829 SBStream sstr;
830 sb_error.GetDescription (sstr);
831 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000832 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000833 signo,
834 sb_error.get(),
835 sstr.GetData());
836 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000837 return sb_error;
838}
839
Jim Inghamcfc09352012-07-27 23:57:19 +0000840void
841SBProcess::SendAsyncInterrupt ()
842{
843 ProcessSP process_sp(GetSP());
844 if (process_sp)
845 {
846 process_sp->SendAsyncInterrupt ();
847 }
848}
849
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000850SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000851SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000852{
Greg Clayton48381312010-10-30 04:51:46 +0000853 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000854 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000855 ProcessSP process_sp(GetSP());
856 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000857 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000858 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000859 Process::StopLocker stop_locker;
860 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
861 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000862 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000863 }
Greg Clayton48381312010-10-30 04:51:46 +0000864
Greg Clayton5160ce52013-03-27 23:08:40 +0000865 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000866 if (log)
867 {
Daniel Malead01b2952012-11-29 21:49:15 +0000868 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000869 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000870 tid,
Greg Clayton17a6ad02012-01-30 02:53:15 +0000871 thread_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000872 }
873
874 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000875}
876
Jim Ingham18b46892012-07-13 20:18:18 +0000877SBThread
878SBProcess::GetThreadByIndexID (uint32_t index_id)
879{
880 SBThread sb_thread;
881 ThreadSP thread_sp;
882 ProcessSP process_sp(GetSP());
883 if (process_sp)
884 {
885 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
886 Process::StopLocker stop_locker;
887 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
888 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
889 sb_thread.SetThread (thread_sp);
890 }
891
Greg Clayton5160ce52013-03-27 23:08:40 +0000892 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000893 if (log)
894 {
895 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
896 process_sp.get(),
897 index_id,
898 thread_sp.get());
899 }
900
901 return sb_thread;
902}
903
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000904StateType
905SBProcess::GetStateFromEvent (const SBEvent &event)
906{
Greg Clayton5160ce52013-03-27 23:08:40 +0000907 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000908
Caroline Ticeceb6b132010-10-26 03:11:13 +0000909 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
910
911 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000912 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000913 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000914
915 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000916}
917
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000918bool
919SBProcess::GetRestartedFromEvent (const SBEvent &event)
920{
Greg Clayton66111032010-06-23 01:19:29 +0000921 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922}
923
Jim Ingham0161b492013-02-09 01:29:05 +0000924size_t
925SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
926{
927 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
928}
929
930const char *
931SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
932{
933 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
934}
935
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000936SBProcess
937SBProcess::GetProcessFromEvent (const SBEvent &event)
938{
Greg Clayton66111032010-06-23 01:19:29 +0000939 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000940 return process;
941}
942
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000943bool
944SBProcess::EventIsProcessEvent (const SBEvent &event)
945{
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000946 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000947}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000948
949SBBroadcaster
950SBProcess::GetBroadcaster () const
951{
Greg Clayton5160ce52013-03-27 23:08:40 +0000952 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000953
Greg Claytonacdbe812012-01-30 09:04:36 +0000954 ProcessSP process_sp(GetSP());
955
956 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000957
958 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000959 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000960 broadcaster.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000961
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000962 return broadcaster;
963}
964
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000965const char *
966SBProcess::GetBroadcasterClass ()
967{
968 return Process::GetStaticBroadcasterClass().AsCString();
969}
970
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000971size_t
972SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
973{
Greg Clayton5160ce52013-03-27 23:08:40 +0000974 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000975
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000976 size_t bytes_read = 0;
977
Greg Claytonacdbe812012-01-30 09:04:36 +0000978 ProcessSP process_sp(GetSP());
979
Greg Clayton48381312010-10-30 04:51:46 +0000980 if (log)
981 {
Daniel Malead01b2952012-11-29 21:49:15 +0000982 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +0000983 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000984 addr,
985 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +0000986 (uint64_t)dst_len,
Greg Clayton48381312010-10-30 04:51:46 +0000987 sb_error.get());
988 }
Greg Claytonacdbe812012-01-30 09:04:36 +0000989
990 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000991 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000992 Process::StopLocker stop_locker;
993 if (stop_locker.TryLock(&process_sp->GetRunLock()))
994 {
995 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
996 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
997 }
998 else
999 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001000 if (log)
1001 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001002 sb_error.SetErrorString("process is running");
1003 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001004 }
1005 else
1006 {
1007 sb_error.SetErrorString ("SBProcess is invalid");
1008 }
1009
Caroline Ticeceb6b132010-10-26 03:11:13 +00001010 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001011 {
1012 SBStream sstr;
1013 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001014 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001015 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +00001016 addr,
1017 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +00001018 (uint64_t)dst_len,
Greg Clayton93aa84e2010-10-29 04:59:35 +00001019 sb_error.get(),
1020 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001021 (uint64_t)bytes_read);
Greg Clayton93aa84e2010-10-29 04:59:35 +00001022 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001023
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001024 return bytes_read;
1025}
1026
1027size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001028SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1029{
1030 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001031 ProcessSP process_sp(GetSP());
1032 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001033 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001034 Process::StopLocker stop_locker;
1035 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1036 {
1037 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1038 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1039 }
1040 else
1041 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001042 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001043 if (log)
1044 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001045 sb_error.SetErrorString("process is running");
1046 }
Greg Claytone91b7952011-12-15 03:14:23 +00001047 }
1048 else
1049 {
1050 sb_error.SetErrorString ("SBProcess is invalid");
1051 }
1052 return bytes_read;
1053}
1054
1055uint64_t
1056SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1057{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001058 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001059 ProcessSP process_sp(GetSP());
1060 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001061 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001062 Process::StopLocker stop_locker;
1063 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1064 {
1065 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1066 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1067 }
1068 else
1069 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001070 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001071 if (log)
1072 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001073 sb_error.SetErrorString("process is running");
1074 }
Greg Claytone91b7952011-12-15 03:14:23 +00001075 }
1076 else
1077 {
1078 sb_error.SetErrorString ("SBProcess is invalid");
1079 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001080 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001081}
1082
1083lldb::addr_t
1084SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1085{
1086 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001087 ProcessSP process_sp(GetSP());
1088 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001089 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001090 Process::StopLocker stop_locker;
1091 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1092 {
1093 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1094 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1095 }
1096 else
1097 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001098 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001099 if (log)
1100 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001101 sb_error.SetErrorString("process is running");
1102 }
Greg Claytone91b7952011-12-15 03:14:23 +00001103 }
1104 else
1105 {
1106 sb_error.SetErrorString ("SBProcess is invalid");
1107 }
1108 return ptr;
1109}
1110
1111size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001112SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1113{
1114 size_t bytes_written = 0;
1115
Greg Clayton5160ce52013-03-27 23:08:40 +00001116 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001117
1118 ProcessSP process_sp(GetSP());
1119
Greg Clayton48381312010-10-30 04:51:46 +00001120 if (log)
1121 {
Daniel Malead01b2952012-11-29 21:49:15 +00001122 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +00001123 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001124 addr,
1125 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001126 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001127 sb_error.get());
1128 }
1129
Greg Claytonacdbe812012-01-30 09:04:36 +00001130 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001131 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001132 Process::StopLocker stop_locker;
1133 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1134 {
1135 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1136 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1137 }
1138 else
1139 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001140 if (log)
1141 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001142 sb_error.SetErrorString("process is running");
1143 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001144 }
1145
Greg Clayton48381312010-10-30 04:51:46 +00001146 if (log)
1147 {
1148 SBStream sstr;
1149 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001150 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001151 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001152 addr,
1153 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001154 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001155 sb_error.get(),
1156 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001157 (uint64_t)bytes_written);
Greg Clayton48381312010-10-30 04:51:46 +00001158 }
1159
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001160 return bytes_written;
1161}
1162
Caroline Ticedde9cff2010-09-20 05:20:02 +00001163bool
1164SBProcess::GetDescription (SBStream &description)
1165{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001166 Stream &strm = description.ref();
1167
Greg Claytonacdbe812012-01-30 09:04:36 +00001168 ProcessSP process_sp(GetSP());
1169 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001170 {
1171 char path[PATH_MAX];
1172 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001173 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001174 const char *exe_name = NULL;
1175 if (exe_module)
1176 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1177
Daniel Malead01b2952012-11-29 21:49:15 +00001178 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001179 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001180 lldb_private::StateAsCString (GetState()),
1181 GetNumThreads(),
1182 exe_name ? ", executable = " : "",
1183 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001184 }
1185 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001186 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001187
1188 return true;
1189}
Greg Clayton8f343b02010-11-04 01:54:29 +00001190
1191uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001192SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1193{
Greg Clayton5160ce52013-03-27 23:08:40 +00001194 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001195
1196 uint32_t num = 0;
1197 ProcessSP process_sp(GetSP());
1198 if (process_sp)
1199 {
1200 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1201 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001202 if (log)
1203 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1204 process_sp.get(), num);
1205 }
1206 else
1207 {
1208 sb_error.SetErrorString ("SBProcess is invalid");
1209 }
1210 return num;
1211}
1212
1213uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001214SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1215{
Greg Claytonacdbe812012-01-30 09:04:36 +00001216 ProcessSP process_sp(GetSP());
1217 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001218 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001219 Process::StopLocker stop_locker;
1220 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1221 {
1222 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1223 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1224 }
1225 else
1226 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001227 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001228 if (log)
1229 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001230 sb_error.SetErrorString("process is running");
1231 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001232 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001233 return LLDB_INVALID_IMAGE_TOKEN;
1234}
1235
1236lldb::SBError
1237SBProcess::UnloadImage (uint32_t image_token)
1238{
1239 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001240 ProcessSP process_sp(GetSP());
1241 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001242 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001243 Process::StopLocker stop_locker;
1244 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1245 {
1246 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1247 sb_error.SetError (process_sp->UnloadImage (image_token));
1248 }
1249 else
1250 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001251 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001252 if (log)
1253 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001254 sb_error.SetErrorString("process is running");
1255 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001256 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001257 else
1258 sb_error.SetErrorString("invalid process");
1259 return sb_error;
1260}
Jason Molenda8c713372013-11-05 11:00:35 +00001261
1262uint32_t
1263SBProcess::GetNumThreadOriginExtendedBacktraceTypes ()
1264{
1265 ProcessSP process_sp(GetSP());
1266 if (process_sp && process_sp->GetSystemRuntime())
1267 {
1268 SystemRuntime *runtime = process_sp->GetSystemRuntime();
1269 return runtime->GetThreadOriginExtendedBacktraceTypes().size();
1270 }
1271 return 0;
1272}
1273
1274const char *
1275SBProcess::GetThreadOriginExtendedBacktraceTypeAtIndex (uint32_t idx)
1276{
1277 ProcessSP process_sp(GetSP());
1278 if (process_sp && process_sp->GetSystemRuntime())
1279 {
1280 SystemRuntime *runtime = process_sp->GetSystemRuntime();
1281 std::vector<ConstString> names = runtime->GetThreadOriginExtendedBacktraceTypes();
1282 if (idx < names.size())
1283 {
1284 return names[idx].AsCString();
1285 }
1286 else
1287 {
1288 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1289 if (log)
1290 log->Printf("SBProcess(%p)::GetThreadOriginExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", process_sp.get());
1291 }
1292 }
1293 return NULL;
1294}