blob: 7130e33482509ce581ed326a806fac5a2cd78fcd [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-defines.h"
13#include "lldb/lldb-types.h"
14
Jim Ingham84cdc152010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000016#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000017#include "lldb/Core/Log.h"
Greg Clayton49ce8962012-08-29 21:13:06 +000018#include "lldb/Core/Module.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/State.h"
20#include "lldb/Core/Stream.h"
21#include "lldb/Core/StreamFile.h"
22#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000024#include "lldb/Target/Target.h"
25#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026
27// Project includes
28
Eli Friedman7a62c8b2010-06-09 07:44:37 +000029#include "lldb/API/SBBroadcaster.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000030#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000031#include "lldb/API/SBDebugger.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000032#include "lldb/API/SBEvent.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000033#include "lldb/API/SBFileSpec.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000034#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000035#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037
38using namespace lldb;
39using namespace lldb_private;
40
41
Chris Lattner24943d22010-06-08 16:52:24 +000042SBProcess::SBProcess () :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000043 m_opaque_wp()
Chris Lattner24943d22010-06-08 16:52:24 +000044{
45}
46
47
48//----------------------------------------------------------------------
49// SBProcess constructor
50//----------------------------------------------------------------------
51
52SBProcess::SBProcess (const SBProcess& rhs) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000053 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner24943d22010-06-08 16:52:24 +000054{
55}
56
57
58SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Claytonbcaf99a2012-07-12 20:32:19 +000059 m_opaque_wp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000060{
61}
62
Greg Clayton538eb822010-11-05 23:17:00 +000063const SBProcess&
64SBProcess::operator = (const SBProcess& rhs)
65{
66 if (this != &rhs)
Greg Claytonbcaf99a2012-07-12 20:32:19 +000067 m_opaque_wp = rhs.m_opaque_wp;
Greg Clayton538eb822010-11-05 23:17:00 +000068 return *this;
69}
70
Chris Lattner24943d22010-06-08 16:52:24 +000071//----------------------------------------------------------------------
72// Destructor
73//----------------------------------------------------------------------
74SBProcess::~SBProcess()
75{
76}
77
Jim Ingham5a15e692012-02-16 06:50:00 +000078const char *
79SBProcess::GetBroadcasterClassName ()
80{
81 return Process::GetStaticBroadcasterClass().AsCString();
82}
83
Greg Clayton334d33a2012-01-30 07:41:31 +000084lldb::ProcessSP
85SBProcess::GetSP() const
86{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000087 return m_opaque_wp.lock();
Greg Clayton334d33a2012-01-30 07:41:31 +000088}
89
Chris Lattner24943d22010-06-08 16:52:24 +000090void
Greg Clayton334d33a2012-01-30 07:41:31 +000091SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000092{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000093 m_opaque_wp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000094}
95
96void
97SBProcess::Clear ()
98{
Greg Claytonbcaf99a2012-07-12 20:32:19 +000099 m_opaque_wp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000100}
101
102
103bool
104SBProcess::IsValid() const
105{
Jim Inghamd0bdddf2012-08-22 21:34:33 +0000106 ProcessSP process_sp(m_opaque_wp.lock());
107 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner24943d22010-06-08 16:52:24 +0000108}
109
James McIlree38093402011-03-04 00:31:13 +0000110bool
111SBProcess::RemoteLaunch (char const **argv,
112 char const **envp,
113 const char *stdin_path,
114 const char *stdout_path,
115 const char *stderr_path,
116 const char *working_directory,
117 uint32_t launch_flags,
118 bool stop_at_entry,
119 lldb::SBError& error)
120{
121 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
122 if (log) {
123 log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...",
Greg Claytonbcaf99a2012-07-12 20:32:19 +0000124 m_opaque_wp.lock().get(),
James McIlree38093402011-03-04 00:31:13 +0000125 argv,
126 envp,
127 stdin_path ? stdin_path : "NULL",
128 stdout_path ? stdout_path : "NULL",
129 stderr_path ? stderr_path : "NULL",
130 working_directory ? working_directory : "NULL",
131 launch_flags,
132 stop_at_entry,
133 error.get());
134 }
135
Greg Clayton0416bdf2012-01-30 09:04:36 +0000136 ProcessSP process_sp(GetSP());
137 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000138 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000139 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
140 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000141 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000142 if (stop_at_entry)
143 launch_flags |= eLaunchFlagStopAtEntry;
144 ProcessLaunchInfo launch_info (stdin_path,
145 stdout_path,
146 stderr_path,
147 working_directory,
148 launch_flags);
149 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
150 if (exe_module)
151 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
152 if (argv)
153 launch_info.GetArguments().AppendArguments (argv);
154 if (envp)
155 launch_info.GetEnvironmentEntries ().SetArguments (envp);
156 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000157 }
158 else
159 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000160 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree38093402011-03-04 00:31:13 +0000161 }
162 }
163 else
164 {
165 error.SetErrorString ("unable to attach pid");
166 }
167
168 if (log) {
169 SBStream sstr;
170 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000171 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000172 }
173
174 return error.Success();
175}
176
177bool
178SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
179{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000180 ProcessSP process_sp(GetSP());
181 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000182 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000183 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
184 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000185 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000186 ProcessAttachInfo attach_info;
187 attach_info.SetProcessID (pid);
188 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000189 }
190 else
191 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000192 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree38093402011-03-04 00:31:13 +0000193 }
194 }
195 else
196 {
197 error.SetErrorString ("unable to attach pid");
198 }
199
200 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
201 if (log) {
202 SBStream sstr;
203 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000204 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000205 }
206
207 return error.Success();
208}
209
Chris Lattner24943d22010-06-08 16:52:24 +0000210
211uint32_t
212SBProcess::GetNumThreads ()
213{
Greg Claytone005f2c2010-11-06 01:53:30 +0000214 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000215
Caroline Tice7826c882010-10-26 03:11:13 +0000216 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000217 ProcessSP process_sp(GetSP());
218 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000219 {
Greg Claytona894fe72012-04-05 16:12:35 +0000220 Process::StopLocker stop_locker;
221
222 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000223 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000224 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000225 }
Caroline Tice7826c882010-10-26 03:11:13 +0000226
227 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000228 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000229
230 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000231}
232
233SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000234SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000235{
Greg Claytone005f2c2010-11-06 01:53:30 +0000236 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000237
Chris Lattner24943d22010-06-08 16:52:24 +0000238 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000239 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000240 ProcessSP process_sp(GetSP());
241 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000242 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000243 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
244 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000245 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000246 }
Caroline Tice7826c882010-10-26 03:11:13 +0000247
248 if (log)
249 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000250 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000251 }
252
Chris Lattner24943d22010-06-08 16:52:24 +0000253 return sb_thread;
254}
255
256SBTarget
257SBProcess::GetTarget() const
258{
Greg Claytone005f2c2010-11-06 01:53:30 +0000259 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000260
Chris Lattner24943d22010-06-08 16:52:24 +0000261 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000262 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000263 ProcessSP process_sp(GetSP());
264 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000265 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000266 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000267 sb_target.SetSP (target_sp);
268 }
Caroline Tice7826c882010-10-26 03:11:13 +0000269
270 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000271 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000272
Chris Lattner24943d22010-06-08 16:52:24 +0000273 return sb_target;
274}
275
276
277size_t
278SBProcess::PutSTDIN (const char *src, size_t src_len)
279{
Greg Claytone005f2c2010-11-06 01:53:30 +0000280 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000281
Caroline Tice7826c882010-10-26 03:11:13 +0000282 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000283 ProcessSP process_sp(GetSP());
284 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000285 {
286 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000287 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000288 }
Caroline Tice7826c882010-10-26 03:11:13 +0000289
290 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000291 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000292 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000293 src,
294 (uint32_t) src_len,
295 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000296
297 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000298}
299
300size_t
301SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
302{
Greg Clayton49ce6822010-10-31 03:01:06 +0000303 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000304 ProcessSP process_sp(GetSP());
305 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000306 {
307 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000308 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000309 }
Caroline Tice7826c882010-10-26 03:11:13 +0000310
Greg Claytone005f2c2010-11-06 01:53:30 +0000311 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000312 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000313 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000314 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000315
Greg Clayton49ce6822010-10-31 03:01:06 +0000316 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000317}
318
319size_t
320SBProcess::GetSTDERR (char *dst, size_t dst_len) const
321{
Greg Clayton49ce6822010-10-31 03:01:06 +0000322 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000323 ProcessSP process_sp(GetSP());
324 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000325 {
326 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000327 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000328 }
Caroline Tice7826c882010-10-26 03:11:13 +0000329
Greg Claytone005f2c2010-11-06 01:53:30 +0000330 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000331 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000332 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000333 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000334
Greg Clayton49ce6822010-10-31 03:01:06 +0000335 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000336}
337
338void
Jim Inghamc8332952010-08-26 21:32:51 +0000339SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000340{
341 if (out == NULL)
342 return;
343
Greg Clayton0416bdf2012-01-30 09:04:36 +0000344 ProcessSP process_sp(GetSP());
345 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000346 {
347 const StateType event_state = SBProcess::GetStateFromEvent (event);
348 char message[1024];
349 int message_len = ::snprintf (message,
350 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000351 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000352 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000353 SBDebugger::StateAsCString (event_state));
354
355 if (message_len > 0)
356 ::fwrite (message, 1, message_len, out);
357 }
358}
359
360void
Jim Inghamc8332952010-08-26 21:32:51 +0000361SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000362{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000363 ProcessSP process_sp(GetSP());
364 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000365 {
366 const StateType event_state = SBProcess::GetStateFromEvent (event);
367 char message[1024];
368 ::snprintf (message,
369 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000370 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000371 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000372 SBDebugger::StateAsCString (event_state));
373
374 result.AppendMessage (message);
375 }
376}
377
378bool
Jim Inghamc8332952010-08-26 21:32:51 +0000379SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000380{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000381 ProcessSP process_sp(GetSP());
382 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000383 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000384 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
385 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000386 }
Chris Lattner24943d22010-06-08 16:52:24 +0000387 return false;
388}
389
390bool
Jim Inghamc8332952010-08-26 21:32:51 +0000391SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000392{
Greg Claytone005f2c2010-11-06 01:53:30 +0000393 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000394
Caroline Tice7826c882010-10-26 03:11:13 +0000395 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000396 ProcessSP process_sp(GetSP());
397 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000398 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000399 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
400 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000401 }
Caroline Tice7826c882010-10-26 03:11:13 +0000402
403 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000404 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000405 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000406
407 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000408}
409
Jim Inghamefbdd222012-07-13 20:18:18 +0000410bool
411SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
412{
413 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
414
415 bool ret_val = false;
416 ProcessSP process_sp(GetSP());
417 if (process_sp)
418 {
419 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
420 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
421 }
422
423 if (log)
424 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
425 process_sp.get(), index_id, (ret_val ? "true" : "false"));
426
427 return ret_val;
428}
429
Chris Lattner24943d22010-06-08 16:52:24 +0000430SBThread
431SBProcess::GetThreadAtIndex (size_t index)
432{
Greg Claytone005f2c2010-11-06 01:53:30 +0000433 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000434
Greg Clayton90c52142012-01-30 02:53:15 +0000435 SBThread sb_thread;
436 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000437 ProcessSP process_sp(GetSP());
438 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000439 {
Greg Claytona894fe72012-04-05 16:12:35 +0000440 Process::StopLocker stop_locker;
441 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000442 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000443 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000444 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000445 }
Caroline Tice7826c882010-10-26 03:11:13 +0000446
447 if (log)
448 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000449 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000450 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000451 }
452
Greg Clayton90c52142012-01-30 02:53:15 +0000453 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000454}
455
456StateType
457SBProcess::GetState ()
458{
Caroline Tice7826c882010-10-26 03:11:13 +0000459
Caroline Tice7826c882010-10-26 03:11:13 +0000460 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000461 ProcessSP process_sp(GetSP());
462 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000463 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000464 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
465 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000466 }
Caroline Tice7826c882010-10-26 03:11:13 +0000467
Greg Claytone005f2c2010-11-06 01:53:30 +0000468 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000469 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000470 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000471 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000472 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000473
474 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000475}
476
477
478int
479SBProcess::GetExitStatus ()
480{
Greg Claytona66ba462010-10-30 04:51:46 +0000481 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000482 ProcessSP process_sp(GetSP());
483 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000484 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000485 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
486 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000487 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000488 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000489 if (log)
490 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000491 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000492
493 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000494}
495
496const char *
497SBProcess::GetExitDescription ()
498{
Greg Claytona66ba462010-10-30 04:51:46 +0000499 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000500 ProcessSP process_sp(GetSP());
501 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000502 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000503 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
504 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000505 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000506 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000507 if (log)
508 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000509 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000510 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000511}
512
513lldb::pid_t
514SBProcess::GetProcessID ()
515{
Caroline Tice7826c882010-10-26 03:11:13 +0000516 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000517 ProcessSP process_sp(GetSP());
518 if (process_sp)
519 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000520
Greg Claytone005f2c2010-11-06 01:53:30 +0000521 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000522 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000523 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000524
525 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000526}
527
Johnny Chen60a544f2011-03-01 22:56:31 +0000528ByteOrder
529SBProcess::GetByteOrder () const
530{
531 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000532 ProcessSP process_sp(GetSP());
533 if (process_sp)
534 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000535
536 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
537 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000538 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000539
540 return byteOrder;
541}
542
Chris Lattner24943d22010-06-08 16:52:24 +0000543uint32_t
544SBProcess::GetAddressByteSize () const
545{
Caroline Tice7826c882010-10-26 03:11:13 +0000546 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000547 ProcessSP process_sp(GetSP());
548 if (process_sp)
549 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000550
Greg Claytone005f2c2010-11-06 01:53:30 +0000551 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000552 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000553 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000554
555 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000556}
557
Chris Lattner24943d22010-06-08 16:52:24 +0000558SBError
559SBProcess::Continue ()
560{
Greg Claytone005f2c2010-11-06 01:53:30 +0000561 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000562
Chris Lattner24943d22010-06-08 16:52:24 +0000563 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000564 ProcessSP process_sp(GetSP());
565
566 if (log)
567 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
568
569 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000570 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000571 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000572
Greg Clayton0416bdf2012-01-30 09:04:36 +0000573 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000574 if (error.Success())
575 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000576 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000577 {
578 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000579 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
580 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000581 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000582 }
583 sb_error.SetError(error);
584 }
Chris Lattner24943d22010-06-08 16:52:24 +0000585 else
586 sb_error.SetErrorString ("SBProcess is invalid");
587
Caroline Tice7826c882010-10-26 03:11:13 +0000588 if (log)
589 {
590 SBStream sstr;
591 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000592 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000593 }
594
Chris Lattner24943d22010-06-08 16:52:24 +0000595 return sb_error;
596}
597
598
599SBError
600SBProcess::Destroy ()
601{
602 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000603 ProcessSP process_sp(GetSP());
604 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000605 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000606 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
607 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000608 }
Chris Lattner24943d22010-06-08 16:52:24 +0000609 else
610 sb_error.SetErrorString ("SBProcess is invalid");
611
Greg Claytone005f2c2010-11-06 01:53:30 +0000612 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000613 if (log)
614 {
615 SBStream sstr;
616 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000617 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000618 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000619 sb_error.get(),
620 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000621 }
622
Chris Lattner24943d22010-06-08 16:52:24 +0000623 return sb_error;
624}
625
626
627SBError
628SBProcess::Stop ()
629{
630 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000631 ProcessSP process_sp(GetSP());
632 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000633 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000634 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
635 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000636 }
Chris Lattner24943d22010-06-08 16:52:24 +0000637 else
638 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000639
Greg Claytone005f2c2010-11-06 01:53:30 +0000640 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000641 if (log)
642 {
643 SBStream sstr;
644 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000645 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000646 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000647 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000648 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000649 }
650
Chris Lattner24943d22010-06-08 16:52:24 +0000651 return sb_error;
652}
653
654SBError
655SBProcess::Kill ()
656{
657 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000658 ProcessSP process_sp(GetSP());
659 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000660 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000661 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
662 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000663 }
Chris Lattner24943d22010-06-08 16:52:24 +0000664 else
665 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000666
Greg Claytone005f2c2010-11-06 01:53:30 +0000667 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000668 if (log)
669 {
670 SBStream sstr;
671 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000672 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000673 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000674 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000675 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000676 }
677
Chris Lattner24943d22010-06-08 16:52:24 +0000678 return sb_error;
679}
680
Chris Lattner24943d22010-06-08 16:52:24 +0000681SBError
682SBProcess::Detach ()
683{
684 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000685 ProcessSP process_sp(GetSP());
686 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000687 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000688 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
689 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000690 }
Chris Lattner24943d22010-06-08 16:52:24 +0000691 else
692 sb_error.SetErrorString ("SBProcess is invalid");
693
694 return sb_error;
695}
696
697SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000698SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000699{
700 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000701 ProcessSP process_sp(GetSP());
702 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000703 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000704 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
705 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000706 }
Chris Lattner24943d22010-06-08 16:52:24 +0000707 else
708 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000709 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000710 if (log)
711 {
712 SBStream sstr;
713 sb_error.GetDescription (sstr);
714 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000715 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000716 signo,
717 sb_error.get(),
718 sstr.GetData());
719 }
Chris Lattner24943d22010-06-08 16:52:24 +0000720 return sb_error;
721}
722
Jim Ingham5d90ade2012-07-27 23:57:19 +0000723void
724SBProcess::SendAsyncInterrupt ()
725{
726 ProcessSP process_sp(GetSP());
727 if (process_sp)
728 {
729 process_sp->SendAsyncInterrupt ();
730 }
731}
732
Chris Lattner24943d22010-06-08 16:52:24 +0000733SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000734SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000735{
Greg Claytona66ba462010-10-30 04:51:46 +0000736 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000737 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000738 ProcessSP process_sp(GetSP());
739 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000740 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000741 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000742 Process::StopLocker stop_locker;
743 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
744 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000745 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000746 }
Greg Claytona66ba462010-10-30 04:51:46 +0000747
Greg Claytone005f2c2010-11-06 01:53:30 +0000748 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000749 if (log)
750 {
Greg Claytond9919d32011-12-01 23:28:38 +0000751 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000752 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000753 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000754 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000755 }
756
757 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000758}
759
Jim Inghamefbdd222012-07-13 20:18:18 +0000760SBThread
761SBProcess::GetThreadByIndexID (uint32_t index_id)
762{
763 SBThread sb_thread;
764 ThreadSP thread_sp;
765 ProcessSP process_sp(GetSP());
766 if (process_sp)
767 {
768 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
769 Process::StopLocker stop_locker;
770 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
771 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
772 sb_thread.SetThread (thread_sp);
773 }
774
775 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
776 if (log)
777 {
778 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
779 process_sp.get(),
780 index_id,
781 thread_sp.get());
782 }
783
784 return sb_thread;
785}
786
Chris Lattner24943d22010-06-08 16:52:24 +0000787StateType
788SBProcess::GetStateFromEvent (const SBEvent &event)
789{
Greg Claytone005f2c2010-11-06 01:53:30 +0000790 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000791
Caroline Tice7826c882010-10-26 03:11:13 +0000792 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
793
794 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000795 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000796 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000797
798 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000799}
800
Chris Lattner24943d22010-06-08 16:52:24 +0000801bool
802SBProcess::GetRestartedFromEvent (const SBEvent &event)
803{
Greg Clayton63094e02010-06-23 01:19:29 +0000804 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000805}
806
807SBProcess
808SBProcess::GetProcessFromEvent (const SBEvent &event)
809{
Greg Clayton63094e02010-06-23 01:19:29 +0000810 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000811 return process;
812}
813
Jim Ingham28e23862012-02-08 05:23:15 +0000814bool
815SBProcess::EventIsProcessEvent (const SBEvent &event)
816{
Jim Ingham5a15e692012-02-16 06:50:00 +0000817 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000818}
Chris Lattner24943d22010-06-08 16:52:24 +0000819
820SBBroadcaster
821SBProcess::GetBroadcaster () const
822{
Greg Claytone005f2c2010-11-06 01:53:30 +0000823 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000824
Greg Clayton0416bdf2012-01-30 09:04:36 +0000825 ProcessSP process_sp(GetSP());
826
827 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000828
829 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000830 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000831 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000832
Chris Lattner24943d22010-06-08 16:52:24 +0000833 return broadcaster;
834}
835
Jim Ingham5a15e692012-02-16 06:50:00 +0000836const char *
837SBProcess::GetBroadcasterClass ()
838{
839 return Process::GetStaticBroadcasterClass().AsCString();
840}
841
Chris Lattner24943d22010-06-08 16:52:24 +0000842size_t
843SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
844{
Greg Claytone005f2c2010-11-06 01:53:30 +0000845 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000846
Chris Lattner24943d22010-06-08 16:52:24 +0000847 size_t bytes_read = 0;
848
Greg Clayton0416bdf2012-01-30 09:04:36 +0000849 ProcessSP process_sp(GetSP());
850
Greg Claytona66ba462010-10-30 04:51:46 +0000851 if (log)
852 {
853 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000854 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000855 addr,
856 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000857 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000858 sb_error.get());
859 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000860
861 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000862 {
Greg Claytona894fe72012-04-05 16:12:35 +0000863 Process::StopLocker stop_locker;
864 if (stop_locker.TryLock(&process_sp->GetRunLock()))
865 {
866 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
867 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
868 }
869 else
870 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000871 if (log)
872 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000873 sb_error.SetErrorString("process is running");
874 }
Chris Lattner24943d22010-06-08 16:52:24 +0000875 }
876 else
877 {
878 sb_error.SetErrorString ("SBProcess is invalid");
879 }
880
Caroline Tice7826c882010-10-26 03:11:13 +0000881 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000882 {
883 SBStream sstr;
884 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000885 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000886 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000887 addr,
888 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000889 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000890 sb_error.get(),
891 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000892 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000893 }
Caroline Tice7826c882010-10-26 03:11:13 +0000894
Chris Lattner24943d22010-06-08 16:52:24 +0000895 return bytes_read;
896}
897
898size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000899SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
900{
901 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000902 ProcessSP process_sp(GetSP());
903 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000904 {
Greg Claytona894fe72012-04-05 16:12:35 +0000905 Process::StopLocker stop_locker;
906 if (stop_locker.TryLock(&process_sp->GetRunLock()))
907 {
908 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
909 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
910 }
911 else
912 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000913 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
914 if (log)
915 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000916 sb_error.SetErrorString("process is running");
917 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000918 }
919 else
920 {
921 sb_error.SetErrorString ("SBProcess is invalid");
922 }
923 return bytes_read;
924}
925
926uint64_t
927SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
928{
Greg Claytona894fe72012-04-05 16:12:35 +0000929 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000930 ProcessSP process_sp(GetSP());
931 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000932 {
Greg Claytona894fe72012-04-05 16:12:35 +0000933 Process::StopLocker stop_locker;
934 if (stop_locker.TryLock(&process_sp->GetRunLock()))
935 {
936 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
937 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
938 }
939 else
940 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000941 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
942 if (log)
943 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000944 sb_error.SetErrorString("process is running");
945 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000946 }
947 else
948 {
949 sb_error.SetErrorString ("SBProcess is invalid");
950 }
Greg Claytona894fe72012-04-05 16:12:35 +0000951 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000952}
953
954lldb::addr_t
955SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
956{
957 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000958 ProcessSP process_sp(GetSP());
959 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000960 {
Greg Claytona894fe72012-04-05 16:12:35 +0000961 Process::StopLocker stop_locker;
962 if (stop_locker.TryLock(&process_sp->GetRunLock()))
963 {
964 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
965 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
966 }
967 else
968 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000969 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
970 if (log)
971 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000972 sb_error.SetErrorString("process is running");
973 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000974 }
975 else
976 {
977 sb_error.SetErrorString ("SBProcess is invalid");
978 }
979 return ptr;
980}
981
982size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000983SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
984{
985 size_t bytes_written = 0;
986
Greg Claytone005f2c2010-11-06 01:53:30 +0000987 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000988
989 ProcessSP process_sp(GetSP());
990
Greg Claytona66ba462010-10-30 04:51:46 +0000991 if (log)
992 {
993 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000994 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000995 addr,
996 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000997 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000998 sb_error.get());
999 }
1000
Greg Clayton0416bdf2012-01-30 09:04:36 +00001001 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001002 {
Greg Claytona894fe72012-04-05 16:12:35 +00001003 Process::StopLocker stop_locker;
1004 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1005 {
1006 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1007 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1008 }
1009 else
1010 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001011 if (log)
1012 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001013 sb_error.SetErrorString("process is running");
1014 }
Chris Lattner24943d22010-06-08 16:52:24 +00001015 }
1016
Greg Claytona66ba462010-10-30 04:51:46 +00001017 if (log)
1018 {
1019 SBStream sstr;
1020 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +00001021 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001022 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001023 addr,
1024 src,
Greg Claytonbae39c52011-12-03 00:46:21 +00001025 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001026 sb_error.get(),
1027 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +00001028 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001029 }
1030
Chris Lattner24943d22010-06-08 16:52:24 +00001031 return bytes_written;
1032}
1033
Caroline Tice98f930f2010-09-20 05:20:02 +00001034bool
1035SBProcess::GetDescription (SBStream &description)
1036{
Greg Clayton96154be2011-11-13 06:57:31 +00001037 Stream &strm = description.ref();
1038
Greg Clayton0416bdf2012-01-30 09:04:36 +00001039 ProcessSP process_sp(GetSP());
1040 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001041 {
1042 char path[PATH_MAX];
1043 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001044 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001045 const char *exe_name = NULL;
1046 if (exe_module)
1047 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1048
Greg Clayton96154be2011-11-13 06:57:31 +00001049 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001050 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001051 lldb_private::StateAsCString (GetState()),
1052 GetNumThreads(),
1053 exe_name ? ", executable = " : "",
1054 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001055 }
1056 else
Greg Clayton96154be2011-11-13 06:57:31 +00001057 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001058
1059 return true;
1060}
Greg Clayton0baa3942010-11-04 01:54:29 +00001061
1062uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001063SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1064{
1065 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1066
1067 uint32_t num = 0;
1068 ProcessSP process_sp(GetSP());
1069 if (process_sp)
1070 {
1071 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1072 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1073 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1074 if (log)
1075 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1076 process_sp.get(), num);
1077 }
1078 else
1079 {
1080 sb_error.SetErrorString ("SBProcess is invalid");
1081 }
1082 return num;
1083}
1084
1085uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001086SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1087{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001088 ProcessSP process_sp(GetSP());
1089 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001090 {
Greg Claytona894fe72012-04-05 16:12:35 +00001091 Process::StopLocker stop_locker;
1092 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1093 {
1094 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1095 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1096 }
1097 else
1098 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001099 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1100 if (log)
1101 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001102 sb_error.SetErrorString("process is running");
1103 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001104 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001105 return LLDB_INVALID_IMAGE_TOKEN;
1106}
1107
1108lldb::SBError
1109SBProcess::UnloadImage (uint32_t image_token)
1110{
1111 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001112 ProcessSP process_sp(GetSP());
1113 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001114 {
Greg Claytona894fe72012-04-05 16:12:35 +00001115 Process::StopLocker stop_locker;
1116 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1117 {
1118 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1119 sb_error.SetError (process_sp->UnloadImage (image_token));
1120 }
1121 else
1122 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001123 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1124 if (log)
1125 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001126 sb_error.SetErrorString("process is running");
1127 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001128 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001129 else
1130 sb_error.SetErrorString("invalid process");
1131 return sb_error;
1132}