blob: 129f887108d13e9fed8f551bb41d06d3eb503dc2 [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"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Core/State.h"
19#include "lldb/Core/Stream.h"
20#include "lldb/Core/StreamFile.h"
21#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000023#include "lldb/Target/Target.h"
24#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025
26// Project includes
27
Eli Friedman7a62c8b2010-06-09 07:44:37 +000028#include "lldb/API/SBBroadcaster.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000029#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000030#include "lldb/API/SBDebugger.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000031#include "lldb/API/SBEvent.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000032#include "lldb/API/SBFileSpec.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000033#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000034#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000035#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036
37using namespace lldb;
38using namespace lldb_private;
39
40
Chris Lattner24943d22010-06-08 16:52:24 +000041SBProcess::SBProcess () :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000042 m_opaque_wp()
Chris Lattner24943d22010-06-08 16:52:24 +000043{
44}
45
46
47//----------------------------------------------------------------------
48// SBProcess constructor
49//----------------------------------------------------------------------
50
51SBProcess::SBProcess (const SBProcess& rhs) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000052 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner24943d22010-06-08 16:52:24 +000053{
54}
55
56
57SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000058 m_opaque_wp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60}
61
Greg Clayton538eb822010-11-05 23:17:00 +000062const SBProcess&
63SBProcess::operator = (const SBProcess& rhs)
64{
65 if (this != &rhs)
Greg Claytonbcaf99a2012-07-12 20:32:19 +000066 m_opaque_wp = rhs.m_opaque_wp;
Greg Clayton538eb822010-11-05 23:17:00 +000067 return *this;
68}
69
Chris Lattner24943d22010-06-08 16:52:24 +000070//----------------------------------------------------------------------
71// Destructor
72//----------------------------------------------------------------------
73SBProcess::~SBProcess()
74{
75}
76
Jim Ingham5a15e692012-02-16 06:50:00 +000077const char *
78SBProcess::GetBroadcasterClassName ()
79{
80 return Process::GetStaticBroadcasterClass().AsCString();
81}
82
Greg Clayton334d33a2012-01-30 07:41:31 +000083lldb::ProcessSP
84SBProcess::GetSP() const
85{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000086 return m_opaque_wp.lock();
Greg Clayton334d33a2012-01-30 07:41:31 +000087}
88
Chris Lattner24943d22010-06-08 16:52:24 +000089void
Greg Clayton334d33a2012-01-30 07:41:31 +000090SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000091{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000092 m_opaque_wp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000093}
94
95void
96SBProcess::Clear ()
97{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000098 m_opaque_wp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000099}
100
101
102bool
103SBProcess::IsValid() const
104{
Greg Claytonbcaf99a2012-07-12 20:32:19 +0000105 return m_opaque_wp.lock().get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000106}
107
James McIlree38093402011-03-04 00:31:13 +0000108bool
109SBProcess::RemoteLaunch (char const **argv,
110 char const **envp,
111 const char *stdin_path,
112 const char *stdout_path,
113 const char *stderr_path,
114 const char *working_directory,
115 uint32_t launch_flags,
116 bool stop_at_entry,
117 lldb::SBError& error)
118{
119 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
120 if (log) {
121 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 +0000122 m_opaque_wp.lock().get(),
James McIlree38093402011-03-04 00:31:13 +0000123 argv,
124 envp,
125 stdin_path ? stdin_path : "NULL",
126 stdout_path ? stdout_path : "NULL",
127 stderr_path ? stderr_path : "NULL",
128 working_directory ? working_directory : "NULL",
129 launch_flags,
130 stop_at_entry,
131 error.get());
132 }
133
Greg Clayton0416bdf2012-01-30 09:04:36 +0000134 ProcessSP process_sp(GetSP());
135 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000136 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000137 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
138 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000139 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000140 if (stop_at_entry)
141 launch_flags |= eLaunchFlagStopAtEntry;
142 ProcessLaunchInfo launch_info (stdin_path,
143 stdout_path,
144 stderr_path,
145 working_directory,
146 launch_flags);
147 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
148 if (exe_module)
149 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
150 if (argv)
151 launch_info.GetArguments().AppendArguments (argv);
152 if (envp)
153 launch_info.GetEnvironmentEntries ().SetArguments (envp);
154 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000155 }
156 else
157 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000158 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree38093402011-03-04 00:31:13 +0000159 }
160 }
161 else
162 {
163 error.SetErrorString ("unable to attach pid");
164 }
165
166 if (log) {
167 SBStream sstr;
168 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000169 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000170 }
171
172 return error.Success();
173}
174
175bool
176SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
177{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000178 ProcessSP process_sp(GetSP());
179 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000180 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000181 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
182 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000183 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000184 ProcessAttachInfo attach_info;
185 attach_info.SetProcessID (pid);
186 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000187 }
188 else
189 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000190 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree38093402011-03-04 00:31:13 +0000191 }
192 }
193 else
194 {
195 error.SetErrorString ("unable to attach pid");
196 }
197
198 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
199 if (log) {
200 SBStream sstr;
201 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000202 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000203 }
204
205 return error.Success();
206}
207
Chris Lattner24943d22010-06-08 16:52:24 +0000208
209uint32_t
210SBProcess::GetNumThreads ()
211{
Greg Claytone005f2c2010-11-06 01:53:30 +0000212 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000213
Caroline Tice7826c882010-10-26 03:11:13 +0000214 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000215 ProcessSP process_sp(GetSP());
216 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000217 {
Greg Claytona894fe72012-04-05 16:12:35 +0000218 Process::StopLocker stop_locker;
219
220 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000221 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000222 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000223 }
Caroline Tice7826c882010-10-26 03:11:13 +0000224
225 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000226 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000227
228 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000229}
230
231SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000232SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000233{
Greg Claytone005f2c2010-11-06 01:53:30 +0000234 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000235
Chris Lattner24943d22010-06-08 16:52:24 +0000236 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000237 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000238 ProcessSP process_sp(GetSP());
239 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000240 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000241 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
242 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000243 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000244 }
Caroline Tice7826c882010-10-26 03:11:13 +0000245
246 if (log)
247 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000248 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000249 }
250
Chris Lattner24943d22010-06-08 16:52:24 +0000251 return sb_thread;
252}
253
254SBTarget
255SBProcess::GetTarget() const
256{
Greg Claytone005f2c2010-11-06 01:53:30 +0000257 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000258
Chris Lattner24943d22010-06-08 16:52:24 +0000259 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000260 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000261 ProcessSP process_sp(GetSP());
262 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000263 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000264 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000265 sb_target.SetSP (target_sp);
266 }
Caroline Tice7826c882010-10-26 03:11:13 +0000267
268 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000269 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000270
Chris Lattner24943d22010-06-08 16:52:24 +0000271 return sb_target;
272}
273
274
275size_t
276SBProcess::PutSTDIN (const char *src, size_t src_len)
277{
Greg Claytone005f2c2010-11-06 01:53:30 +0000278 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000279
Caroline Tice7826c882010-10-26 03:11:13 +0000280 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000281 ProcessSP process_sp(GetSP());
282 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000283 {
284 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000285 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000286 }
Caroline Tice7826c882010-10-26 03:11:13 +0000287
288 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000289 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000290 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000291 src,
292 (uint32_t) src_len,
293 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000294
295 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000296}
297
298size_t
299SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
300{
Greg Clayton49ce6822010-10-31 03:01:06 +0000301 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000302 ProcessSP process_sp(GetSP());
303 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000304 {
305 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000306 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000307 }
Caroline Tice7826c882010-10-26 03:11:13 +0000308
Greg Claytone005f2c2010-11-06 01:53:30 +0000309 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000310 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000311 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000312 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000313
Greg Clayton49ce6822010-10-31 03:01:06 +0000314 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000315}
316
317size_t
318SBProcess::GetSTDERR (char *dst, size_t dst_len) const
319{
Greg Clayton49ce6822010-10-31 03:01:06 +0000320 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000321 ProcessSP process_sp(GetSP());
322 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000323 {
324 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000325 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000326 }
Caroline Tice7826c882010-10-26 03:11:13 +0000327
Greg Claytone005f2c2010-11-06 01:53:30 +0000328 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000329 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000330 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000331 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000332
Greg Clayton49ce6822010-10-31 03:01:06 +0000333 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000334}
335
336void
Jim Inghamc8332952010-08-26 21:32:51 +0000337SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000338{
339 if (out == NULL)
340 return;
341
Greg Clayton0416bdf2012-01-30 09:04:36 +0000342 ProcessSP process_sp(GetSP());
343 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000344 {
345 const StateType event_state = SBProcess::GetStateFromEvent (event);
346 char message[1024];
347 int message_len = ::snprintf (message,
348 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000349 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000350 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000351 SBDebugger::StateAsCString (event_state));
352
353 if (message_len > 0)
354 ::fwrite (message, 1, message_len, out);
355 }
356}
357
358void
Jim Inghamc8332952010-08-26 21:32:51 +0000359SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000360{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000361 ProcessSP process_sp(GetSP());
362 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000363 {
364 const StateType event_state = SBProcess::GetStateFromEvent (event);
365 char message[1024];
366 ::snprintf (message,
367 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000368 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000369 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000370 SBDebugger::StateAsCString (event_state));
371
372 result.AppendMessage (message);
373 }
374}
375
376bool
Jim Inghamc8332952010-08-26 21:32:51 +0000377SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000378{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000379 ProcessSP process_sp(GetSP());
380 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000381 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000382 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
383 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000384 }
Chris Lattner24943d22010-06-08 16:52:24 +0000385 return false;
386}
387
388bool
Jim Inghamc8332952010-08-26 21:32:51 +0000389SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000390{
Greg Claytone005f2c2010-11-06 01:53:30 +0000391 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000392
Caroline Tice7826c882010-10-26 03:11:13 +0000393 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000394 ProcessSP process_sp(GetSP());
395 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000396 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000397 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
398 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000399 }
Caroline Tice7826c882010-10-26 03:11:13 +0000400
401 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000402 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000403 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000404
405 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000406}
407
Jim Inghamefbdd222012-07-13 20:18:18 +0000408bool
409SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
410{
411 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
412
413 bool ret_val = false;
414 ProcessSP process_sp(GetSP());
415 if (process_sp)
416 {
417 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
418 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
419 }
420
421 if (log)
422 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
423 process_sp.get(), index_id, (ret_val ? "true" : "false"));
424
425 return ret_val;
426}
427
Chris Lattner24943d22010-06-08 16:52:24 +0000428SBThread
429SBProcess::GetThreadAtIndex (size_t index)
430{
Greg Claytone005f2c2010-11-06 01:53:30 +0000431 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000432
Greg Clayton90c52142012-01-30 02:53:15 +0000433 SBThread sb_thread;
434 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000435 ProcessSP process_sp(GetSP());
436 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000437 {
Greg Claytona894fe72012-04-05 16:12:35 +0000438 Process::StopLocker stop_locker;
439 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000440 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000441 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000442 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000443 }
Caroline Tice7826c882010-10-26 03:11:13 +0000444
445 if (log)
446 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000447 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000448 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000449 }
450
Greg Clayton90c52142012-01-30 02:53:15 +0000451 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000452}
453
454StateType
455SBProcess::GetState ()
456{
Caroline Tice7826c882010-10-26 03:11:13 +0000457
Caroline Tice7826c882010-10-26 03:11:13 +0000458 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000459 ProcessSP process_sp(GetSP());
460 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000461 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000462 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
463 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000464 }
Caroline Tice7826c882010-10-26 03:11:13 +0000465
Greg Claytone005f2c2010-11-06 01:53:30 +0000466 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000467 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000468 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000469 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000470 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000471
472 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000473}
474
475
476int
477SBProcess::GetExitStatus ()
478{
Greg Claytona66ba462010-10-30 04:51:46 +0000479 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000480 ProcessSP process_sp(GetSP());
481 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000482 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000483 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
484 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000485 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000486 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000487 if (log)
488 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000489 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000490
491 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000492}
493
494const char *
495SBProcess::GetExitDescription ()
496{
Greg Claytona66ba462010-10-30 04:51:46 +0000497 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000498 ProcessSP process_sp(GetSP());
499 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000500 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000501 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
502 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000503 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000504 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000505 if (log)
506 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000507 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000508 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000509}
510
511lldb::pid_t
512SBProcess::GetProcessID ()
513{
Caroline Tice7826c882010-10-26 03:11:13 +0000514 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000515 ProcessSP process_sp(GetSP());
516 if (process_sp)
517 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000518
Greg Claytone005f2c2010-11-06 01:53:30 +0000519 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000520 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000521 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000522
523 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000524}
525
Johnny Chen60a544f2011-03-01 22:56:31 +0000526ByteOrder
527SBProcess::GetByteOrder () const
528{
529 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000530 ProcessSP process_sp(GetSP());
531 if (process_sp)
532 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000533
534 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
535 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000536 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000537
538 return byteOrder;
539}
540
Chris Lattner24943d22010-06-08 16:52:24 +0000541uint32_t
542SBProcess::GetAddressByteSize () const
543{
Caroline Tice7826c882010-10-26 03:11:13 +0000544 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000545 ProcessSP process_sp(GetSP());
546 if (process_sp)
547 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000548
Greg Claytone005f2c2010-11-06 01:53:30 +0000549 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000550 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000551 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000552
553 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000554}
555
Chris Lattner24943d22010-06-08 16:52:24 +0000556SBError
557SBProcess::Continue ()
558{
Greg Claytone005f2c2010-11-06 01:53:30 +0000559 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000560
Chris Lattner24943d22010-06-08 16:52:24 +0000561 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000562 ProcessSP process_sp(GetSP());
563
564 if (log)
565 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
566
567 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000568 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000569 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000570
Greg Clayton0416bdf2012-01-30 09:04:36 +0000571 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000572 if (error.Success())
573 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000574 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000575 {
576 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000577 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
578 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000579 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000580 }
581 sb_error.SetError(error);
582 }
Chris Lattner24943d22010-06-08 16:52:24 +0000583 else
584 sb_error.SetErrorString ("SBProcess is invalid");
585
Caroline Tice7826c882010-10-26 03:11:13 +0000586 if (log)
587 {
588 SBStream sstr;
589 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000590 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000591 }
592
Chris Lattner24943d22010-06-08 16:52:24 +0000593 return sb_error;
594}
595
596
597SBError
598SBProcess::Destroy ()
599{
600 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000601 ProcessSP process_sp(GetSP());
602 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000603 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000604 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
605 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000606 }
Chris Lattner24943d22010-06-08 16:52:24 +0000607 else
608 sb_error.SetErrorString ("SBProcess is invalid");
609
Greg Claytone005f2c2010-11-06 01:53:30 +0000610 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000611 if (log)
612 {
613 SBStream sstr;
614 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000615 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000616 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000617 sb_error.get(),
618 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000619 }
620
Chris Lattner24943d22010-06-08 16:52:24 +0000621 return sb_error;
622}
623
624
625SBError
626SBProcess::Stop ()
627{
628 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000629 ProcessSP process_sp(GetSP());
630 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000631 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000632 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
633 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000634 }
Chris Lattner24943d22010-06-08 16:52:24 +0000635 else
636 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000637
Greg Claytone005f2c2010-11-06 01:53:30 +0000638 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000639 if (log)
640 {
641 SBStream sstr;
642 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000643 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000644 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000645 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000646 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000647 }
648
Chris Lattner24943d22010-06-08 16:52:24 +0000649 return sb_error;
650}
651
652SBError
653SBProcess::Kill ()
654{
655 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000656 ProcessSP process_sp(GetSP());
657 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000658 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000659 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
660 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000661 }
Chris Lattner24943d22010-06-08 16:52:24 +0000662 else
663 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000664
Greg Claytone005f2c2010-11-06 01:53:30 +0000665 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000666 if (log)
667 {
668 SBStream sstr;
669 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000670 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000671 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000672 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000673 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000674 }
675
Chris Lattner24943d22010-06-08 16:52:24 +0000676 return sb_error;
677}
678
Chris Lattner24943d22010-06-08 16:52:24 +0000679SBError
680SBProcess::Detach ()
681{
682 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000683 ProcessSP process_sp(GetSP());
684 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000685 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000686 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
687 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000688 }
Chris Lattner24943d22010-06-08 16:52:24 +0000689 else
690 sb_error.SetErrorString ("SBProcess is invalid");
691
692 return sb_error;
693}
694
695SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000696SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000697{
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->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000704 }
Chris Lattner24943d22010-06-08 16:52:24 +0000705 else
706 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000707 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000708 if (log)
709 {
710 SBStream sstr;
711 sb_error.GetDescription (sstr);
712 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000713 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000714 signo,
715 sb_error.get(),
716 sstr.GetData());
717 }
Chris Lattner24943d22010-06-08 16:52:24 +0000718 return sb_error;
719}
720
Jim Ingham5d90ade2012-07-27 23:57:19 +0000721void
722SBProcess::SendAsyncInterrupt ()
723{
724 ProcessSP process_sp(GetSP());
725 if (process_sp)
726 {
727 process_sp->SendAsyncInterrupt ();
728 }
729}
730
Chris Lattner24943d22010-06-08 16:52:24 +0000731SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000732SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000733{
Greg Claytona66ba462010-10-30 04:51:46 +0000734 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000735 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000736 ProcessSP process_sp(GetSP());
737 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000738 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000739 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000740 Process::StopLocker stop_locker;
741 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
742 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000743 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000744 }
Greg Claytona66ba462010-10-30 04:51:46 +0000745
Greg Claytone005f2c2010-11-06 01:53:30 +0000746 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000747 if (log)
748 {
Greg Claytond9919d32011-12-01 23:28:38 +0000749 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000750 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000751 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000752 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000753 }
754
755 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000756}
757
Jim Inghamefbdd222012-07-13 20:18:18 +0000758SBThread
759SBProcess::GetThreadByIndexID (uint32_t index_id)
760{
761 SBThread sb_thread;
762 ThreadSP thread_sp;
763 ProcessSP process_sp(GetSP());
764 if (process_sp)
765 {
766 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
767 Process::StopLocker stop_locker;
768 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
769 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
770 sb_thread.SetThread (thread_sp);
771 }
772
773 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
774 if (log)
775 {
776 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
777 process_sp.get(),
778 index_id,
779 thread_sp.get());
780 }
781
782 return sb_thread;
783}
784
Chris Lattner24943d22010-06-08 16:52:24 +0000785StateType
786SBProcess::GetStateFromEvent (const SBEvent &event)
787{
Greg Claytone005f2c2010-11-06 01:53:30 +0000788 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000789
Caroline Tice7826c882010-10-26 03:11:13 +0000790 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
791
792 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000793 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000794 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000795
796 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000797}
798
Chris Lattner24943d22010-06-08 16:52:24 +0000799bool
800SBProcess::GetRestartedFromEvent (const SBEvent &event)
801{
Greg Clayton63094e02010-06-23 01:19:29 +0000802 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000803}
804
805SBProcess
806SBProcess::GetProcessFromEvent (const SBEvent &event)
807{
Greg Clayton63094e02010-06-23 01:19:29 +0000808 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000809 return process;
810}
811
Jim Ingham28e23862012-02-08 05:23:15 +0000812bool
813SBProcess::EventIsProcessEvent (const SBEvent &event)
814{
Jim Ingham5a15e692012-02-16 06:50:00 +0000815 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000816}
Chris Lattner24943d22010-06-08 16:52:24 +0000817
818SBBroadcaster
819SBProcess::GetBroadcaster () const
820{
Greg Claytone005f2c2010-11-06 01:53:30 +0000821 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000822
Greg Clayton0416bdf2012-01-30 09:04:36 +0000823 ProcessSP process_sp(GetSP());
824
825 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000826
827 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000828 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000829 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000830
Chris Lattner24943d22010-06-08 16:52:24 +0000831 return broadcaster;
832}
833
Jim Ingham5a15e692012-02-16 06:50:00 +0000834const char *
835SBProcess::GetBroadcasterClass ()
836{
837 return Process::GetStaticBroadcasterClass().AsCString();
838}
839
Chris Lattner24943d22010-06-08 16:52:24 +0000840size_t
841SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
842{
Greg Claytone005f2c2010-11-06 01:53:30 +0000843 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000844
Chris Lattner24943d22010-06-08 16:52:24 +0000845 size_t bytes_read = 0;
846
Greg Clayton0416bdf2012-01-30 09:04:36 +0000847 ProcessSP process_sp(GetSP());
848
Greg Claytona66ba462010-10-30 04:51:46 +0000849 if (log)
850 {
851 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000852 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000853 addr,
854 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000855 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000856 sb_error.get());
857 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000858
859 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000860 {
Greg Claytona894fe72012-04-05 16:12:35 +0000861 Process::StopLocker stop_locker;
862 if (stop_locker.TryLock(&process_sp->GetRunLock()))
863 {
864 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
865 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
866 }
867 else
868 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000869 if (log)
870 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000871 sb_error.SetErrorString("process is running");
872 }
Chris Lattner24943d22010-06-08 16:52:24 +0000873 }
874 else
875 {
876 sb_error.SetErrorString ("SBProcess is invalid");
877 }
878
Caroline Tice7826c882010-10-26 03:11:13 +0000879 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000880 {
881 SBStream sstr;
882 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000883 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000884 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000885 addr,
886 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000887 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000888 sb_error.get(),
889 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000890 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000891 }
Caroline Tice7826c882010-10-26 03:11:13 +0000892
Chris Lattner24943d22010-06-08 16:52:24 +0000893 return bytes_read;
894}
895
896size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000897SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
898{
899 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000900 ProcessSP process_sp(GetSP());
901 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000902 {
Greg Claytona894fe72012-04-05 16:12:35 +0000903 Process::StopLocker stop_locker;
904 if (stop_locker.TryLock(&process_sp->GetRunLock()))
905 {
906 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
907 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
908 }
909 else
910 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000911 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
912 if (log)
913 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000914 sb_error.SetErrorString("process is running");
915 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000916 }
917 else
918 {
919 sb_error.SetErrorString ("SBProcess is invalid");
920 }
921 return bytes_read;
922}
923
924uint64_t
925SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
926{
Greg Claytona894fe72012-04-05 16:12:35 +0000927 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000928 ProcessSP process_sp(GetSP());
929 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000930 {
Greg Claytona894fe72012-04-05 16:12:35 +0000931 Process::StopLocker stop_locker;
932 if (stop_locker.TryLock(&process_sp->GetRunLock()))
933 {
934 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
935 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
936 }
937 else
938 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000939 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
940 if (log)
941 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000942 sb_error.SetErrorString("process is running");
943 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000944 }
945 else
946 {
947 sb_error.SetErrorString ("SBProcess is invalid");
948 }
Greg Claytona894fe72012-04-05 16:12:35 +0000949 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000950}
951
952lldb::addr_t
953SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
954{
955 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000956 ProcessSP process_sp(GetSP());
957 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000958 {
Greg Claytona894fe72012-04-05 16:12:35 +0000959 Process::StopLocker stop_locker;
960 if (stop_locker.TryLock(&process_sp->GetRunLock()))
961 {
962 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
963 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
964 }
965 else
966 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000967 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
968 if (log)
969 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000970 sb_error.SetErrorString("process is running");
971 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000972 }
973 else
974 {
975 sb_error.SetErrorString ("SBProcess is invalid");
976 }
977 return ptr;
978}
979
980size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000981SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
982{
983 size_t bytes_written = 0;
984
Greg Claytone005f2c2010-11-06 01:53:30 +0000985 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000986
987 ProcessSP process_sp(GetSP());
988
Greg Claytona66ba462010-10-30 04:51:46 +0000989 if (log)
990 {
991 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000992 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000993 addr,
994 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000995 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000996 sb_error.get());
997 }
998
Greg Clayton0416bdf2012-01-30 09:04:36 +0000999 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001000 {
Greg Claytona894fe72012-04-05 16:12:35 +00001001 Process::StopLocker stop_locker;
1002 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1003 {
1004 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1005 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1006 }
1007 else
1008 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001009 if (log)
1010 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001011 sb_error.SetErrorString("process is running");
1012 }
Chris Lattner24943d22010-06-08 16:52:24 +00001013 }
1014
Greg Claytona66ba462010-10-30 04:51:46 +00001015 if (log)
1016 {
1017 SBStream sstr;
1018 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +00001019 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001020 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001021 addr,
1022 src,
Greg Claytonbae39c52011-12-03 00:46:21 +00001023 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001024 sb_error.get(),
1025 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +00001026 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001027 }
1028
Chris Lattner24943d22010-06-08 16:52:24 +00001029 return bytes_written;
1030}
1031
Caroline Tice98f930f2010-09-20 05:20:02 +00001032bool
1033SBProcess::GetDescription (SBStream &description)
1034{
Greg Clayton96154be2011-11-13 06:57:31 +00001035 Stream &strm = description.ref();
1036
Greg Clayton0416bdf2012-01-30 09:04:36 +00001037 ProcessSP process_sp(GetSP());
1038 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001039 {
1040 char path[PATH_MAX];
1041 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001042 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001043 const char *exe_name = NULL;
1044 if (exe_module)
1045 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1046
Greg Clayton96154be2011-11-13 06:57:31 +00001047 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001048 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001049 lldb_private::StateAsCString (GetState()),
1050 GetNumThreads(),
1051 exe_name ? ", executable = " : "",
1052 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001053 }
1054 else
Greg Clayton96154be2011-11-13 06:57:31 +00001055 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001056
1057 return true;
1058}
Greg Clayton0baa3942010-11-04 01:54:29 +00001059
1060uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001061SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1062{
1063 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1064
1065 uint32_t num = 0;
1066 ProcessSP process_sp(GetSP());
1067 if (process_sp)
1068 {
1069 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1070 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1071 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1072 if (log)
1073 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1074 process_sp.get(), num);
1075 }
1076 else
1077 {
1078 sb_error.SetErrorString ("SBProcess is invalid");
1079 }
1080 return num;
1081}
1082
1083uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001084SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1085{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001086 ProcessSP process_sp(GetSP());
1087 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001088 {
Greg Claytona894fe72012-04-05 16:12:35 +00001089 Process::StopLocker stop_locker;
1090 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1091 {
1092 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1093 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1094 }
1095 else
1096 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001097 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1098 if (log)
1099 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001100 sb_error.SetErrorString("process is running");
1101 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001102 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001103 return LLDB_INVALID_IMAGE_TOKEN;
1104}
1105
1106lldb::SBError
1107SBProcess::UnloadImage (uint32_t image_token)
1108{
1109 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001110 ProcessSP process_sp(GetSP());
1111 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001112 {
Greg Claytona894fe72012-04-05 16:12:35 +00001113 Process::StopLocker stop_locker;
1114 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1115 {
1116 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1117 sb_error.SetError (process_sp->UnloadImage (image_token));
1118 }
1119 else
1120 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001121 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1122 if (log)
1123 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001124 sb_error.SetErrorString("process is running");
1125 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001126 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001127 else
1128 sb_error.SetErrorString("invalid process");
1129 return sb_error;
1130}