blob: e5569040c40063b834ab6affe626c9df3d5a6415 [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{
Jim Inghamd0bdddf2012-08-22 21:34:33 +0000105 ProcessSP process_sp(m_opaque_wp.lock());
106 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
James McIlree38093402011-03-04 00:31:13 +0000109bool
110SBProcess::RemoteLaunch (char const **argv,
111 char const **envp,
112 const char *stdin_path,
113 const char *stdout_path,
114 const char *stderr_path,
115 const char *working_directory,
116 uint32_t launch_flags,
117 bool stop_at_entry,
118 lldb::SBError& error)
119{
120 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
121 if (log) {
122 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 +0000123 m_opaque_wp.lock().get(),
James McIlree38093402011-03-04 00:31:13 +0000124 argv,
125 envp,
126 stdin_path ? stdin_path : "NULL",
127 stdout_path ? stdout_path : "NULL",
128 stderr_path ? stderr_path : "NULL",
129 working_directory ? working_directory : "NULL",
130 launch_flags,
131 stop_at_entry,
132 error.get());
133 }
134
Greg Clayton0416bdf2012-01-30 09:04:36 +0000135 ProcessSP process_sp(GetSP());
136 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000137 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000138 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
139 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000140 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000141 if (stop_at_entry)
142 launch_flags |= eLaunchFlagStopAtEntry;
143 ProcessLaunchInfo launch_info (stdin_path,
144 stdout_path,
145 stderr_path,
146 working_directory,
147 launch_flags);
148 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
149 if (exe_module)
150 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
151 if (argv)
152 launch_info.GetArguments().AppendArguments (argv);
153 if (envp)
154 launch_info.GetEnvironmentEntries ().SetArguments (envp);
155 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000156 }
157 else
158 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000159 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree38093402011-03-04 00:31:13 +0000160 }
161 }
162 else
163 {
164 error.SetErrorString ("unable to attach pid");
165 }
166
167 if (log) {
168 SBStream sstr;
169 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000170 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000171 }
172
173 return error.Success();
174}
175
176bool
177SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
178{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000179 ProcessSP process_sp(GetSP());
180 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000181 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000182 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
183 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000184 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000185 ProcessAttachInfo attach_info;
186 attach_info.SetProcessID (pid);
187 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000188 }
189 else
190 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000191 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree38093402011-03-04 00:31:13 +0000192 }
193 }
194 else
195 {
196 error.SetErrorString ("unable to attach pid");
197 }
198
199 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
200 if (log) {
201 SBStream sstr;
202 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000203 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000204 }
205
206 return error.Success();
207}
208
Chris Lattner24943d22010-06-08 16:52:24 +0000209
210uint32_t
211SBProcess::GetNumThreads ()
212{
Greg Claytone005f2c2010-11-06 01:53:30 +0000213 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000214
Caroline Tice7826c882010-10-26 03:11:13 +0000215 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000216 ProcessSP process_sp(GetSP());
217 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Claytona894fe72012-04-05 16:12:35 +0000219 Process::StopLocker stop_locker;
220
221 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000222 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000223 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000224 }
Caroline Tice7826c882010-10-26 03:11:13 +0000225
226 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000227 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000228
229 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000230}
231
232SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000233SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000234{
Greg Claytone005f2c2010-11-06 01:53:30 +0000235 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000236
Chris Lattner24943d22010-06-08 16:52:24 +0000237 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000238 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000239 ProcessSP process_sp(GetSP());
240 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000241 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000242 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
243 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000244 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000245 }
Caroline Tice7826c882010-10-26 03:11:13 +0000246
247 if (log)
248 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000249 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000250 }
251
Chris Lattner24943d22010-06-08 16:52:24 +0000252 return sb_thread;
253}
254
255SBTarget
256SBProcess::GetTarget() const
257{
Greg Claytone005f2c2010-11-06 01:53:30 +0000258 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000259
Chris Lattner24943d22010-06-08 16:52:24 +0000260 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000261 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000262 ProcessSP process_sp(GetSP());
263 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000264 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000265 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000266 sb_target.SetSP (target_sp);
267 }
Caroline Tice7826c882010-10-26 03:11:13 +0000268
269 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000270 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000271
Chris Lattner24943d22010-06-08 16:52:24 +0000272 return sb_target;
273}
274
275
276size_t
277SBProcess::PutSTDIN (const char *src, size_t src_len)
278{
Greg Claytone005f2c2010-11-06 01:53:30 +0000279 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000280
Caroline Tice7826c882010-10-26 03:11:13 +0000281 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000282 ProcessSP process_sp(GetSP());
283 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000284 {
285 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000286 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000287 }
Caroline Tice7826c882010-10-26 03:11:13 +0000288
289 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000290 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000291 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000292 src,
293 (uint32_t) src_len,
294 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000295
296 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000297}
298
299size_t
300SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
301{
Greg Clayton49ce6822010-10-31 03:01:06 +0000302 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000303 ProcessSP process_sp(GetSP());
304 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000305 {
306 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000307 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000308 }
Caroline Tice7826c882010-10-26 03:11:13 +0000309
Greg Claytone005f2c2010-11-06 01:53:30 +0000310 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000311 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000312 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000313 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000314
Greg Clayton49ce6822010-10-31 03:01:06 +0000315 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000316}
317
318size_t
319SBProcess::GetSTDERR (char *dst, size_t dst_len) const
320{
Greg Clayton49ce6822010-10-31 03:01:06 +0000321 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000322 ProcessSP process_sp(GetSP());
323 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000324 {
325 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000326 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000327 }
Caroline Tice7826c882010-10-26 03:11:13 +0000328
Greg Claytone005f2c2010-11-06 01:53:30 +0000329 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000330 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000331 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000332 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000333
Greg Clayton49ce6822010-10-31 03:01:06 +0000334 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000335}
336
337void
Jim Inghamc8332952010-08-26 21:32:51 +0000338SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000339{
340 if (out == NULL)
341 return;
342
Greg Clayton0416bdf2012-01-30 09:04:36 +0000343 ProcessSP process_sp(GetSP());
344 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000345 {
346 const StateType event_state = SBProcess::GetStateFromEvent (event);
347 char message[1024];
348 int message_len = ::snprintf (message,
349 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000350 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000351 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000352 SBDebugger::StateAsCString (event_state));
353
354 if (message_len > 0)
355 ::fwrite (message, 1, message_len, out);
356 }
357}
358
359void
Jim Inghamc8332952010-08-26 21:32:51 +0000360SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000361{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000362 ProcessSP process_sp(GetSP());
363 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000364 {
365 const StateType event_state = SBProcess::GetStateFromEvent (event);
366 char message[1024];
367 ::snprintf (message,
368 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000369 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000370 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000371 SBDebugger::StateAsCString (event_state));
372
373 result.AppendMessage (message);
374 }
375}
376
377bool
Jim Inghamc8332952010-08-26 21:32:51 +0000378SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000379{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000380 ProcessSP process_sp(GetSP());
381 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000382 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000383 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
384 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000385 }
Chris Lattner24943d22010-06-08 16:52:24 +0000386 return false;
387}
388
389bool
Jim Inghamc8332952010-08-26 21:32:51 +0000390SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000391{
Greg Claytone005f2c2010-11-06 01:53:30 +0000392 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000393
Caroline Tice7826c882010-10-26 03:11:13 +0000394 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000395 ProcessSP process_sp(GetSP());
396 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000397 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000398 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
399 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000400 }
Caroline Tice7826c882010-10-26 03:11:13 +0000401
402 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000403 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000404 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000405
406 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000407}
408
Jim Inghamefbdd222012-07-13 20:18:18 +0000409bool
410SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
411{
412 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
413
414 bool ret_val = false;
415 ProcessSP process_sp(GetSP());
416 if (process_sp)
417 {
418 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
419 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
420 }
421
422 if (log)
423 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
424 process_sp.get(), index_id, (ret_val ? "true" : "false"));
425
426 return ret_val;
427}
428
Chris Lattner24943d22010-06-08 16:52:24 +0000429SBThread
430SBProcess::GetThreadAtIndex (size_t index)
431{
Greg Claytone005f2c2010-11-06 01:53:30 +0000432 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000433
Greg Clayton90c52142012-01-30 02:53:15 +0000434 SBThread sb_thread;
435 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000436 ProcessSP process_sp(GetSP());
437 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000438 {
Greg Claytona894fe72012-04-05 16:12:35 +0000439 Process::StopLocker stop_locker;
440 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000441 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000442 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000443 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000444 }
Caroline Tice7826c882010-10-26 03:11:13 +0000445
446 if (log)
447 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000448 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000449 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000450 }
451
Greg Clayton90c52142012-01-30 02:53:15 +0000452 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000453}
454
455StateType
456SBProcess::GetState ()
457{
Caroline Tice7826c882010-10-26 03:11:13 +0000458
Caroline Tice7826c882010-10-26 03:11:13 +0000459 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000460 ProcessSP process_sp(GetSP());
461 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000462 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000463 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
464 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000465 }
Caroline Tice7826c882010-10-26 03:11:13 +0000466
Greg Claytone005f2c2010-11-06 01:53:30 +0000467 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000468 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000469 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000470 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000471 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000472
473 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000474}
475
476
477int
478SBProcess::GetExitStatus ()
479{
Greg Claytona66ba462010-10-30 04:51:46 +0000480 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000481 ProcessSP process_sp(GetSP());
482 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000483 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000484 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
485 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000486 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000487 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000488 if (log)
489 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000490 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000491
492 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000493}
494
495const char *
496SBProcess::GetExitDescription ()
497{
Greg Claytona66ba462010-10-30 04:51:46 +0000498 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000499 ProcessSP process_sp(GetSP());
500 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000501 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000502 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
503 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000504 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000505 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000506 if (log)
507 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000508 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000509 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000510}
511
512lldb::pid_t
513SBProcess::GetProcessID ()
514{
Caroline Tice7826c882010-10-26 03:11:13 +0000515 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000516 ProcessSP process_sp(GetSP());
517 if (process_sp)
518 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000519
Greg Claytone005f2c2010-11-06 01:53:30 +0000520 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000521 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000522 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000523
524 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000525}
526
Johnny Chen60a544f2011-03-01 22:56:31 +0000527ByteOrder
528SBProcess::GetByteOrder () const
529{
530 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000531 ProcessSP process_sp(GetSP());
532 if (process_sp)
533 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000534
535 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
536 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000537 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000538
539 return byteOrder;
540}
541
Chris Lattner24943d22010-06-08 16:52:24 +0000542uint32_t
543SBProcess::GetAddressByteSize () const
544{
Caroline Tice7826c882010-10-26 03:11:13 +0000545 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000546 ProcessSP process_sp(GetSP());
547 if (process_sp)
548 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000549
Greg Claytone005f2c2010-11-06 01:53:30 +0000550 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000551 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000552 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000553
554 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000555}
556
Chris Lattner24943d22010-06-08 16:52:24 +0000557SBError
558SBProcess::Continue ()
559{
Greg Claytone005f2c2010-11-06 01:53:30 +0000560 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000561
Chris Lattner24943d22010-06-08 16:52:24 +0000562 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000563 ProcessSP process_sp(GetSP());
564
565 if (log)
566 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
567
568 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000569 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000570 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000571
Greg Clayton0416bdf2012-01-30 09:04:36 +0000572 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000573 if (error.Success())
574 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000575 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000576 {
577 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000578 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
579 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000580 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000581 }
582 sb_error.SetError(error);
583 }
Chris Lattner24943d22010-06-08 16:52:24 +0000584 else
585 sb_error.SetErrorString ("SBProcess is invalid");
586
Caroline Tice7826c882010-10-26 03:11:13 +0000587 if (log)
588 {
589 SBStream sstr;
590 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000591 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000592 }
593
Chris Lattner24943d22010-06-08 16:52:24 +0000594 return sb_error;
595}
596
597
598SBError
599SBProcess::Destroy ()
600{
601 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000602 ProcessSP process_sp(GetSP());
603 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000604 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000605 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
606 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000607 }
Chris Lattner24943d22010-06-08 16:52:24 +0000608 else
609 sb_error.SetErrorString ("SBProcess is invalid");
610
Greg Claytone005f2c2010-11-06 01:53:30 +0000611 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000612 if (log)
613 {
614 SBStream sstr;
615 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000616 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000617 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000618 sb_error.get(),
619 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000620 }
621
Chris Lattner24943d22010-06-08 16:52:24 +0000622 return sb_error;
623}
624
625
626SBError
627SBProcess::Stop ()
628{
629 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000630 ProcessSP process_sp(GetSP());
631 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000632 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000633 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
634 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000635 }
Chris Lattner24943d22010-06-08 16:52:24 +0000636 else
637 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000638
Greg Claytone005f2c2010-11-06 01:53:30 +0000639 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000640 if (log)
641 {
642 SBStream sstr;
643 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000644 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000645 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000646 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000647 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000648 }
649
Chris Lattner24943d22010-06-08 16:52:24 +0000650 return sb_error;
651}
652
653SBError
654SBProcess::Kill ()
655{
656 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000657 ProcessSP process_sp(GetSP());
658 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000659 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000660 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
661 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000662 }
Chris Lattner24943d22010-06-08 16:52:24 +0000663 else
664 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000665
Greg Claytone005f2c2010-11-06 01:53:30 +0000666 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000667 if (log)
668 {
669 SBStream sstr;
670 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000671 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000672 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000673 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000674 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000675 }
676
Chris Lattner24943d22010-06-08 16:52:24 +0000677 return sb_error;
678}
679
Chris Lattner24943d22010-06-08 16:52:24 +0000680SBError
681SBProcess::Detach ()
682{
683 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000684 ProcessSP process_sp(GetSP());
685 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000686 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000687 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
688 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000689 }
Chris Lattner24943d22010-06-08 16:52:24 +0000690 else
691 sb_error.SetErrorString ("SBProcess is invalid");
692
693 return sb_error;
694}
695
696SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000697SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000698{
699 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000700 ProcessSP process_sp(GetSP());
701 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000702 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000703 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
704 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000705 }
Chris Lattner24943d22010-06-08 16:52:24 +0000706 else
707 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000708 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000709 if (log)
710 {
711 SBStream sstr;
712 sb_error.GetDescription (sstr);
713 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000714 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000715 signo,
716 sb_error.get(),
717 sstr.GetData());
718 }
Chris Lattner24943d22010-06-08 16:52:24 +0000719 return sb_error;
720}
721
Jim Ingham5d90ade2012-07-27 23:57:19 +0000722void
723SBProcess::SendAsyncInterrupt ()
724{
725 ProcessSP process_sp(GetSP());
726 if (process_sp)
727 {
728 process_sp->SendAsyncInterrupt ();
729 }
730}
731
Chris Lattner24943d22010-06-08 16:52:24 +0000732SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000733SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000734{
Greg Claytona66ba462010-10-30 04:51:46 +0000735 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000736 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000737 ProcessSP process_sp(GetSP());
738 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000739 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000740 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000741 Process::StopLocker stop_locker;
742 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
743 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000744 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000745 }
Greg Claytona66ba462010-10-30 04:51:46 +0000746
Greg Claytone005f2c2010-11-06 01:53:30 +0000747 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000748 if (log)
749 {
Greg Claytond9919d32011-12-01 23:28:38 +0000750 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000751 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000752 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000753 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000754 }
755
756 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000757}
758
Jim Inghamefbdd222012-07-13 20:18:18 +0000759SBThread
760SBProcess::GetThreadByIndexID (uint32_t index_id)
761{
762 SBThread sb_thread;
763 ThreadSP thread_sp;
764 ProcessSP process_sp(GetSP());
765 if (process_sp)
766 {
767 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
768 Process::StopLocker stop_locker;
769 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
770 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
771 sb_thread.SetThread (thread_sp);
772 }
773
774 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
775 if (log)
776 {
777 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
778 process_sp.get(),
779 index_id,
780 thread_sp.get());
781 }
782
783 return sb_thread;
784}
785
Chris Lattner24943d22010-06-08 16:52:24 +0000786StateType
787SBProcess::GetStateFromEvent (const SBEvent &event)
788{
Greg Claytone005f2c2010-11-06 01:53:30 +0000789 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000790
Caroline Tice7826c882010-10-26 03:11:13 +0000791 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
792
793 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000794 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000795 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000796
797 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000798}
799
Chris Lattner24943d22010-06-08 16:52:24 +0000800bool
801SBProcess::GetRestartedFromEvent (const SBEvent &event)
802{
Greg Clayton63094e02010-06-23 01:19:29 +0000803 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000804}
805
806SBProcess
807SBProcess::GetProcessFromEvent (const SBEvent &event)
808{
Greg Clayton63094e02010-06-23 01:19:29 +0000809 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000810 return process;
811}
812
Jim Ingham28e23862012-02-08 05:23:15 +0000813bool
814SBProcess::EventIsProcessEvent (const SBEvent &event)
815{
Jim Ingham5a15e692012-02-16 06:50:00 +0000816 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000817}
Chris Lattner24943d22010-06-08 16:52:24 +0000818
819SBBroadcaster
820SBProcess::GetBroadcaster () const
821{
Greg Claytone005f2c2010-11-06 01:53:30 +0000822 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000823
Greg Clayton0416bdf2012-01-30 09:04:36 +0000824 ProcessSP process_sp(GetSP());
825
826 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000827
828 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000829 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000830 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000831
Chris Lattner24943d22010-06-08 16:52:24 +0000832 return broadcaster;
833}
834
Jim Ingham5a15e692012-02-16 06:50:00 +0000835const char *
836SBProcess::GetBroadcasterClass ()
837{
838 return Process::GetStaticBroadcasterClass().AsCString();
839}
840
Chris Lattner24943d22010-06-08 16:52:24 +0000841size_t
842SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
843{
Greg Claytone005f2c2010-11-06 01:53:30 +0000844 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000845
Chris Lattner24943d22010-06-08 16:52:24 +0000846 size_t bytes_read = 0;
847
Greg Clayton0416bdf2012-01-30 09:04:36 +0000848 ProcessSP process_sp(GetSP());
849
Greg Claytona66ba462010-10-30 04:51:46 +0000850 if (log)
851 {
852 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000853 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000854 addr,
855 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000856 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000857 sb_error.get());
858 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000859
860 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000861 {
Greg Claytona894fe72012-04-05 16:12:35 +0000862 Process::StopLocker stop_locker;
863 if (stop_locker.TryLock(&process_sp->GetRunLock()))
864 {
865 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
866 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
867 }
868 else
869 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000870 if (log)
871 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000872 sb_error.SetErrorString("process is running");
873 }
Chris Lattner24943d22010-06-08 16:52:24 +0000874 }
875 else
876 {
877 sb_error.SetErrorString ("SBProcess is invalid");
878 }
879
Caroline Tice7826c882010-10-26 03:11:13 +0000880 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000881 {
882 SBStream sstr;
883 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000884 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000885 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000886 addr,
887 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000888 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000889 sb_error.get(),
890 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000891 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000892 }
Caroline Tice7826c882010-10-26 03:11:13 +0000893
Chris Lattner24943d22010-06-08 16:52:24 +0000894 return bytes_read;
895}
896
897size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000898SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
899{
900 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000901 ProcessSP process_sp(GetSP());
902 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000903 {
Greg Claytona894fe72012-04-05 16:12:35 +0000904 Process::StopLocker stop_locker;
905 if (stop_locker.TryLock(&process_sp->GetRunLock()))
906 {
907 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
908 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
909 }
910 else
911 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000912 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
913 if (log)
914 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000915 sb_error.SetErrorString("process is running");
916 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000917 }
918 else
919 {
920 sb_error.SetErrorString ("SBProcess is invalid");
921 }
922 return bytes_read;
923}
924
925uint64_t
926SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
927{
Greg Claytona894fe72012-04-05 16:12:35 +0000928 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000929 ProcessSP process_sp(GetSP());
930 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000931 {
Greg Claytona894fe72012-04-05 16:12:35 +0000932 Process::StopLocker stop_locker;
933 if (stop_locker.TryLock(&process_sp->GetRunLock()))
934 {
935 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
936 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
937 }
938 else
939 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000940 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
941 if (log)
942 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000943 sb_error.SetErrorString("process is running");
944 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000945 }
946 else
947 {
948 sb_error.SetErrorString ("SBProcess is invalid");
949 }
Greg Claytona894fe72012-04-05 16:12:35 +0000950 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000951}
952
953lldb::addr_t
954SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
955{
956 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000957 ProcessSP process_sp(GetSP());
958 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000959 {
Greg Claytona894fe72012-04-05 16:12:35 +0000960 Process::StopLocker stop_locker;
961 if (stop_locker.TryLock(&process_sp->GetRunLock()))
962 {
963 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
964 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
965 }
966 else
967 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000968 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
969 if (log)
970 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000971 sb_error.SetErrorString("process is running");
972 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000973 }
974 else
975 {
976 sb_error.SetErrorString ("SBProcess is invalid");
977 }
978 return ptr;
979}
980
981size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000982SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
983{
984 size_t bytes_written = 0;
985
Greg Claytone005f2c2010-11-06 01:53:30 +0000986 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000987
988 ProcessSP process_sp(GetSP());
989
Greg Claytona66ba462010-10-30 04:51:46 +0000990 if (log)
991 {
992 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000993 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000994 addr,
995 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000996 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000997 sb_error.get());
998 }
999
Greg Clayton0416bdf2012-01-30 09:04:36 +00001000 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001001 {
Greg Claytona894fe72012-04-05 16:12:35 +00001002 Process::StopLocker stop_locker;
1003 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1004 {
1005 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1006 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1007 }
1008 else
1009 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001010 if (log)
1011 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001012 sb_error.SetErrorString("process is running");
1013 }
Chris Lattner24943d22010-06-08 16:52:24 +00001014 }
1015
Greg Claytona66ba462010-10-30 04:51:46 +00001016 if (log)
1017 {
1018 SBStream sstr;
1019 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +00001020 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001021 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001022 addr,
1023 src,
Greg Claytonbae39c52011-12-03 00:46:21 +00001024 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001025 sb_error.get(),
1026 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +00001027 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001028 }
1029
Chris Lattner24943d22010-06-08 16:52:24 +00001030 return bytes_written;
1031}
1032
Caroline Tice98f930f2010-09-20 05:20:02 +00001033bool
1034SBProcess::GetDescription (SBStream &description)
1035{
Greg Clayton96154be2011-11-13 06:57:31 +00001036 Stream &strm = description.ref();
1037
Greg Clayton0416bdf2012-01-30 09:04:36 +00001038 ProcessSP process_sp(GetSP());
1039 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001040 {
1041 char path[PATH_MAX];
1042 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001043 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001044 const char *exe_name = NULL;
1045 if (exe_module)
1046 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1047
Greg Clayton96154be2011-11-13 06:57:31 +00001048 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001049 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001050 lldb_private::StateAsCString (GetState()),
1051 GetNumThreads(),
1052 exe_name ? ", executable = " : "",
1053 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001054 }
1055 else
Greg Clayton96154be2011-11-13 06:57:31 +00001056 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001057
1058 return true;
1059}
Greg Clayton0baa3942010-11-04 01:54:29 +00001060
1061uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001062SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1063{
1064 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1065
1066 uint32_t num = 0;
1067 ProcessSP process_sp(GetSP());
1068 if (process_sp)
1069 {
1070 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1071 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1072 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1073 if (log)
1074 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1075 process_sp.get(), num);
1076 }
1077 else
1078 {
1079 sb_error.SetErrorString ("SBProcess is invalid");
1080 }
1081 return num;
1082}
1083
1084uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001085SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1086{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001087 ProcessSP process_sp(GetSP());
1088 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001089 {
Greg Claytona894fe72012-04-05 16:12:35 +00001090 Process::StopLocker stop_locker;
1091 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1092 {
1093 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1094 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1095 }
1096 else
1097 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001098 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1099 if (log)
1100 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001101 sb_error.SetErrorString("process is running");
1102 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001103 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001104 return LLDB_INVALID_IMAGE_TOKEN;
1105}
1106
1107lldb::SBError
1108SBProcess::UnloadImage (uint32_t image_token)
1109{
1110 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001111 ProcessSP process_sp(GetSP());
1112 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001113 {
Greg Claytona894fe72012-04-05 16:12:35 +00001114 Process::StopLocker stop_locker;
1115 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1116 {
1117 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1118 sb_error.SetError (process_sp->UnloadImage (image_token));
1119 }
1120 else
1121 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001122 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1123 if (log)
1124 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001125 sb_error.SetErrorString("process is running");
1126 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001127 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001128 else
1129 sb_error.SetErrorString("invalid process");
1130 return sb_error;
1131}