blob: 933117a56f42ed8c80cfa5b5f25beb050c141835 [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
Jim Inghamfee26ee2012-10-26 19:18:04 +000084const char *
85SBProcess::GetPluginName ()
86{
87 ProcessSP process_sp(GetSP());
88 if (process_sp)
89 {
90 return process_sp->GetPluginName();
91 }
92 return "<Unknown>";
93}
94
95const char *
96SBProcess::GetShortPluginName ()
97{
98 ProcessSP process_sp(GetSP());
99 if (process_sp)
100 {
101 return process_sp->GetShortPluginName();
102 }
103 return "<Unknown>";
104}
105
106
Greg Clayton334d33a2012-01-30 07:41:31 +0000107lldb::ProcessSP
108SBProcess::GetSP() const
109{
Greg Claytonbcaf99a2012-07-12 20:32:19 +0000110 return m_opaque_wp.lock();
Greg Clayton334d33a2012-01-30 07:41:31 +0000111}
112
Chris Lattner24943d22010-06-08 16:52:24 +0000113void
Greg Clayton334d33a2012-01-30 07:41:31 +0000114SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000115{
Greg Claytonbcaf99a2012-07-12 20:32:19 +0000116 m_opaque_wp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000117}
118
119void
120SBProcess::Clear ()
121{
Greg Claytonbcaf99a2012-07-12 20:32:19 +0000122 m_opaque_wp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000123}
124
125
126bool
127SBProcess::IsValid() const
128{
Jim Inghamd0bdddf2012-08-22 21:34:33 +0000129 ProcessSP process_sp(m_opaque_wp.lock());
130 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner24943d22010-06-08 16:52:24 +0000131}
132
James McIlree38093402011-03-04 00:31:13 +0000133bool
134SBProcess::RemoteLaunch (char const **argv,
135 char const **envp,
136 const char *stdin_path,
137 const char *stdout_path,
138 const char *stderr_path,
139 const char *working_directory,
140 uint32_t launch_flags,
141 bool stop_at_entry,
142 lldb::SBError& error)
143{
144 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
145 if (log) {
146 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 +0000147 m_opaque_wp.lock().get(),
James McIlree38093402011-03-04 00:31:13 +0000148 argv,
149 envp,
150 stdin_path ? stdin_path : "NULL",
151 stdout_path ? stdout_path : "NULL",
152 stderr_path ? stderr_path : "NULL",
153 working_directory ? working_directory : "NULL",
154 launch_flags,
155 stop_at_entry,
156 error.get());
157 }
158
Greg Clayton0416bdf2012-01-30 09:04:36 +0000159 ProcessSP process_sp(GetSP());
160 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000161 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000162 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
163 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000164 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000165 if (stop_at_entry)
166 launch_flags |= eLaunchFlagStopAtEntry;
167 ProcessLaunchInfo launch_info (stdin_path,
168 stdout_path,
169 stderr_path,
170 working_directory,
171 launch_flags);
172 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
173 if (exe_module)
174 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
175 if (argv)
176 launch_info.GetArguments().AppendArguments (argv);
177 if (envp)
178 launch_info.GetEnvironmentEntries ().SetArguments (envp);
179 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000180 }
181 else
182 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000183 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree38093402011-03-04 00:31:13 +0000184 }
185 }
186 else
187 {
188 error.SetErrorString ("unable to attach pid");
189 }
190
191 if (log) {
192 SBStream sstr;
193 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000194 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000195 }
196
197 return error.Success();
198}
199
200bool
201SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
202{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000203 ProcessSP process_sp(GetSP());
204 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000205 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000206 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
207 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000208 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000209 ProcessAttachInfo attach_info;
210 attach_info.SetProcessID (pid);
211 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000212 }
213 else
214 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000215 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree38093402011-03-04 00:31:13 +0000216 }
217 }
218 else
219 {
220 error.SetErrorString ("unable to attach pid");
221 }
222
223 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
224 if (log) {
225 SBStream sstr;
226 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000227 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000228 }
229
230 return error.Success();
231}
232
Chris Lattner24943d22010-06-08 16:52:24 +0000233
234uint32_t
235SBProcess::GetNumThreads ()
236{
Greg Claytone005f2c2010-11-06 01:53:30 +0000237 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000238
Caroline Tice7826c882010-10-26 03:11:13 +0000239 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000240 ProcessSP process_sp(GetSP());
241 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000242 {
Greg Claytona894fe72012-04-05 16:12:35 +0000243 Process::StopLocker stop_locker;
244
245 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000246 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000247 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000248 }
Caroline Tice7826c882010-10-26 03:11:13 +0000249
250 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000251 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000252
253 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000254}
255
256SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000257SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000258{
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 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000262 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000263 ProcessSP process_sp(GetSP());
264 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000265 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000266 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
267 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000268 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000269 }
Caroline Tice7826c882010-10-26 03:11:13 +0000270
271 if (log)
272 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000273 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000274 }
275
Chris Lattner24943d22010-06-08 16:52:24 +0000276 return sb_thread;
277}
278
279SBTarget
280SBProcess::GetTarget() const
281{
Greg Claytone005f2c2010-11-06 01:53:30 +0000282 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000283
Chris Lattner24943d22010-06-08 16:52:24 +0000284 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000285 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000286 ProcessSP process_sp(GetSP());
287 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000288 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000289 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000290 sb_target.SetSP (target_sp);
291 }
Caroline Tice7826c882010-10-26 03:11:13 +0000292
293 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000294 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000295
Chris Lattner24943d22010-06-08 16:52:24 +0000296 return sb_target;
297}
298
299
300size_t
301SBProcess::PutSTDIN (const char *src, size_t src_len)
302{
Greg Claytone005f2c2010-11-06 01:53:30 +0000303 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000304
Caroline Tice7826c882010-10-26 03:11:13 +0000305 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000306 ProcessSP process_sp(GetSP());
307 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000308 {
309 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000310 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000311 }
Caroline Tice7826c882010-10-26 03:11:13 +0000312
313 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000314 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000315 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000316 src,
317 (uint32_t) src_len,
318 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000319
320 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000321}
322
323size_t
324SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
325{
Greg Clayton49ce6822010-10-31 03:01:06 +0000326 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000327 ProcessSP process_sp(GetSP());
328 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000329 {
330 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000331 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000332 }
Caroline Tice7826c882010-10-26 03:11:13 +0000333
Greg Claytone005f2c2010-11-06 01:53:30 +0000334 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000335 if (log)
Greg Clayton851e30e2012-09-18 18:04:04 +0000336 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu",
337 process_sp.get(),
338 (int) bytes_read,
339 dst,
340 (uint64_t)dst_len,
341 (uint64_t)bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000342
Greg Clayton49ce6822010-10-31 03:01:06 +0000343 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000344}
345
346size_t
347SBProcess::GetSTDERR (char *dst, size_t dst_len) const
348{
Greg Clayton49ce6822010-10-31 03:01:06 +0000349 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000350 ProcessSP process_sp(GetSP());
351 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000352 {
353 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000354 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000355 }
Caroline Tice7826c882010-10-26 03:11:13 +0000356
Greg Claytone005f2c2010-11-06 01:53:30 +0000357 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000358 if (log)
Greg Clayton851e30e2012-09-18 18:04:04 +0000359 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu",
360 process_sp.get(),
361 (int) bytes_read,
362 dst,
363 (uint64_t)dst_len,
364 (uint64_t)bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000365
Greg Clayton49ce6822010-10-31 03:01:06 +0000366 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000367}
368
369void
Jim Inghamc8332952010-08-26 21:32:51 +0000370SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000371{
372 if (out == NULL)
373 return;
374
Greg Clayton0416bdf2012-01-30 09:04:36 +0000375 ProcessSP process_sp(GetSP());
376 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000377 {
378 const StateType event_state = SBProcess::GetStateFromEvent (event);
379 char message[1024];
380 int message_len = ::snprintf (message,
381 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000382 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000383 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000384 SBDebugger::StateAsCString (event_state));
385
386 if (message_len > 0)
387 ::fwrite (message, 1, message_len, out);
388 }
389}
390
391void
Jim Inghamc8332952010-08-26 21:32:51 +0000392SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000393{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000394 ProcessSP process_sp(GetSP());
395 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000396 {
397 const StateType event_state = SBProcess::GetStateFromEvent (event);
398 char message[1024];
399 ::snprintf (message,
400 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000401 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000402 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000403 SBDebugger::StateAsCString (event_state));
404
405 result.AppendMessage (message);
406 }
407}
408
409bool
Jim Inghamc8332952010-08-26 21:32:51 +0000410SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000411{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000412 ProcessSP process_sp(GetSP());
413 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000414 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000415 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
416 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000417 }
Chris Lattner24943d22010-06-08 16:52:24 +0000418 return false;
419}
420
421bool
Jim Inghamc8332952010-08-26 21:32:51 +0000422SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000423{
Greg Clayton82560f22012-10-12 23:32:11 +0000424 return SetSelectedThreadByID ((lldb::tid_t)tid);
425}
426
427bool
428SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
429{
Greg Claytone005f2c2010-11-06 01:53:30 +0000430 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000431
Caroline Tice7826c882010-10-26 03:11:13 +0000432 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000433 ProcessSP process_sp(GetSP());
434 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000435 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000436 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
437 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000438 }
Caroline Tice7826c882010-10-26 03:11:13 +0000439
440 if (log)
Greg Clayton82560f22012-10-12 23:32:11 +0000441 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4llx) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000442 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000443
444 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000445}
446
Jim Inghamefbdd222012-07-13 20:18:18 +0000447bool
448SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
449{
450 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
451
452 bool ret_val = false;
453 ProcessSP process_sp(GetSP());
454 if (process_sp)
455 {
456 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
457 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
458 }
459
460 if (log)
461 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
462 process_sp.get(), index_id, (ret_val ? "true" : "false"));
463
464 return ret_val;
465}
466
Chris Lattner24943d22010-06-08 16:52:24 +0000467SBThread
468SBProcess::GetThreadAtIndex (size_t index)
469{
Greg Claytone005f2c2010-11-06 01:53:30 +0000470 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000471
Greg Clayton90c52142012-01-30 02:53:15 +0000472 SBThread sb_thread;
473 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000474 ProcessSP process_sp(GetSP());
475 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000476 {
Greg Claytona894fe72012-04-05 16:12:35 +0000477 Process::StopLocker stop_locker;
478 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Clayton0416bdf2012-01-30 09:04:36 +0000479 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000480 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000481 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000482 }
Caroline Tice7826c882010-10-26 03:11:13 +0000483
484 if (log)
485 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000486 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000487 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000488 }
489
Greg Clayton90c52142012-01-30 02:53:15 +0000490 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000491}
492
493StateType
494SBProcess::GetState ()
495{
Caroline Tice7826c882010-10-26 03:11:13 +0000496
Caroline Tice7826c882010-10-26 03:11:13 +0000497 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000498 ProcessSP process_sp(GetSP());
499 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000500 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000501 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
502 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000503 }
Caroline Tice7826c882010-10-26 03:11:13 +0000504
Greg Claytone005f2c2010-11-06 01:53:30 +0000505 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000506 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000507 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000508 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000509 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000510
511 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000512}
513
514
515int
516SBProcess::GetExitStatus ()
517{
Greg Claytona66ba462010-10-30 04:51:46 +0000518 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000519 ProcessSP process_sp(GetSP());
520 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000521 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000522 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
523 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000524 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000525 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000526 if (log)
527 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000528 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000529
530 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000531}
532
533const char *
534SBProcess::GetExitDescription ()
535{
Greg Claytona66ba462010-10-30 04:51:46 +0000536 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000537 ProcessSP process_sp(GetSP());
538 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000539 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000540 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
541 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000542 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000543 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000544 if (log)
545 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000546 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000547 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000548}
549
550lldb::pid_t
551SBProcess::GetProcessID ()
552{
Caroline Tice7826c882010-10-26 03:11:13 +0000553 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000554 ProcessSP process_sp(GetSP());
555 if (process_sp)
556 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000557
Greg Claytone005f2c2010-11-06 01:53:30 +0000558 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000559 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000560 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000561
562 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000563}
564
Johnny Chen60a544f2011-03-01 22:56:31 +0000565ByteOrder
566SBProcess::GetByteOrder () const
567{
568 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000569 ProcessSP process_sp(GetSP());
570 if (process_sp)
571 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000572
573 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
574 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000575 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000576
577 return byteOrder;
578}
579
Chris Lattner24943d22010-06-08 16:52:24 +0000580uint32_t
581SBProcess::GetAddressByteSize () const
582{
Caroline Tice7826c882010-10-26 03:11:13 +0000583 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000584 ProcessSP process_sp(GetSP());
585 if (process_sp)
586 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000587
Greg Claytone005f2c2010-11-06 01:53:30 +0000588 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000589 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000590 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000591
592 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000593}
594
Chris Lattner24943d22010-06-08 16:52:24 +0000595SBError
596SBProcess::Continue ()
597{
Greg Claytone005f2c2010-11-06 01:53:30 +0000598 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000599
Chris Lattner24943d22010-06-08 16:52:24 +0000600 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000601 ProcessSP process_sp(GetSP());
602
603 if (log)
604 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
605
606 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000607 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000608 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000609
Greg Clayton0416bdf2012-01-30 09:04:36 +0000610 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000611 if (error.Success())
612 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000613 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000614 {
615 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000616 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
617 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000618 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000619 }
620 sb_error.SetError(error);
621 }
Chris Lattner24943d22010-06-08 16:52:24 +0000622 else
623 sb_error.SetErrorString ("SBProcess is invalid");
624
Caroline Tice7826c882010-10-26 03:11:13 +0000625 if (log)
626 {
627 SBStream sstr;
628 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000629 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000630 }
631
Chris Lattner24943d22010-06-08 16:52:24 +0000632 return sb_error;
633}
634
635
636SBError
637SBProcess::Destroy ()
638{
639 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000640 ProcessSP process_sp(GetSP());
641 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000642 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000643 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
644 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000645 }
Chris Lattner24943d22010-06-08 16:52:24 +0000646 else
647 sb_error.SetErrorString ("SBProcess is invalid");
648
Greg Claytone005f2c2010-11-06 01:53:30 +0000649 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000650 if (log)
651 {
652 SBStream sstr;
653 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000654 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000655 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000656 sb_error.get(),
657 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000658 }
659
Chris Lattner24943d22010-06-08 16:52:24 +0000660 return sb_error;
661}
662
663
664SBError
665SBProcess::Stop ()
666{
667 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000668 ProcessSP process_sp(GetSP());
669 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000670 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000671 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
672 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000673 }
Chris Lattner24943d22010-06-08 16:52:24 +0000674 else
675 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000676
Greg Claytone005f2c2010-11-06 01:53:30 +0000677 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000678 if (log)
679 {
680 SBStream sstr;
681 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000682 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000683 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000684 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000685 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000686 }
687
Chris Lattner24943d22010-06-08 16:52:24 +0000688 return sb_error;
689}
690
691SBError
692SBProcess::Kill ()
693{
694 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000695 ProcessSP process_sp(GetSP());
696 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000697 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000698 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
699 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000700 }
Chris Lattner24943d22010-06-08 16:52:24 +0000701 else
702 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000703
Greg Claytone005f2c2010-11-06 01:53:30 +0000704 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000705 if (log)
706 {
707 SBStream sstr;
708 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000709 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000710 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000711 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000712 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000713 }
714
Chris Lattner24943d22010-06-08 16:52:24 +0000715 return sb_error;
716}
717
Chris Lattner24943d22010-06-08 16:52:24 +0000718SBError
719SBProcess::Detach ()
720{
721 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000722 ProcessSP process_sp(GetSP());
723 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000724 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000725 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
726 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000727 }
Chris Lattner24943d22010-06-08 16:52:24 +0000728 else
729 sb_error.SetErrorString ("SBProcess is invalid");
730
731 return sb_error;
732}
733
734SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000735SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000736{
737 SBError sb_error;
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());
742 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000743 }
Chris Lattner24943d22010-06-08 16:52:24 +0000744 else
745 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000746 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000747 if (log)
748 {
749 SBStream sstr;
750 sb_error.GetDescription (sstr);
751 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000752 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000753 signo,
754 sb_error.get(),
755 sstr.GetData());
756 }
Chris Lattner24943d22010-06-08 16:52:24 +0000757 return sb_error;
758}
759
Jim Ingham5d90ade2012-07-27 23:57:19 +0000760void
761SBProcess::SendAsyncInterrupt ()
762{
763 ProcessSP process_sp(GetSP());
764 if (process_sp)
765 {
766 process_sp->SendAsyncInterrupt ();
767 }
768}
769
Chris Lattner24943d22010-06-08 16:52:24 +0000770SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000771SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000772{
Greg Claytona66ba462010-10-30 04:51:46 +0000773 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000774 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000775 ProcessSP process_sp(GetSP());
776 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000777 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000778 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytona894fe72012-04-05 16:12:35 +0000779 Process::StopLocker stop_locker;
780 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
781 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton90c52142012-01-30 02:53:15 +0000782 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000783 }
Greg Claytona66ba462010-10-30 04:51:46 +0000784
Greg Claytone005f2c2010-11-06 01:53:30 +0000785 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000786 if (log)
787 {
Greg Claytond9919d32011-12-01 23:28:38 +0000788 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000789 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000790 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000791 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000792 }
793
794 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000795}
796
Jim Inghamefbdd222012-07-13 20:18:18 +0000797SBThread
798SBProcess::GetThreadByIndexID (uint32_t index_id)
799{
800 SBThread sb_thread;
801 ThreadSP thread_sp;
802 ProcessSP process_sp(GetSP());
803 if (process_sp)
804 {
805 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
806 Process::StopLocker stop_locker;
807 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
808 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
809 sb_thread.SetThread (thread_sp);
810 }
811
812 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
813 if (log)
814 {
815 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
816 process_sp.get(),
817 index_id,
818 thread_sp.get());
819 }
820
821 return sb_thread;
822}
823
Chris Lattner24943d22010-06-08 16:52:24 +0000824StateType
825SBProcess::GetStateFromEvent (const SBEvent &event)
826{
Greg Claytone005f2c2010-11-06 01:53:30 +0000827 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000828
Caroline Tice7826c882010-10-26 03:11:13 +0000829 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
830
831 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000832 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000833 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000834
835 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000836}
837
Chris Lattner24943d22010-06-08 16:52:24 +0000838bool
839SBProcess::GetRestartedFromEvent (const SBEvent &event)
840{
Greg Clayton63094e02010-06-23 01:19:29 +0000841 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000842}
843
844SBProcess
845SBProcess::GetProcessFromEvent (const SBEvent &event)
846{
Greg Clayton63094e02010-06-23 01:19:29 +0000847 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000848 return process;
849}
850
Jim Ingham28e23862012-02-08 05:23:15 +0000851bool
852SBProcess::EventIsProcessEvent (const SBEvent &event)
853{
Jim Ingham5a15e692012-02-16 06:50:00 +0000854 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000855}
Chris Lattner24943d22010-06-08 16:52:24 +0000856
857SBBroadcaster
858SBProcess::GetBroadcaster () const
859{
Greg Claytone005f2c2010-11-06 01:53:30 +0000860 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000861
Greg Clayton0416bdf2012-01-30 09:04:36 +0000862 ProcessSP process_sp(GetSP());
863
864 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000865
866 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000867 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000868 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000869
Chris Lattner24943d22010-06-08 16:52:24 +0000870 return broadcaster;
871}
872
Jim Ingham5a15e692012-02-16 06:50:00 +0000873const char *
874SBProcess::GetBroadcasterClass ()
875{
876 return Process::GetStaticBroadcasterClass().AsCString();
877}
878
Chris Lattner24943d22010-06-08 16:52:24 +0000879size_t
880SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
881{
Greg Claytone005f2c2010-11-06 01:53:30 +0000882 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000883
Chris Lattner24943d22010-06-08 16:52:24 +0000884 size_t bytes_read = 0;
885
Greg Clayton0416bdf2012-01-30 09:04:36 +0000886 ProcessSP process_sp(GetSP());
887
Greg Claytona66ba462010-10-30 04:51:46 +0000888 if (log)
889 {
Greg Clayton851e30e2012-09-18 18:04:04 +0000890 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000891 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000892 addr,
893 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000894 (uint64_t)dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000895 sb_error.get());
896 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000897
898 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000899 {
Greg Claytona894fe72012-04-05 16:12:35 +0000900 Process::StopLocker stop_locker;
901 if (stop_locker.TryLock(&process_sp->GetRunLock()))
902 {
903 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
904 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
905 }
906 else
907 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000908 if (log)
909 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000910 sb_error.SetErrorString("process is running");
911 }
Chris Lattner24943d22010-06-08 16:52:24 +0000912 }
913 else
914 {
915 sb_error.SetErrorString ("SBProcess is invalid");
916 }
917
Caroline Tice7826c882010-10-26 03:11:13 +0000918 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000919 {
920 SBStream sstr;
921 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +0000922 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000923 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000924 addr,
925 dst,
Greg Clayton851e30e2012-09-18 18:04:04 +0000926 (uint64_t)dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000927 sb_error.get(),
928 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +0000929 (uint64_t)bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000930 }
Caroline Tice7826c882010-10-26 03:11:13 +0000931
Chris Lattner24943d22010-06-08 16:52:24 +0000932 return bytes_read;
933}
934
935size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000936SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
937{
938 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000939 ProcessSP process_sp(GetSP());
940 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000941 {
Greg Claytona894fe72012-04-05 16:12:35 +0000942 Process::StopLocker stop_locker;
943 if (stop_locker.TryLock(&process_sp->GetRunLock()))
944 {
945 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
946 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
947 }
948 else
949 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000950 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
951 if (log)
952 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000953 sb_error.SetErrorString("process is running");
954 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000955 }
956 else
957 {
958 sb_error.SetErrorString ("SBProcess is invalid");
959 }
960 return bytes_read;
961}
962
963uint64_t
964SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
965{
Greg Claytona894fe72012-04-05 16:12:35 +0000966 uint64_t value = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000967 ProcessSP process_sp(GetSP());
968 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000969 {
Greg Claytona894fe72012-04-05 16:12:35 +0000970 Process::StopLocker stop_locker;
971 if (stop_locker.TryLock(&process_sp->GetRunLock()))
972 {
973 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
974 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
975 }
976 else
977 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +0000978 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
979 if (log)
980 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +0000981 sb_error.SetErrorString("process is running");
982 }
Greg Clayton4a2e3372011-12-15 03:14:23 +0000983 }
984 else
985 {
986 sb_error.SetErrorString ("SBProcess is invalid");
987 }
Greg Claytona894fe72012-04-05 16:12:35 +0000988 return value;
Greg Clayton4a2e3372011-12-15 03:14:23 +0000989}
990
991lldb::addr_t
992SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
993{
994 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000995 ProcessSP process_sp(GetSP());
996 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000997 {
Greg Claytona894fe72012-04-05 16:12:35 +0000998 Process::StopLocker stop_locker;
999 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1000 {
1001 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1002 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1003 }
1004 else
1005 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001006 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1007 if (log)
1008 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001009 sb_error.SetErrorString("process is running");
1010 }
Greg Clayton4a2e3372011-12-15 03:14:23 +00001011 }
1012 else
1013 {
1014 sb_error.SetErrorString ("SBProcess is invalid");
1015 }
1016 return ptr;
1017}
1018
1019size_t
Chris Lattner24943d22010-06-08 16:52:24 +00001020SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1021{
1022 size_t bytes_written = 0;
1023
Greg Claytone005f2c2010-11-06 01:53:30 +00001024 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001025
1026 ProcessSP process_sp(GetSP());
1027
Greg Claytona66ba462010-10-30 04:51:46 +00001028 if (log)
1029 {
Greg Clayton851e30e2012-09-18 18:04:04 +00001030 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001031 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001032 addr,
1033 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001034 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001035 sb_error.get());
1036 }
1037
Greg Clayton0416bdf2012-01-30 09:04:36 +00001038 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001039 {
Greg Claytona894fe72012-04-05 16:12:35 +00001040 Process::StopLocker stop_locker;
1041 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1042 {
1043 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1044 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1045 }
1046 else
1047 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001048 if (log)
1049 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001050 sb_error.SetErrorString("process is running");
1051 }
Chris Lattner24943d22010-06-08 16:52:24 +00001052 }
1053
Greg Claytona66ba462010-10-30 04:51:46 +00001054 if (log)
1055 {
1056 SBStream sstr;
1057 sb_error.GetDescription (sstr);
Greg Clayton851e30e2012-09-18 18:04:04 +00001058 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001059 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +00001060 addr,
1061 src,
Greg Clayton851e30e2012-09-18 18:04:04 +00001062 (uint64_t)src_len,
Greg Claytona66ba462010-10-30 04:51:46 +00001063 sb_error.get(),
1064 sstr.GetData(),
Greg Clayton851e30e2012-09-18 18:04:04 +00001065 (uint64_t)bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +00001066 }
1067
Chris Lattner24943d22010-06-08 16:52:24 +00001068 return bytes_written;
1069}
1070
Caroline Tice98f930f2010-09-20 05:20:02 +00001071bool
1072SBProcess::GetDescription (SBStream &description)
1073{
Greg Clayton96154be2011-11-13 06:57:31 +00001074 Stream &strm = description.ref();
1075
Greg Clayton0416bdf2012-01-30 09:04:36 +00001076 ProcessSP process_sp(GetSP());
1077 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001078 {
1079 char path[PATH_MAX];
1080 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +00001081 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +00001082 const char *exe_name = NULL;
1083 if (exe_module)
1084 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1085
Greg Clayton96154be2011-11-13 06:57:31 +00001086 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +00001087 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +00001088 lldb_private::StateAsCString (GetState()),
1089 GetNumThreads(),
1090 exe_name ? ", executable = " : "",
1091 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +00001092 }
1093 else
Greg Clayton96154be2011-11-13 06:57:31 +00001094 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001095
1096 return true;
1097}
Greg Clayton0baa3942010-11-04 01:54:29 +00001098
1099uint32_t
Johnny Chen191343e2012-05-23 22:34:34 +00001100SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1101{
1102 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1103
1104 uint32_t num = 0;
1105 ProcessSP process_sp(GetSP());
1106 if (process_sp)
1107 {
1108 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1109 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chen191343e2012-05-23 22:34:34 +00001110 if (log)
1111 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1112 process_sp.get(), num);
1113 }
1114 else
1115 {
1116 sb_error.SetErrorString ("SBProcess is invalid");
1117 }
1118 return num;
1119}
1120
1121uint32_t
Greg Clayton0baa3942010-11-04 01:54:29 +00001122SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1123{
Greg Clayton0416bdf2012-01-30 09:04:36 +00001124 ProcessSP process_sp(GetSP());
1125 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001126 {
Greg Claytona894fe72012-04-05 16:12:35 +00001127 Process::StopLocker stop_locker;
1128 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1129 {
1130 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1131 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1132 }
1133 else
1134 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001135 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1136 if (log)
1137 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001138 sb_error.SetErrorString("process is running");
1139 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001140 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001141 return LLDB_INVALID_IMAGE_TOKEN;
1142}
1143
1144lldb::SBError
1145SBProcess::UnloadImage (uint32_t image_token)
1146{
1147 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +00001148 ProcessSP process_sp(GetSP());
1149 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +00001150 {
Greg Claytona894fe72012-04-05 16:12:35 +00001151 Process::StopLocker stop_locker;
1152 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1153 {
1154 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1155 sb_error.SetError (process_sp->UnloadImage (image_token));
1156 }
1157 else
1158 {
Greg Clayton9f3c98e2012-04-06 02:17:47 +00001159 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1160 if (log)
1161 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Claytona894fe72012-04-05 16:12:35 +00001162 sb_error.SetErrorString("process is running");
1163 }
Greg Claytonbdcda462010-12-20 20:49:23 +00001164 }
Greg Clayton0baa3942010-11-04 01:54:29 +00001165 else
1166 sb_error.SetErrorString("invalid process");
1167 return sb_error;
1168}