blob: f2613dd08ed33471e6d9c006c6bcb33240bfcbcb [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 Claytone005f2c2010-11-06 01:53:30 +0000401 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000402
Caroline Tice7826c882010-10-26 03:11:13 +0000403 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000404 ProcessSP process_sp(GetSP());
405 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000406 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000407 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
408 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000409 }
Caroline Tice7826c882010-10-26 03:11:13 +0000410
411 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000412 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000413 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000414
415 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000416}
417
Jim Inghamefbdd222012-07-13 20:18:18 +0000418bool
419SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
420{
421 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
422
423 bool ret_val = false;
424 ProcessSP process_sp(GetSP());
425 if (process_sp)
426 {
427 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
428 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
429 }
430
431 if (log)
432 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
433 process_sp.get(), index_id, (ret_val ? "true" : "false"));
434
435 return ret_val;
436}
437
Chris Lattner24943d22010-06-08 16:52:24 +0000438SBThread
439SBProcess::GetThreadAtIndex (size_t index)
440{
Greg Claytone005f2c2010-11-06 01:53:30 +0000441 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000442
Greg Clayton90c52142012-01-30 02:53:15 +0000443 SBThread sb_thread;
444 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000445 ProcessSP process_sp(GetSP());
446 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000447 {
Greg Claytona894fe72012-04-05 16:12:35 +0000448 Process::StopLocker stop_locker;
449 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000450 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000451 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000452 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000453 }
Caroline Tice7826c882010-10-26 03:11:13 +0000454
455 if (log)
456 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000457 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000458 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000459 }
460
Greg Clayton90c52142012-01-30 02:53:15 +0000461 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000462}
463
464StateType
465SBProcess::GetState ()
466{
Caroline Tice7826c882010-10-26 03:11:13 +0000467
Caroline Tice7826c882010-10-26 03:11:13 +0000468 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000469 ProcessSP process_sp(GetSP());
470 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000471 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000472 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
473 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000474 }
Caroline Tice7826c882010-10-26 03:11:13 +0000475
Greg Claytone005f2c2010-11-06 01:53:30 +0000476 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000477 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000478 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000479 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000480 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000481
482 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000483}
484
485
486int
487SBProcess::GetExitStatus ()
488{
Greg Claytona66ba462010-10-30 04:51:46 +0000489 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000490 ProcessSP process_sp(GetSP());
491 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000492 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000493 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
494 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000495 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000496 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000497 if (log)
498 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000499 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000500
501 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000502}
503
504const char *
505SBProcess::GetExitDescription ()
506{
Greg Claytona66ba462010-10-30 04:51:46 +0000507 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000508 ProcessSP process_sp(GetSP());
509 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000510 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000511 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
512 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000513 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000514 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000515 if (log)
516 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000517 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000518 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000519}
520
521lldb::pid_t
522SBProcess::GetProcessID ()
523{
Caroline Tice7826c882010-10-26 03:11:13 +0000524 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000525 ProcessSP process_sp(GetSP());
526 if (process_sp)
527 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000528
Greg Claytone005f2c2010-11-06 01:53:30 +0000529 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000530 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000531 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000532
533 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000534}
535
Johnny Chen60a544f2011-03-01 22:56:31 +0000536ByteOrder
537SBProcess::GetByteOrder () const
538{
539 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000540 ProcessSP process_sp(GetSP());
541 if (process_sp)
542 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000543
544 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
545 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000546 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000547
548 return byteOrder;
549}
550
Chris Lattner24943d22010-06-08 16:52:24 +0000551uint32_t
552SBProcess::GetAddressByteSize () const
553{
Caroline Tice7826c882010-10-26 03:11:13 +0000554 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000555 ProcessSP process_sp(GetSP());
556 if (process_sp)
557 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000558
Greg Claytone005f2c2010-11-06 01:53:30 +0000559 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000560 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000561 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000562
563 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000564}
565
Chris Lattner24943d22010-06-08 16:52:24 +0000566SBError
567SBProcess::Continue ()
568{
Greg Claytone005f2c2010-11-06 01:53:30 +0000569 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000570
Chris Lattner24943d22010-06-08 16:52:24 +0000571 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000572 ProcessSP process_sp(GetSP());
573
574 if (log)
575 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
576
577 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000578 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000579 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000580
Greg Clayton0416bdf2012-01-30 09:04:36 +0000581 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000582 if (error.Success())
583 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000584 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000585 {
586 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000587 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
588 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000589 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000590 }
591 sb_error.SetError(error);
592 }
Chris Lattner24943d22010-06-08 16:52:24 +0000593 else
594 sb_error.SetErrorString ("SBProcess is invalid");
595
Caroline Tice7826c882010-10-26 03:11:13 +0000596 if (log)
597 {
598 SBStream sstr;
599 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000600 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000601 }
602
Chris Lattner24943d22010-06-08 16:52:24 +0000603 return sb_error;
604}
605
606
607SBError
608SBProcess::Destroy ()
609{
610 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000611 ProcessSP process_sp(GetSP());
612 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000613 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000614 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
615 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000616 }
Chris Lattner24943d22010-06-08 16:52:24 +0000617 else
618 sb_error.SetErrorString ("SBProcess is invalid");
619
Greg Claytone005f2c2010-11-06 01:53:30 +0000620 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000621 if (log)
622 {
623 SBStream sstr;
624 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000625 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000626 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000627 sb_error.get(),
628 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000629 }
630
Chris Lattner24943d22010-06-08 16:52:24 +0000631 return sb_error;
632}
633
634
635SBError
636SBProcess::Stop ()
637{
638 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000639 ProcessSP process_sp(GetSP());
640 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000641 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000642 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
643 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000644 }
Chris Lattner24943d22010-06-08 16:52:24 +0000645 else
646 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000647
Greg Claytone005f2c2010-11-06 01:53:30 +0000648 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000649 if (log)
650 {
651 SBStream sstr;
652 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000653 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000654 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000655 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000656 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000657 }
658
Chris Lattner24943d22010-06-08 16:52:24 +0000659 return sb_error;
660}
661
662SBError
663SBProcess::Kill ()
664{
665 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000666 ProcessSP process_sp(GetSP());
667 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000668 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000669 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
670 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000671 }
Chris Lattner24943d22010-06-08 16:52:24 +0000672 else
673 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000674
Greg Claytone005f2c2010-11-06 01:53:30 +0000675 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000676 if (log)
677 {
678 SBStream sstr;
679 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000680 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000681 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000682 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000683 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000684 }
685
Chris Lattner24943d22010-06-08 16:52:24 +0000686 return sb_error;
687}
688
Chris Lattner24943d22010-06-08 16:52:24 +0000689SBError
690SBProcess::Detach ()
691{
692 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000693 ProcessSP process_sp(GetSP());
694 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000695 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000696 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
697 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000698 }
Chris Lattner24943d22010-06-08 16:52:24 +0000699 else
700 sb_error.SetErrorString ("SBProcess is invalid");
701
702 return sb_error;
703}
704
705SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000706SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000707{
708 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000709 ProcessSP process_sp(GetSP());
710 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000711 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000712 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
713 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000714 }
Chris Lattner24943d22010-06-08 16:52:24 +0000715 else
716 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000717 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000718 if (log)
719 {
720 SBStream sstr;
721 sb_error.GetDescription (sstr);
722 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000723 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000724 signo,
725 sb_error.get(),
726 sstr.GetData());
727 }
Chris Lattner24943d22010-06-08 16:52:24 +0000728 return sb_error;
729}
730
Jim Ingham5d90ade2012-07-27 23:57:19 +0000731void
732SBProcess::SendAsyncInterrupt ()
733{
734 ProcessSP process_sp(GetSP());
735 if (process_sp)
736 {
737 process_sp->SendAsyncInterrupt ();
738 }
739}
740
Chris Lattner24943d22010-06-08 16:52:24 +0000741SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000742SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000743{
Greg Claytona66ba462010-10-30 04:51:46 +0000744 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000745 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000746 ProcessSP process_sp(GetSP());
747 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000748 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000749 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000750 Process::StopLocker stop_locker;
751 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
752 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000753 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000754 }
Greg Claytona66ba462010-10-30 04:51:46 +0000755
Greg Claytone005f2c2010-11-06 01:53:30 +0000756 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000757 if (log)
758 {
Greg Claytond9919d32011-12-01 23:28:38 +0000759 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000760 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000761 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000762 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000763 }
764
765 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000766}
767
Jim Inghamefbdd222012-07-13 20:18:18 +0000768SBThread
769SBProcess::GetThreadByIndexID (uint32_t index_id)
770{
771 SBThread sb_thread;
772 ThreadSP thread_sp;
773 ProcessSP process_sp(GetSP());
774 if (process_sp)
775 {
776 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
777 Process::StopLocker stop_locker;
778 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
779 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
780 sb_thread.SetThread (thread_sp);
781 }
782
783 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
784 if (log)
785 {
786 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
787 process_sp.get(),
788 index_id,
789 thread_sp.get());
790 }
791
792 return sb_thread;
793}
794
Chris Lattner24943d22010-06-08 16:52:24 +0000795StateType
796SBProcess::GetStateFromEvent (const SBEvent &event)
797{
Greg Claytone005f2c2010-11-06 01:53:30 +0000798 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000799
Caroline Tice7826c882010-10-26 03:11:13 +0000800 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
801
802 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000803 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000804 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000805
806 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000807}
808
Chris Lattner24943d22010-06-08 16:52:24 +0000809bool
810SBProcess::GetRestartedFromEvent (const SBEvent &event)
811{
Greg Clayton63094e02010-06-23 01:19:29 +0000812 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000813}
814
815SBProcess
816SBProcess::GetProcessFromEvent (const SBEvent &event)
817{
Greg Clayton63094e02010-06-23 01:19:29 +0000818 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000819 return process;
820}
821
Jim Ingham28e23862012-02-08 05:23:15 +0000822bool
823SBProcess::EventIsProcessEvent (const SBEvent &event)
824{
Jim Ingham5a15e692012-02-16 06:50:00 +0000825 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000826}
Chris Lattner24943d22010-06-08 16:52:24 +0000827
828SBBroadcaster
829SBProcess::GetBroadcaster () const
830{
Greg Claytone005f2c2010-11-06 01:53:30 +0000831 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000832
Greg Clayton0416bdf2012-01-30 09:04:36 +0000833 ProcessSP process_sp(GetSP());
834
835 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000836
837 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000838 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000839 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000840
Chris Lattner24943d22010-06-08 16:52:24 +0000841 return broadcaster;
842}
843
Jim Ingham5a15e692012-02-16 06:50:00 +0000844const char *
845SBProcess::GetBroadcasterClass ()
846{
847 return Process::GetStaticBroadcasterClass().AsCString();
848}
849
Chris Lattner24943d22010-06-08 16:52:24 +0000850size_t
851SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
852{
Greg Claytone005f2c2010-11-06 01:53:30 +0000853 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000854
Chris Lattner24943d22010-06-08 16:52:24 +0000855 size_t bytes_read = 0;
856
Greg Clayton0416bdf2012-01-30 09:04:36 +0000857 ProcessSP process_sp(GetSP());
858
Greg Claytona66ba462010-10-30 04:51:46 +0000859 if (log)
860 {
Greg Clayton851e30e2012-09-18 18:04:04 +0000861 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000862 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000863 addr,
864 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000865 (uint64_t)dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000866 sb_error.get());
867 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000868
869 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000870 {
Greg Claytona894fe72012-04-05 16:12:35 +0000871 Process::StopLocker stop_locker;
872 if (stop_locker.TryLock(&process_sp->GetRunLock()))
873 {
874 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
875 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
876 }
877 else
878 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000879 if (log)
880 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000881 sb_error.SetErrorString("process is running");
882 }
Chris Lattner24943d22010-06-08 16:52:24 +0000883 }
884 else
885 {
886 sb_error.SetErrorString ("SBProcess is invalid");
887 }
888
Caroline Tice7826c882010-10-26 03:11:13 +0000889 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000890 {
891 SBStream sstr;
892 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +0000893 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000894 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000895 addr,
896 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000897 (uint64_t)dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000898 sb_error.get(),
899 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +0000900 (uint64_t)bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000901 }
Caroline Tice7826c882010-10-26 03:11:13 +0000902
Chris Lattner24943d22010-06-08 16:52:24 +0000903 return bytes_read;
904}
905
906size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000907SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
908{
909 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000910 ProcessSP process_sp(GetSP());
911 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000912 {
Greg Claytona894fe72012-04-05 16:12:35 +0000913 Process::StopLocker stop_locker;
914 if (stop_locker.TryLock(&process_sp->GetRunLock()))
915 {
916 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
917 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
918 }
919 else
920 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000921 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
922 if (log)
923 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000924 sb_error.SetErrorString("process is running");
925 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000926 }
927 else
928 {
929 sb_error.SetErrorString ("SBProcess is invalid");
930 }
931 return bytes_read;
932}
933
934uint64_t
935SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
936{
Greg Claytona894fe72012-04-05 16:12:35 +0000937 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000938 ProcessSP process_sp(GetSP());
939 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000940 {
Greg Claytona894fe72012-04-05 16:12:35 +0000941 Process::StopLocker stop_locker;
942 if (stop_locker.TryLock(&process_sp->GetRunLock()))
943 {
944 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
945 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
946 }
947 else
948 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000949 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
950 if (log)
951 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000952 sb_error.SetErrorString("process is running");
953 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000954 }
955 else
956 {
957 sb_error.SetErrorString ("SBProcess is invalid");
958 }
Greg Claytona894fe72012-04-05 16:12:35 +0000959 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000960}
961
962lldb::addr_t
963SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
964{
965 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000966 ProcessSP process_sp(GetSP());
967 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000968 {
Greg Claytona894fe72012-04-05 16:12:35 +0000969 Process::StopLocker stop_locker;
970 if (stop_locker.TryLock(&process_sp->GetRunLock()))
971 {
972 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
973 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
974 }
975 else
976 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000977 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
978 if (log)
979 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000980 sb_error.SetErrorString("process is running");
981 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000982 }
983 else
984 {
985 sb_error.SetErrorString ("SBProcess is invalid");
986 }
987 return ptr;
988}
989
990size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000991SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
992{
993 size_t bytes_written = 0;
994
Greg Claytone005f2c2010-11-06 01:53:30 +0000995 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000996
997 ProcessSP process_sp(GetSP());
998
Greg Claytona66ba462010-10-30 04:51:46 +0000999 if (log)
1000 {
Greg Clayton851e30e2012-09-18 18:04:04 +00001001 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001002 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001003 addr,
1004 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001005 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001006 sb_error.get());
1007 }
1008
Greg Clayton0416bdf2012-01-30 09:04:36 +00001009 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001010 {
Greg Claytona894fe72012-04-05 16:12:35 +00001011 Process::StopLocker stop_locker;
1012 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1013 {
1014 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1015 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1016 }
1017 else
1018 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001019 if (log)
1020 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001021 sb_error.SetErrorString("process is running");
1022 }
Chris Lattner24943d22010-06-08 16:52:24 +00001023 }
1024
Greg Claytona66ba462010-10-30 04:51:46 +00001025 if (log)
1026 {
1027 SBStream sstr;
1028 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +00001029 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001030 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001031 addr,
1032 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001033 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001034 sb_error.get(),
1035 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +00001036 (uint64_t)bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001037 }
1038
Chris Lattner24943d22010-06-08 16:52:24 +00001039 return bytes_written;
1040}
1041
Caroline Tice98f930f2010-09-20 05:20:02 +00001042bool
1043SBProcess::GetDescription (SBStream &description)
1044{
Greg Clayton96154be2011-11-13 06:57:31 +00001045 Stream &strm = description.ref();
1046
Greg Clayton0416bdf2012-01-30 09:04:36 +00001047 ProcessSP process_sp(GetSP());
1048 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001049 {
1050 char path[PATH_MAX];
1051 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001052 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001053 const char *exe_name = NULL;
1054 if (exe_module)
1055 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1056
Greg Clayton96154be2011-11-13 06:57:31 +00001057 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001058 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001059 lldb_private::StateAsCString (GetState()),
1060 GetNumThreads(),
1061 exe_name ? ", executable = " : "",
1062 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001063 }
1064 else
Greg Clayton96154be2011-11-13 06:57:31 +00001065 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001066
1067 return true;
1068}
Greg Clayton0baa3942010-11-04 01:54:29 +00001069
1070uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001071SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1072{
1073 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1074
1075 uint32_t num = 0;
1076 ProcessSP process_sp(GetSP());
1077 if (process_sp)
1078 {
1079 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1080 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1081 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1082 if (log)
1083 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1084 process_sp.get(), num);
1085 }
1086 else
1087 {
1088 sb_error.SetErrorString ("SBProcess is invalid");
1089 }
1090 return num;
1091}
1092
1093uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001094SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1095{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001096 ProcessSP process_sp(GetSP());
1097 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001098 {
Greg Claytona894fe72012-04-05 16:12:35 +00001099 Process::StopLocker stop_locker;
1100 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1101 {
1102 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1103 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1104 }
1105 else
1106 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001107 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1108 if (log)
1109 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001110 sb_error.SetErrorString("process is running");
1111 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001112 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001113 return LLDB_INVALID_IMAGE_TOKEN;
1114}
1115
1116lldb::SBError
1117SBProcess::UnloadImage (uint32_t image_token)
1118{
1119 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001120 ProcessSP process_sp(GetSP());
1121 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001122 {
Greg Claytona894fe72012-04-05 16:12:35 +00001123 Process::StopLocker stop_locker;
1124 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1125 {
1126 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1127 sb_error.SetError (process_sp->UnloadImage (image_token));
1128 }
1129 else
1130 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001131 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1132 if (log)
1133 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001134 sb_error.SetErrorString("process is running");
1135 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001136 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001137 else
1138 sb_error.SetErrorString("invalid process");
1139 return sb_error;
1140}