blob: e10787482178c950efe40e54b00787caa1ad99c3 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-defines.h"
13#include "lldb/lldb-types.h"
14
Jim Ingham84cdc152010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000016#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000017#include "lldb/Core/Log.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000018#include "lldb/Core/Module.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/State.h"
20#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000024#include "lldb/Target/Target.h"
25#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026
27// Project includes
28
Eli Friedman7a62c8b2010-06-09 07:44:37 +000029#include "lldb/API/SBBroadcaster.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000030#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000031#include "lldb/API/SBDebugger.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000032#include "lldb/API/SBEvent.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000033#include "lldb/API/SBFileSpec.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000034#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000035#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037
38using namespace lldb;
39using namespace lldb_private;
40
41
Chris Lattner24943d22010-06-08 16:52:24 +000042SBProcess::SBProcess () :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000043 m_opaque_wp()
Chris Lattner24943d22010-06-08 16:52:24 +000044{
45}
46
47
48//----------------------------------------------------------------------
49// SBProcess constructor
50//----------------------------------------------------------------------
51
52SBProcess::SBProcess (const SBProcess& rhs) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000053 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner24943d22010-06-08 16:52:24 +000054{
55}
56
57
58SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000059 m_opaque_wp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000060{
61}
62
Greg Clayton538eb822010-11-05 23:17:00 +000063const SBProcess&
64SBProcess::operator = (const SBProcess& rhs)
65{
66 if (this != &rhs)
Greg Claytonbcaf99a2012-07-12 20:32:19 +000067 m_opaque_wp = rhs.m_opaque_wp;
Greg Clayton538eb822010-11-05 23:17:00 +000068 return *this;
69}
70
Chris Lattner24943d22010-06-08 16:52:24 +000071//----------------------------------------------------------------------
72// Destructor
73//----------------------------------------------------------------------
74SBProcess::~SBProcess()
75{
76}
77
Jim Ingham5a15e692012-02-16 06:50:00 +000078const char *
79SBProcess::GetBroadcasterClassName ()
80{
81 return Process::GetStaticBroadcasterClass().AsCString();
82}
83
Greg Clayton334d33a2012-01-30 07:41:31 +000084lldb::ProcessSP
85SBProcess::GetSP() const
86{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000087 return m_opaque_wp.lock();
Greg Clayton334d33a2012-01-30 07:41:31 +000088}
89
Chris Lattner24943d22010-06-08 16:52:24 +000090void
Greg Clayton334d33a2012-01-30 07:41:31 +000091SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000092{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000093 m_opaque_wp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000094}
95
96void
97SBProcess::Clear ()
98{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000099 m_opaque_wp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000100}
101
102
103bool
104SBProcess::IsValid() const
105{
Jim Inghamd0bdddf2012-08-22 21:34:33 +0000106 ProcessSP process_sp(m_opaque_wp.lock());
107 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner24943d22010-06-08 16:52:24 +0000108}
109
James McIlree38093402011-03-04 00:31:13 +0000110bool
111SBProcess::RemoteLaunch (char const **argv,
112 char const **envp,
113 const char *stdin_path,
114 const char *stdout_path,
115 const char *stderr_path,
116 const char *working_directory,
117 uint32_t launch_flags,
118 bool stop_at_entry,
119 lldb::SBError& error)
120{
121 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
122 if (log) {
123 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 Claytonbcaf99a2012-07-12 20:32:19 +0000124 m_opaque_wp.lock().get(),
James McIlree38093402011-03-04 00:31:13 +0000125 argv,
126 envp,
127 stdin_path ? stdin_path : "NULL",
128 stdout_path ? stdout_path : "NULL",
129 stderr_path ? stderr_path : "NULL",
130 working_directory ? working_directory : "NULL",
131 launch_flags,
132 stop_at_entry,
133 error.get());
134 }
135
Greg Clayton0416bdf2012-01-30 09:04:36 +0000136 ProcessSP process_sp(GetSP());
137 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000138 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000139 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
140 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000141 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000142 if (stop_at_entry)
143 launch_flags |= eLaunchFlagStopAtEntry;
144 ProcessLaunchInfo launch_info (stdin_path,
145 stdout_path,
146 stderr_path,
147 working_directory,
148 launch_flags);
149 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
150 if (exe_module)
151 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
152 if (argv)
153 launch_info.GetArguments().AppendArguments (argv);
154 if (envp)
155 launch_info.GetEnvironmentEntries ().SetArguments (envp);
156 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000157 }
158 else
159 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000160 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree38093402011-03-04 00:31:13 +0000161 }
162 }
163 else
164 {
165 error.SetErrorString ("unable to attach pid");
166 }
167
168 if (log) {
169 SBStream sstr;
170 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000171 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000172 }
173
174 return error.Success();
175}
176
177bool
178SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
179{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000180 ProcessSP process_sp(GetSP());
181 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000182 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000183 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
184 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000185 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000186 ProcessAttachInfo attach_info;
187 attach_info.SetProcessID (pid);
188 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000189 }
190 else
191 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000192 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree38093402011-03-04 00:31:13 +0000193 }
194 }
195 else
196 {
197 error.SetErrorString ("unable to attach pid");
198 }
199
200 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
201 if (log) {
202 SBStream sstr;
203 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000204 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000205 }
206
207 return error.Success();
208}
209
Chris Lattner24943d22010-06-08 16:52:24 +0000210
211uint32_t
212SBProcess::GetNumThreads ()
213{
Greg Claytone005f2c2010-11-06 01:53:30 +0000214 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000215
Caroline Tice7826c882010-10-26 03:11:13 +0000216 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000217 ProcessSP process_sp(GetSP());
218 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000219 {
Greg Claytona894fe72012-04-05 16:12:35 +0000220 Process::StopLocker stop_locker;
221
222 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000223 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000224 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000225 }
Caroline Tice7826c882010-10-26 03:11:13 +0000226
227 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000228 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000229
230 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000231}
232
233SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000234SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000235{
Greg Claytone005f2c2010-11-06 01:53:30 +0000236 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000237
Chris Lattner24943d22010-06-08 16:52:24 +0000238 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000239 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000240 ProcessSP process_sp(GetSP());
241 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000242 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000243 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
244 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000245 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000246 }
Caroline Tice7826c882010-10-26 03:11:13 +0000247
248 if (log)
249 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000250 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000251 }
252
Chris Lattner24943d22010-06-08 16:52:24 +0000253 return sb_thread;
254}
255
256SBTarget
257SBProcess::GetTarget() const
258{
Greg Claytone005f2c2010-11-06 01:53:30 +0000259 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000260
Chris Lattner24943d22010-06-08 16:52:24 +0000261 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000262 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000263 ProcessSP process_sp(GetSP());
264 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000265 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000266 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000267 sb_target.SetSP (target_sp);
268 }
Caroline Tice7826c882010-10-26 03:11:13 +0000269
270 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000271 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000272
Chris Lattner24943d22010-06-08 16:52:24 +0000273 return sb_target;
274}
275
276
277size_t
278SBProcess::PutSTDIN (const char *src, size_t src_len)
279{
Greg Claytone005f2c2010-11-06 01:53:30 +0000280 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000281
Caroline Tice7826c882010-10-26 03:11:13 +0000282 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000283 ProcessSP process_sp(GetSP());
284 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000285 {
286 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000287 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000288 }
Caroline Tice7826c882010-10-26 03:11:13 +0000289
290 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000291 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000292 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000293 src,
294 (uint32_t) src_len,
295 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000296
297 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000298}
299
300size_t
301SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
302{
Greg Clayton49ce6822010-10-31 03:01:06 +0000303 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000304 ProcessSP process_sp(GetSP());
305 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000306 {
307 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000308 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000309 }
Caroline Tice7826c882010-10-26 03:11:13 +0000310
Greg Claytone005f2c2010-11-06 01:53:30 +0000311 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000312 if (log)
Greg Clayton851e30e2012-09-18 18:04:04 +0000313 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu",
314 process_sp.get(),
315 (int) bytes_read,
316 dst,
317 (uint64_t)dst_len,
318 (uint64_t)bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000319
Greg Clayton49ce6822010-10-31 03:01:06 +0000320 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000321}
322
323size_t
324SBProcess::GetSTDERR (char *dst, size_t dst_len) const
325{
Greg Clayton49ce6822010-10-31 03:01:06 +0000326 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000327 ProcessSP process_sp(GetSP());
328 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000329 {
330 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000331 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000332 }
Caroline Tice7826c882010-10-26 03:11:13 +0000333
Greg Claytone005f2c2010-11-06 01:53:30 +0000334 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000335 if (log)
Greg Clayton851e30e2012-09-18 18:04:04 +0000336 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu",
337 process_sp.get(),
338 (int) bytes_read,
339 dst,
340 (uint64_t)dst_len,
341 (uint64_t)bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000342
Greg Clayton49ce6822010-10-31 03:01:06 +0000343 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000344}
345
346void
Jim Inghamc8332952010-08-26 21:32:51 +0000347SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000348{
349 if (out == NULL)
350 return;
351
Greg Clayton0416bdf2012-01-30 09:04:36 +0000352 ProcessSP process_sp(GetSP());
353 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000354 {
355 const StateType event_state = SBProcess::GetStateFromEvent (event);
356 char message[1024];
357 int message_len = ::snprintf (message,
358 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000359 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000360 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000361 SBDebugger::StateAsCString (event_state));
362
363 if (message_len > 0)
364 ::fwrite (message, 1, message_len, out);
365 }
366}
367
368void
Jim Inghamc8332952010-08-26 21:32:51 +0000369SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000370{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000371 ProcessSP process_sp(GetSP());
372 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000373 {
374 const StateType event_state = SBProcess::GetStateFromEvent (event);
375 char message[1024];
376 ::snprintf (message,
377 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000378 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000379 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000380 SBDebugger::StateAsCString (event_state));
381
382 result.AppendMessage (message);
383 }
384}
385
386bool
Jim Inghamc8332952010-08-26 21:32:51 +0000387SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000388{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000389 ProcessSP process_sp(GetSP());
390 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000391 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000392 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
393 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000394 }
Chris Lattner24943d22010-06-08 16:52:24 +0000395 return false;
396}
397
398bool
Jim Inghamc8332952010-08-26 21:32:51 +0000399SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000400{
Greg Clayton82560f22012-10-12 23:32:11 +0000401 return SetSelectedThreadByID ((lldb::tid_t)tid);
402}
403
404bool
405SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
406{
Greg Claytone005f2c2010-11-06 01:53:30 +0000407 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000408
Caroline Tice7826c882010-10-26 03:11:13 +0000409 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000410 ProcessSP process_sp(GetSP());
411 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000412 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000413 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
414 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000415 }
Caroline Tice7826c882010-10-26 03:11:13 +0000416
417 if (log)
Greg Clayton82560f22012-10-12 23:32:11 +0000418 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4llx) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000419 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000420
421 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000422}
423
Jim Inghamefbdd222012-07-13 20:18:18 +0000424bool
425SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
426{
427 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
428
429 bool ret_val = false;
430 ProcessSP process_sp(GetSP());
431 if (process_sp)
432 {
433 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
434 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
435 }
436
437 if (log)
438 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
439 process_sp.get(), index_id, (ret_val ? "true" : "false"));
440
441 return ret_val;
442}
443
Chris Lattner24943d22010-06-08 16:52:24 +0000444SBThread
445SBProcess::GetThreadAtIndex (size_t index)
446{
Greg Claytone005f2c2010-11-06 01:53:30 +0000447 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000448
Greg Clayton90c52142012-01-30 02:53:15 +0000449 SBThread sb_thread;
450 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000451 ProcessSP process_sp(GetSP());
452 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000453 {
Greg Claytona894fe72012-04-05 16:12:35 +0000454 Process::StopLocker stop_locker;
455 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000456 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000457 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000458 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000459 }
Caroline Tice7826c882010-10-26 03:11:13 +0000460
461 if (log)
462 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000463 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000464 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000465 }
466
Greg Clayton90c52142012-01-30 02:53:15 +0000467 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000468}
469
470StateType
471SBProcess::GetState ()
472{
Caroline Tice7826c882010-10-26 03:11:13 +0000473
Caroline Tice7826c882010-10-26 03:11:13 +0000474 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000475 ProcessSP process_sp(GetSP());
476 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000477 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000478 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
479 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000480 }
Caroline Tice7826c882010-10-26 03:11:13 +0000481
Greg Claytone005f2c2010-11-06 01:53:30 +0000482 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000483 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000484 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000485 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000486 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000487
488 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000489}
490
491
492int
493SBProcess::GetExitStatus ()
494{
Greg Claytona66ba462010-10-30 04:51:46 +0000495 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000496 ProcessSP process_sp(GetSP());
497 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000498 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000499 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
500 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000501 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000502 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000503 if (log)
504 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000505 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000506
507 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000508}
509
510const char *
511SBProcess::GetExitDescription ()
512{
Greg Claytona66ba462010-10-30 04:51:46 +0000513 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000514 ProcessSP process_sp(GetSP());
515 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000516 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000517 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
518 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000519 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000520 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000521 if (log)
522 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000523 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000524 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000525}
526
527lldb::pid_t
528SBProcess::GetProcessID ()
529{
Caroline Tice7826c882010-10-26 03:11:13 +0000530 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000531 ProcessSP process_sp(GetSP());
532 if (process_sp)
533 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000534
Greg Claytone005f2c2010-11-06 01:53:30 +0000535 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000536 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000537 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000538
539 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000540}
541
Johnny Chen60a544f2011-03-01 22:56:31 +0000542ByteOrder
543SBProcess::GetByteOrder () const
544{
545 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000546 ProcessSP process_sp(GetSP());
547 if (process_sp)
548 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000549
550 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
551 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000552 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000553
554 return byteOrder;
555}
556
Chris Lattner24943d22010-06-08 16:52:24 +0000557uint32_t
558SBProcess::GetAddressByteSize () const
559{
Caroline Tice7826c882010-10-26 03:11:13 +0000560 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000561 ProcessSP process_sp(GetSP());
562 if (process_sp)
563 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000564
Greg Claytone005f2c2010-11-06 01:53:30 +0000565 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000566 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000567 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000568
569 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000570}
571
Chris Lattner24943d22010-06-08 16:52:24 +0000572SBError
573SBProcess::Continue ()
574{
Greg Claytone005f2c2010-11-06 01:53:30 +0000575 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000576
Chris Lattner24943d22010-06-08 16:52:24 +0000577 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000578 ProcessSP process_sp(GetSP());
579
580 if (log)
581 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
582
583 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000584 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000585 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000586
Greg Clayton0416bdf2012-01-30 09:04:36 +0000587 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000588 if (error.Success())
589 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000590 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000591 {
592 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000593 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
594 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000595 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000596 }
597 sb_error.SetError(error);
598 }
Chris Lattner24943d22010-06-08 16:52:24 +0000599 else
600 sb_error.SetErrorString ("SBProcess is invalid");
601
Caroline Tice7826c882010-10-26 03:11:13 +0000602 if (log)
603 {
604 SBStream sstr;
605 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000606 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000607 }
608
Chris Lattner24943d22010-06-08 16:52:24 +0000609 return sb_error;
610}
611
612
613SBError
614SBProcess::Destroy ()
615{
616 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000617 ProcessSP process_sp(GetSP());
618 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000619 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000620 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
621 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000622 }
Chris Lattner24943d22010-06-08 16:52:24 +0000623 else
624 sb_error.SetErrorString ("SBProcess is invalid");
625
Greg Claytone005f2c2010-11-06 01:53:30 +0000626 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000627 if (log)
628 {
629 SBStream sstr;
630 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000631 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000632 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000633 sb_error.get(),
634 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000635 }
636
Chris Lattner24943d22010-06-08 16:52:24 +0000637 return sb_error;
638}
639
640
641SBError
642SBProcess::Stop ()
643{
644 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000645 ProcessSP process_sp(GetSP());
646 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000647 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000648 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
649 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000650 }
Chris Lattner24943d22010-06-08 16:52:24 +0000651 else
652 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000653
Greg Claytone005f2c2010-11-06 01:53:30 +0000654 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000655 if (log)
656 {
657 SBStream sstr;
658 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000659 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000660 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000661 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000662 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000663 }
664
Chris Lattner24943d22010-06-08 16:52:24 +0000665 return sb_error;
666}
667
668SBError
669SBProcess::Kill ()
670{
671 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000672 ProcessSP process_sp(GetSP());
673 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000674 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000675 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
676 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000677 }
Chris Lattner24943d22010-06-08 16:52:24 +0000678 else
679 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000680
Greg Claytone005f2c2010-11-06 01:53:30 +0000681 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000682 if (log)
683 {
684 SBStream sstr;
685 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000686 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000687 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000688 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000689 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000690 }
691
Chris Lattner24943d22010-06-08 16:52:24 +0000692 return sb_error;
693}
694
Chris Lattner24943d22010-06-08 16:52:24 +0000695SBError
696SBProcess::Detach ()
697{
698 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000699 ProcessSP process_sp(GetSP());
700 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000701 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000702 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
703 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000704 }
Chris Lattner24943d22010-06-08 16:52:24 +0000705 else
706 sb_error.SetErrorString ("SBProcess is invalid");
707
708 return sb_error;
709}
710
711SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000712SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000713{
714 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000715 ProcessSP process_sp(GetSP());
716 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000717 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000718 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
719 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000720 }
Chris Lattner24943d22010-06-08 16:52:24 +0000721 else
722 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000723 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000724 if (log)
725 {
726 SBStream sstr;
727 sb_error.GetDescription (sstr);
728 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000729 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000730 signo,
731 sb_error.get(),
732 sstr.GetData());
733 }
Chris Lattner24943d22010-06-08 16:52:24 +0000734 return sb_error;
735}
736
Jim Ingham5d90ade2012-07-27 23:57:19 +0000737void
738SBProcess::SendAsyncInterrupt ()
739{
740 ProcessSP process_sp(GetSP());
741 if (process_sp)
742 {
743 process_sp->SendAsyncInterrupt ();
744 }
745}
746
Chris Lattner24943d22010-06-08 16:52:24 +0000747SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000748SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000749{
Greg Claytona66ba462010-10-30 04:51:46 +0000750 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000751 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000752 ProcessSP process_sp(GetSP());
753 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000754 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000755 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000756 Process::StopLocker stop_locker;
757 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
758 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000759 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000760 }
Greg Claytona66ba462010-10-30 04:51:46 +0000761
Greg Claytone005f2c2010-11-06 01:53:30 +0000762 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000763 if (log)
764 {
Greg Claytond9919d32011-12-01 23:28:38 +0000765 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000766 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000767 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000768 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000769 }
770
771 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000772}
773
Jim Inghamefbdd222012-07-13 20:18:18 +0000774SBThread
775SBProcess::GetThreadByIndexID (uint32_t index_id)
776{
777 SBThread sb_thread;
778 ThreadSP thread_sp;
779 ProcessSP process_sp(GetSP());
780 if (process_sp)
781 {
782 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
783 Process::StopLocker stop_locker;
784 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
785 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
786 sb_thread.SetThread (thread_sp);
787 }
788
789 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
790 if (log)
791 {
792 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
793 process_sp.get(),
794 index_id,
795 thread_sp.get());
796 }
797
798 return sb_thread;
799}
800
Chris Lattner24943d22010-06-08 16:52:24 +0000801StateType
802SBProcess::GetStateFromEvent (const SBEvent &event)
803{
Greg Claytone005f2c2010-11-06 01:53:30 +0000804 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000805
Caroline Tice7826c882010-10-26 03:11:13 +0000806 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
807
808 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000809 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000810 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000811
812 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000813}
814
Chris Lattner24943d22010-06-08 16:52:24 +0000815bool
816SBProcess::GetRestartedFromEvent (const SBEvent &event)
817{
Greg Clayton63094e02010-06-23 01:19:29 +0000818 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000819}
820
821SBProcess
822SBProcess::GetProcessFromEvent (const SBEvent &event)
823{
Greg Clayton63094e02010-06-23 01:19:29 +0000824 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000825 return process;
826}
827
Jim Ingham28e23862012-02-08 05:23:15 +0000828bool
829SBProcess::EventIsProcessEvent (const SBEvent &event)
830{
Jim Ingham5a15e692012-02-16 06:50:00 +0000831 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000832}
Chris Lattner24943d22010-06-08 16:52:24 +0000833
834SBBroadcaster
835SBProcess::GetBroadcaster () const
836{
Greg Claytone005f2c2010-11-06 01:53:30 +0000837 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000838
Greg Clayton0416bdf2012-01-30 09:04:36 +0000839 ProcessSP process_sp(GetSP());
840
841 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000842
843 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000844 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000845 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000846
Chris Lattner24943d22010-06-08 16:52:24 +0000847 return broadcaster;
848}
849
Jim Ingham5a15e692012-02-16 06:50:00 +0000850const char *
851SBProcess::GetBroadcasterClass ()
852{
853 return Process::GetStaticBroadcasterClass().AsCString();
854}
855
Chris Lattner24943d22010-06-08 16:52:24 +0000856size_t
857SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
858{
Greg Claytone005f2c2010-11-06 01:53:30 +0000859 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000860
Chris Lattner24943d22010-06-08 16:52:24 +0000861 size_t bytes_read = 0;
862
Greg Clayton0416bdf2012-01-30 09:04:36 +0000863 ProcessSP process_sp(GetSP());
864
Greg Claytona66ba462010-10-30 04:51:46 +0000865 if (log)
866 {
Greg Clayton851e30e2012-09-18 18:04:04 +0000867 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000868 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000869 addr,
870 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000871 (uint64_t)dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000872 sb_error.get());
873 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000874
875 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000876 {
Greg Claytona894fe72012-04-05 16:12:35 +0000877 Process::StopLocker stop_locker;
878 if (stop_locker.TryLock(&process_sp->GetRunLock()))
879 {
880 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
881 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
882 }
883 else
884 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000885 if (log)
886 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000887 sb_error.SetErrorString("process is running");
888 }
Chris Lattner24943d22010-06-08 16:52:24 +0000889 }
890 else
891 {
892 sb_error.SetErrorString ("SBProcess is invalid");
893 }
894
Caroline Tice7826c882010-10-26 03:11:13 +0000895 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000896 {
897 SBStream sstr;
898 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +0000899 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000900 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000901 addr,
902 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000903 (uint64_t)dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000904 sb_error.get(),
905 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +0000906 (uint64_t)bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000907 }
Caroline Tice7826c882010-10-26 03:11:13 +0000908
Chris Lattner24943d22010-06-08 16:52:24 +0000909 return bytes_read;
910}
911
912size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000913SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
914{
915 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000916 ProcessSP process_sp(GetSP());
917 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000918 {
Greg Claytona894fe72012-04-05 16:12:35 +0000919 Process::StopLocker stop_locker;
920 if (stop_locker.TryLock(&process_sp->GetRunLock()))
921 {
922 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
923 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
924 }
925 else
926 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000927 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
928 if (log)
929 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000930 sb_error.SetErrorString("process is running");
931 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000932 }
933 else
934 {
935 sb_error.SetErrorString ("SBProcess is invalid");
936 }
937 return bytes_read;
938}
939
940uint64_t
941SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
942{
Greg Claytona894fe72012-04-05 16:12:35 +0000943 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000944 ProcessSP process_sp(GetSP());
945 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000946 {
Greg Claytona894fe72012-04-05 16:12:35 +0000947 Process::StopLocker stop_locker;
948 if (stop_locker.TryLock(&process_sp->GetRunLock()))
949 {
950 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
951 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
952 }
953 else
954 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000955 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
956 if (log)
957 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000958 sb_error.SetErrorString("process is running");
959 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000960 }
961 else
962 {
963 sb_error.SetErrorString ("SBProcess is invalid");
964 }
Greg Claytona894fe72012-04-05 16:12:35 +0000965 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000966}
967
968lldb::addr_t
969SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
970{
971 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000972 ProcessSP process_sp(GetSP());
973 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000974 {
Greg Claytona894fe72012-04-05 16:12:35 +0000975 Process::StopLocker stop_locker;
976 if (stop_locker.TryLock(&process_sp->GetRunLock()))
977 {
978 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
979 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
980 }
981 else
982 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000983 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
984 if (log)
985 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000986 sb_error.SetErrorString("process is running");
987 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000988 }
989 else
990 {
991 sb_error.SetErrorString ("SBProcess is invalid");
992 }
993 return ptr;
994}
995
996size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000997SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
998{
999 size_t bytes_written = 0;
1000
Greg Claytone005f2c2010-11-06 01:53:30 +00001001 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001002
1003 ProcessSP process_sp(GetSP());
1004
Greg Claytona66ba462010-10-30 04:51:46 +00001005 if (log)
1006 {
Greg Clayton851e30e2012-09-18 18:04:04 +00001007 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001008 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001009 addr,
1010 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001011 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001012 sb_error.get());
1013 }
1014
Greg Clayton0416bdf2012-01-30 09:04:36 +00001015 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001016 {
Greg Claytona894fe72012-04-05 16:12:35 +00001017 Process::StopLocker stop_locker;
1018 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1019 {
1020 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1021 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1022 }
1023 else
1024 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001025 if (log)
1026 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001027 sb_error.SetErrorString("process is running");
1028 }
Chris Lattner24943d22010-06-08 16:52:24 +00001029 }
1030
Greg Claytona66ba462010-10-30 04:51:46 +00001031 if (log)
1032 {
1033 SBStream sstr;
1034 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +00001035 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001036 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001037 addr,
1038 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001039 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001040 sb_error.get(),
1041 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +00001042 (uint64_t)bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001043 }
1044
Chris Lattner24943d22010-06-08 16:52:24 +00001045 return bytes_written;
1046}
1047
Caroline Tice98f930f2010-09-20 05:20:02 +00001048bool
1049SBProcess::GetDescription (SBStream &description)
1050{
Greg Clayton96154be2011-11-13 06:57:31 +00001051 Stream &strm = description.ref();
1052
Greg Clayton0416bdf2012-01-30 09:04:36 +00001053 ProcessSP process_sp(GetSP());
1054 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001055 {
1056 char path[PATH_MAX];
1057 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001058 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001059 const char *exe_name = NULL;
1060 if (exe_module)
1061 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1062
Greg Clayton96154be2011-11-13 06:57:31 +00001063 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001064 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001065 lldb_private::StateAsCString (GetState()),
1066 GetNumThreads(),
1067 exe_name ? ", executable = " : "",
1068 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001069 }
1070 else
Greg Clayton96154be2011-11-13 06:57:31 +00001071 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001072
1073 return true;
1074}
Greg Clayton0baa3942010-11-04 01:54:29 +00001075
1076uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001077SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1078{
1079 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1080
1081 uint32_t num = 0;
1082 ProcessSP process_sp(GetSP());
1083 if (process_sp)
1084 {
1085 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1086 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chen191343e2012-05-23 22:34:34 +00001087 if (log)
1088 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1089 process_sp.get(), num);
1090 }
1091 else
1092 {
1093 sb_error.SetErrorString ("SBProcess is invalid");
1094 }
1095 return num;
1096}
1097
1098uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001099SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1100{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001101 ProcessSP process_sp(GetSP());
1102 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001103 {
Greg Claytona894fe72012-04-05 16:12:35 +00001104 Process::StopLocker stop_locker;
1105 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1106 {
1107 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1108 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1109 }
1110 else
1111 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001112 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1113 if (log)
1114 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001115 sb_error.SetErrorString("process is running");
1116 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001117 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001118 return LLDB_INVALID_IMAGE_TOKEN;
1119}
1120
1121lldb::SBError
1122SBProcess::UnloadImage (uint32_t image_token)
1123{
1124 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001125 ProcessSP process_sp(GetSP());
1126 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001127 {
Greg Claytona894fe72012-04-05 16:12:35 +00001128 Process::StopLocker stop_locker;
1129 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1130 {
1131 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1132 sb_error.SetError (process_sp->UnloadImage (image_token));
1133 }
1134 else
1135 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001136 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1137 if (log)
1138 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001139 sb_error.SetErrorString("process is running");
1140 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001141 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001142 else
1143 sb_error.SetErrorString("invalid process");
1144 return sb_error;
1145}