blob: 52de0cd4fe3800d8f03414585a313d90f0d5484f [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)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000341 log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +0000342 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000343 src,
Greg Clayton6fea17e2014-03-03 19:15:20 +0000344 (uint64_t) src_len,
345 (uint64_t) 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
Jason Molenda5e8dce42013-12-13 00:29:16 +0000538SBProcess::GetNumQueues ()
539{
540 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
541
542 uint32_t num_queues = 0;
543 ProcessSP process_sp(GetSP());
544 if (process_sp)
545 {
546 Process::StopLocker stop_locker;
547
548 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
549 num_queues = process_sp->GetQueueList().GetSize();
550 }
551
552 if (log)
553 log->Printf ("SBProcess(%p)::GetNumQueues () => %d", process_sp.get(), num_queues);
554
555 return num_queues;
556}
557
558SBQueue
559SBProcess::GetQueueAtIndex (size_t index)
560{
561 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
562
563 SBQueue sb_queue;
564 QueueSP queue_sp;
565 ProcessSP process_sp(GetSP());
566 if (process_sp)
567 {
568 Process::StopLocker stop_locker;
569 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
570 queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
571 sb_queue.SetQueue (queue_sp);
572 }
573
574 if (log)
575 {
576 log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
577 process_sp.get(), (uint32_t) index, queue_sp.get());
578 }
579
580 return sb_queue;
581}
582
583
584uint32_t
Jim Inghambf2956a22013-01-08 23:22:42 +0000585SBProcess::GetStopID(bool include_expression_stops)
586{
587 ProcessSP process_sp(GetSP());
588 if (process_sp)
589 {
590 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
591 if (include_expression_stops)
592 return process_sp->GetStopID();
593 else
594 return process_sp->GetLastNaturalStopID();
595 }
596 return 0;
597}
598
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000599StateType
600SBProcess::GetState ()
601{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000602
Caroline Ticeceb6b132010-10-26 03:11:13 +0000603 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000604 ProcessSP process_sp(GetSP());
605 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000606 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000607 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
608 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000609 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000610
Greg Clayton5160ce52013-03-27 23:08:40 +0000611 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000612 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000613 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000614 process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000615 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000616
617 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000618}
619
620
621int
622SBProcess::GetExitStatus ()
623{
Greg Clayton48381312010-10-30 04:51:46 +0000624 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000625 ProcessSP process_sp(GetSP());
626 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000627 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000628 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
629 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000630 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000631 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000632 if (log)
633 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000634 process_sp.get(), exit_status, exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000635
636 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000637}
638
639const char *
640SBProcess::GetExitDescription ()
641{
Greg Clayton48381312010-10-30 04:51:46 +0000642 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000643 ProcessSP process_sp(GetSP());
644 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000645 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000646 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
647 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000648 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000649 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000650 if (log)
651 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000652 process_sp.get(), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000653 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654}
655
656lldb::pid_t
657SBProcess::GetProcessID ()
658{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000659 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000660 ProcessSP process_sp(GetSP());
661 if (process_sp)
662 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000663
Greg Clayton5160ce52013-03-27 23:08:40 +0000664 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000665 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000666 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000667
668 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000669}
670
Greg Clayton949e8222013-01-16 17:29:04 +0000671uint32_t
672SBProcess::GetUniqueID()
673{
674 uint32_t ret_val = 0;
675 ProcessSP process_sp(GetSP());
676 if (process_sp)
677 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000678 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000679 if (log)
680 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
681 return ret_val;
682}
683
Johnny Chencf386e22011-03-01 22:56:31 +0000684ByteOrder
685SBProcess::GetByteOrder () const
686{
687 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000688 ProcessSP process_sp(GetSP());
689 if (process_sp)
690 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chencf386e22011-03-01 22:56:31 +0000691
Greg Clayton5160ce52013-03-27 23:08:40 +0000692 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000693 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000694 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000695
696 return byteOrder;
697}
698
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000699uint32_t
700SBProcess::GetAddressByteSize () const
701{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000702 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000703 ProcessSP process_sp(GetSP());
704 if (process_sp)
705 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000706
Greg Clayton5160ce52013-03-27 23:08:40 +0000707 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000708 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000709 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000710
711 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712}
713
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000714SBError
715SBProcess::Continue ()
716{
Greg Clayton5160ce52013-03-27 23:08:40 +0000717 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000718
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000719 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000720 ProcessSP process_sp(GetSP());
721
722 if (log)
723 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
724
725 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000726 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000727 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0c74e782011-06-24 03:21:43 +0000728
Greg Claytonacdbe812012-01-30 09:04:36 +0000729 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000730 if (error.Success())
731 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000732 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000733 {
734 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000735 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
736 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000737 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000738 }
739 sb_error.SetError(error);
740 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000741 else
742 sb_error.SetErrorString ("SBProcess is invalid");
743
Caroline Ticeceb6b132010-10-26 03:11:13 +0000744 if (log)
745 {
746 SBStream sstr;
747 sb_error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000748 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000749 }
750
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000751 return sb_error;
752}
753
754
755SBError
756SBProcess::Destroy ()
757{
758 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000759 ProcessSP process_sp(GetSP());
760 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000761 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000762 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
763 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000764 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 else
766 sb_error.SetErrorString ("SBProcess is invalid");
767
Greg Clayton5160ce52013-03-27 23:08:40 +0000768 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000769 if (log)
770 {
771 SBStream sstr;
772 sb_error.GetDescription (sstr);
Greg Clayton6779606a2011-01-22 23:43:18 +0000773 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000774 process_sp.get(),
Greg Clayton6779606a2011-01-22 23:43:18 +0000775 sb_error.get(),
776 sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000777 }
778
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000779 return sb_error;
780}
781
782
783SBError
784SBProcess::Stop ()
785{
786 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000787 ProcessSP process_sp(GetSP());
788 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000789 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000790 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
791 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000792 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793 else
794 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000795
Greg Clayton5160ce52013-03-27 23:08:40 +0000796 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000797 if (log)
798 {
799 SBStream sstr;
800 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000801 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000802 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000803 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000804 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000805 }
806
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807 return sb_error;
808}
809
810SBError
811SBProcess::Kill ()
812{
813 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000814 ProcessSP process_sp(GetSP());
815 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000816 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000817 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
818 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000819 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820 else
821 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000822
Greg Clayton5160ce52013-03-27 23:08:40 +0000823 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000824 if (log)
825 {
826 SBStream sstr;
827 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000828 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000829 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000830 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000831 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000832 }
833
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000834 return sb_error;
835}
836
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000837SBError
838SBProcess::Detach ()
839{
Jim Inghamacff8952013-05-02 00:27:30 +0000840 // FIXME: This should come from a process default.
841 bool keep_stopped = false;
842 return Detach (keep_stopped);
843}
844
845SBError
846SBProcess::Detach (bool keep_stopped)
847{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000848 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000849 ProcessSP process_sp(GetSP());
850 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000851 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000852 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000853 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000854 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000855 else
856 sb_error.SetErrorString ("SBProcess is invalid");
857
858 return sb_error;
859}
860
861SBError
Greg Clayton48381312010-10-30 04:51:46 +0000862SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000863{
864 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000865 ProcessSP process_sp(GetSP());
866 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000867 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000868 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
869 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000870 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000871 else
872 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000873 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000874 if (log)
875 {
876 SBStream sstr;
877 sb_error.GetDescription (sstr);
878 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000879 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000880 signo,
881 sb_error.get(),
882 sstr.GetData());
883 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000884 return sb_error;
885}
886
Jim Inghamcfc09352012-07-27 23:57:19 +0000887void
888SBProcess::SendAsyncInterrupt ()
889{
890 ProcessSP process_sp(GetSP());
891 if (process_sp)
892 {
893 process_sp->SendAsyncInterrupt ();
894 }
895}
896
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000897SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000898SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000899{
Greg Clayton48381312010-10-30 04:51:46 +0000900 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000901 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000902 ProcessSP process_sp(GetSP());
903 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000904 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000905 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000906 Process::StopLocker stop_locker;
907 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
908 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000909 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000910 }
Greg Clayton48381312010-10-30 04:51:46 +0000911
Greg Clayton5160ce52013-03-27 23:08:40 +0000912 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000913 if (log)
914 {
Daniel Malead01b2952012-11-29 21:49:15 +0000915 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000916 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000917 tid,
Greg Clayton17a6ad02012-01-30 02:53:15 +0000918 thread_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000919 }
920
921 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922}
923
Jim Ingham18b46892012-07-13 20:18:18 +0000924SBThread
925SBProcess::GetThreadByIndexID (uint32_t index_id)
926{
927 SBThread sb_thread;
928 ThreadSP thread_sp;
929 ProcessSP process_sp(GetSP());
930 if (process_sp)
931 {
932 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
933 Process::StopLocker stop_locker;
934 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
935 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
936 sb_thread.SetThread (thread_sp);
937 }
938
Greg Clayton5160ce52013-03-27 23:08:40 +0000939 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000940 if (log)
941 {
942 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
943 process_sp.get(),
944 index_id,
945 thread_sp.get());
946 }
947
948 return sb_thread;
949}
950
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000951StateType
952SBProcess::GetStateFromEvent (const SBEvent &event)
953{
Greg Clayton5160ce52013-03-27 23:08:40 +0000954 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000955
Caroline Ticeceb6b132010-10-26 03:11:13 +0000956 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
957
958 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000959 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000960 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000961
962 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963}
964
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000965bool
966SBProcess::GetRestartedFromEvent (const SBEvent &event)
967{
Greg Clayton66111032010-06-23 01:19:29 +0000968 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000969}
970
Jim Ingham0161b492013-02-09 01:29:05 +0000971size_t
972SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
973{
974 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
975}
976
977const char *
978SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
979{
980 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
981}
982
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000983SBProcess
984SBProcess::GetProcessFromEvent (const SBEvent &event)
985{
Greg Clayton66111032010-06-23 01:19:29 +0000986 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000987 return process;
988}
989
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000990bool
991SBProcess::EventIsProcessEvent (const SBEvent &event)
992{
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000993 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000994}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000995
996SBBroadcaster
997SBProcess::GetBroadcaster () const
998{
Greg Clayton5160ce52013-03-27 23:08:40 +0000999 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001000
Greg Claytonacdbe812012-01-30 09:04:36 +00001001 ProcessSP process_sp(GetSP());
1002
1003 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001004
1005 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +00001006 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +00001007 broadcaster.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +00001008
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001009 return broadcaster;
1010}
1011
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001012const char *
1013SBProcess::GetBroadcasterClass ()
1014{
1015 return Process::GetStaticBroadcasterClass().AsCString();
1016}
1017
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001018size_t
1019SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1020{
Greg Clayton5160ce52013-03-27 23:08:40 +00001021 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001022
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001023 size_t bytes_read = 0;
1024
Greg Claytonacdbe812012-01-30 09:04:36 +00001025 ProcessSP process_sp(GetSP());
1026
Greg Clayton48381312010-10-30 04:51:46 +00001027 if (log)
1028 {
Daniel Malead01b2952012-11-29 21:49:15 +00001029 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +00001030 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001031 addr,
1032 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +00001033 (uint64_t)dst_len,
Greg Clayton48381312010-10-30 04:51:46 +00001034 sb_error.get());
1035 }
Greg Claytonacdbe812012-01-30 09:04:36 +00001036
1037 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001038 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001039 Process::StopLocker stop_locker;
1040 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1041 {
1042 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1043 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1044 }
1045 else
1046 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001047 if (log)
1048 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001049 sb_error.SetErrorString("process is running");
1050 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001051 }
1052 else
1053 {
1054 sb_error.SetErrorString ("SBProcess is invalid");
1055 }
1056
Caroline Ticeceb6b132010-10-26 03:11:13 +00001057 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001058 {
1059 SBStream sstr;
1060 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001061 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001062 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +00001063 addr,
1064 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +00001065 (uint64_t)dst_len,
Greg Clayton93aa84e2010-10-29 04:59:35 +00001066 sb_error.get(),
1067 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001068 (uint64_t)bytes_read);
Greg Clayton93aa84e2010-10-29 04:59:35 +00001069 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001070
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001071 return bytes_read;
1072}
1073
1074size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001075SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1076{
1077 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001078 ProcessSP process_sp(GetSP());
1079 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001080 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001081 Process::StopLocker stop_locker;
1082 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1083 {
1084 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1085 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1086 }
1087 else
1088 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001089 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001090 if (log)
1091 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001092 sb_error.SetErrorString("process is running");
1093 }
Greg Claytone91b7952011-12-15 03:14:23 +00001094 }
1095 else
1096 {
1097 sb_error.SetErrorString ("SBProcess is invalid");
1098 }
1099 return bytes_read;
1100}
1101
1102uint64_t
1103SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1104{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001105 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001106 ProcessSP process_sp(GetSP());
1107 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001108 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001109 Process::StopLocker stop_locker;
1110 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1111 {
1112 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1113 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1114 }
1115 else
1116 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001117 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001118 if (log)
1119 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001120 sb_error.SetErrorString("process is running");
1121 }
Greg Claytone91b7952011-12-15 03:14:23 +00001122 }
1123 else
1124 {
1125 sb_error.SetErrorString ("SBProcess is invalid");
1126 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001127 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001128}
1129
1130lldb::addr_t
1131SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1132{
1133 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001134 ProcessSP process_sp(GetSP());
1135 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001136 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001137 Process::StopLocker stop_locker;
1138 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1139 {
1140 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1141 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1142 }
1143 else
1144 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001145 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001146 if (log)
1147 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001148 sb_error.SetErrorString("process is running");
1149 }
Greg Claytone91b7952011-12-15 03:14:23 +00001150 }
1151 else
1152 {
1153 sb_error.SetErrorString ("SBProcess is invalid");
1154 }
1155 return ptr;
1156}
1157
1158size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001159SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1160{
1161 size_t bytes_written = 0;
1162
Greg Clayton5160ce52013-03-27 23:08:40 +00001163 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001164
1165 ProcessSP process_sp(GetSP());
1166
Greg Clayton48381312010-10-30 04:51:46 +00001167 if (log)
1168 {
Daniel Malead01b2952012-11-29 21:49:15 +00001169 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +00001170 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001171 addr,
1172 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001173 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001174 sb_error.get());
1175 }
1176
Greg Claytonacdbe812012-01-30 09:04:36 +00001177 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001178 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001179 Process::StopLocker stop_locker;
1180 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1181 {
1182 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1183 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1184 }
1185 else
1186 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001187 if (log)
1188 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001189 sb_error.SetErrorString("process is running");
1190 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191 }
1192
Greg Clayton48381312010-10-30 04:51:46 +00001193 if (log)
1194 {
1195 SBStream sstr;
1196 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001197 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Greg Claytonacdbe812012-01-30 09:04:36 +00001198 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001199 addr,
1200 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001201 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001202 sb_error.get(),
1203 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001204 (uint64_t)bytes_written);
Greg Clayton48381312010-10-30 04:51:46 +00001205 }
1206
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001207 return bytes_written;
1208}
1209
Caroline Ticedde9cff2010-09-20 05:20:02 +00001210bool
1211SBProcess::GetDescription (SBStream &description)
1212{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001213 Stream &strm = description.ref();
1214
Greg Claytonacdbe812012-01-30 09:04:36 +00001215 ProcessSP process_sp(GetSP());
1216 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001217 {
1218 char path[PATH_MAX];
1219 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001220 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001221 const char *exe_name = NULL;
1222 if (exe_module)
1223 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1224
Daniel Malead01b2952012-11-29 21:49:15 +00001225 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001226 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001227 lldb_private::StateAsCString (GetState()),
1228 GetNumThreads(),
1229 exe_name ? ", executable = " : "",
1230 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001231 }
1232 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001233 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001234
1235 return true;
1236}
Greg Clayton8f343b02010-11-04 01:54:29 +00001237
1238uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001239SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1240{
Greg Clayton5160ce52013-03-27 23:08:40 +00001241 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001242
1243 uint32_t num = 0;
1244 ProcessSP process_sp(GetSP());
1245 if (process_sp)
1246 {
1247 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1248 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001249 if (log)
1250 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1251 process_sp.get(), num);
1252 }
1253 else
1254 {
1255 sb_error.SetErrorString ("SBProcess is invalid");
1256 }
1257 return num;
1258}
1259
1260uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001261SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1262{
Greg Claytonacdbe812012-01-30 09:04:36 +00001263 ProcessSP process_sp(GetSP());
1264 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001265 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001266 Process::StopLocker stop_locker;
1267 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1268 {
1269 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1270 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1271 }
1272 else
1273 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001274 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001275 if (log)
1276 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001277 sb_error.SetErrorString("process is running");
1278 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001279 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001280 return LLDB_INVALID_IMAGE_TOKEN;
1281}
1282
1283lldb::SBError
1284SBProcess::UnloadImage (uint32_t image_token)
1285{
1286 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001287 ProcessSP process_sp(GetSP());
1288 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001289 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001290 Process::StopLocker stop_locker;
1291 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1292 {
1293 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1294 sb_error.SetError (process_sp->UnloadImage (image_token));
1295 }
1296 else
1297 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001298 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001299 if (log)
1300 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001301 sb_error.SetErrorString("process is running");
1302 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001303 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001304 else
1305 sb_error.SetErrorString("invalid process");
1306 return sb_error;
1307}
Jason Molenda8c713372013-11-05 11:00:35 +00001308
Jason Molendaa3329782014-03-29 18:54:20 +00001309lldb::SBError
1310SBProcess::SendEventData (const char *event_data)
1311{
1312 lldb::SBError sb_error;
1313 ProcessSP process_sp(GetSP());
1314 if (process_sp)
1315 {
1316 Process::StopLocker stop_locker;
1317 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1318 {
1319 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1320 sb_error.SetError (process_sp->SendEventData (event_data));
1321 }
1322 else
1323 {
1324 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1325 if (log)
1326 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", process_sp.get());
1327 sb_error.SetErrorString("process is running");
1328 }
1329 }
1330 else
1331 sb_error.SetErrorString("invalid process");
1332 return sb_error;
1333}
1334
Jason Molenda8c713372013-11-05 11:00:35 +00001335uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001336SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001337{
1338 ProcessSP process_sp(GetSP());
1339 if (process_sp && process_sp->GetSystemRuntime())
1340 {
1341 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001342 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001343 }
1344 return 0;
1345}
1346
1347const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001348SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001349{
1350 ProcessSP process_sp(GetSP());
1351 if (process_sp && process_sp->GetSystemRuntime())
1352 {
1353 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001354 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001355 if (idx < names.size())
1356 {
1357 return names[idx].AsCString();
1358 }
1359 else
1360 {
1361 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1362 if (log)
Jason Molenda95d005c2013-11-06 03:07:33 +00001363 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", process_sp.get());
Jason Molenda8c713372013-11-05 11:00:35 +00001364 }
1365 }
1366 return NULL;
1367}