blob: 51cc3406c72b28fac1f90b91cf6e4ae6a167d20b [file] [log] [blame]
Chris Lattner30fdc8d2010-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 Friedman4c5de692010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011
12#include "lldb/lldb-defines.h"
13#include "lldb/lldb-types.h"
14
Jim Ingham40af72e2010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Greg Clayton5d5028b2010-10-06 03:53:16 +000016#include "lldb/Core/Debugger.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000017#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000018#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-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 Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Target/RegisterContext.h"
Greg Clayton66111032010-06-23 01:19:29 +000024#include "lldb/Target/Target.h"
25#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
27// Project includes
28
Eli Friedman4c5de692010-06-09 07:44:37 +000029#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000030#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000031#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000032#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000033#include "lldb/API/SBFileSpec.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000034#include "lldb/API/SBThread.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000035#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000036#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037
38using namespace lldb;
39using namespace lldb_private;
40
41
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000043 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044{
45}
46
47
48//----------------------------------------------------------------------
49// SBProcess constructor
50//----------------------------------------------------------------------
51
52SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000053 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000054{
55}
56
57
58SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000059 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060{
61}
62
Greg Claytonefabb122010-11-05 23:17:00 +000063const SBProcess&
64SBProcess::operator = (const SBProcess& rhs)
65{
66 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000067 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000068 return *this;
69}
70
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071//----------------------------------------------------------------------
72// Destructor
73//----------------------------------------------------------------------
74SBProcess::~SBProcess()
75{
76}
77
Jim Ingham4bddaeb2012-02-16 06:50:00 +000078const char *
79SBProcess::GetBroadcasterClassName ()
80{
81 return Process::GetStaticBroadcasterClass().AsCString();
82}
83
Jim Inghamd7b30ef2012-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 Claytonb9556ac2012-01-30 07:41:31 +0000107lldb::ProcessSP
108SBProcess::GetSP() const
109{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000110 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000111}
112
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000114SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000115{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000116 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117}
118
119void
120SBProcess::Clear ()
121{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000122 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123}
124
125
126bool
127SBProcess::IsValid() const
128{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000129 ProcessSP process_sp(m_opaque_wp.lock());
130 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131}
132
James McIlree9631aae2011-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 Clayton4e0fe8a2012-07-12 20:32:19 +0000147 m_opaque_wp.lock().get(),
James McIlree9631aae2011-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 Claytonacdbe812012-01-30 09:04:36 +0000159 ProcessSP process_sp(GetSP());
160 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000161 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000162 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
163 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000164 {
Greg Claytonc9858e42012-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 McIlree9631aae2011-03-04 00:31:13 +0000180 }
181 else
182 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000183 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-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 Claytonacdbe812012-01-30 09:04:36 +0000194 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree9631aae2011-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 Claytonacdbe812012-01-30 09:04:36 +0000203 ProcessSP process_sp(GetSP());
204 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000205 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000206 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
207 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000208 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000209 ProcessAttachInfo attach_info;
210 attach_info.SetProcessID (pid);
211 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000212 }
213 else
214 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000215 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-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 Claytonacdbe812012-01-30 09:04:36 +0000227 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000228 }
229
230 return error.Success();
231}
232
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000233
234uint32_t
235SBProcess::GetNumThreads ()
236{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000237 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000238
Caroline Ticeceb6b132010-10-26 03:11:13 +0000239 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000240 ProcessSP process_sp(GetSP());
241 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000243 Process::StopLocker stop_locker;
244
245 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000246 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000247 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000249
250 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000251 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000252
253 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000254}
255
256SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000257SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000259 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000260
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000262 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000263 ProcessSP process_sp(GetSP());
264 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000265 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000266 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
267 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000268 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000269 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000270
271 if (log)
272 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000273 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000274 }
275
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000276 return sb_thread;
277}
278
279SBTarget
280SBProcess::GetTarget() const
281{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000282 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000283
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000285 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000286 ProcessSP process_sp(GetSP());
287 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000288 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000289 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000290 sb_target.SetSP (target_sp);
291 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000292
293 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000294 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000295
Chris Lattner30fdc8d2010-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 Clayton2d4edfb2010-11-06 01:53:30 +0000303 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000304
Caroline Ticeceb6b132010-10-26 03:11:13 +0000305 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000306 ProcessSP process_sp(GetSP());
307 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000308 {
309 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000310 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000311 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000312
313 if (log)
Jason Molendafd54b362011-09-20 21:44:10 +0000314 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Claytonacdbe812012-01-30 09:04:36 +0000315 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000316 src,
317 (uint32_t) src_len,
318 ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000319
320 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321}
322
323size_t
324SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
325{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000326 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000327 ProcessSP process_sp(GetSP());
328 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329 {
330 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000331 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000333
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000334 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000335 if (log)
Greg Clayton43e0af02012-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 Ticeceb6b132010-10-26 03:11:13 +0000342
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000343 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344}
345
346size_t
347SBProcess::GetSTDERR (char *dst, size_t dst_len) const
348{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000349 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000350 ProcessSP process_sp(GetSP());
351 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000352 {
353 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000354 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000355 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000356
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000357 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000358 if (log)
Greg Clayton43e0af02012-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 Ticeceb6b132010-10-26 03:11:13 +0000365
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000366 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000367}
368
369void
Jim Ingham2976d002010-08-26 21:32:51 +0000370SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000371{
372 if (out == NULL)
373 return;
374
Greg Claytonacdbe812012-01-30 09:04:36 +0000375 ProcessSP process_sp(GetSP());
376 if (process_sp)
Chris Lattner30fdc8d2010-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 Clayton81c22f62011-10-19 18:09:39 +0000382 "Process %llu %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000383 process_sp->GetID(),
Chris Lattner30fdc8d2010-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 Ingham2976d002010-08-26 21:32:51 +0000392SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393{
Greg Claytonacdbe812012-01-30 09:04:36 +0000394 ProcessSP process_sp(GetSP());
395 if (process_sp)
Chris Lattner30fdc8d2010-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 Clayton81c22f62011-10-19 18:09:39 +0000401 "Process %llu %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000402 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000403 SBDebugger::StateAsCString (event_state));
404
405 result.AppendMessage (message);
406 }
407}
408
409bool
Jim Ingham2976d002010-08-26 21:32:51 +0000410SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000411{
Greg Claytonacdbe812012-01-30 09:04:36 +0000412 ProcessSP process_sp(GetSP());
413 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000414 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000415 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
416 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000417 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000418 return false;
419}
420
421bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000422SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
423{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000424 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000425
Caroline Ticeceb6b132010-10-26 03:11:13 +0000426 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000427 ProcessSP process_sp(GetSP());
428 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000429 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000430 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
431 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000432 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000433
434 if (log)
Greg Claytonea561dc2012-10-12 23:32:11 +0000435 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4llx) => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000436 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000437
438 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000439}
440
Jim Ingham18b46892012-07-13 20:18:18 +0000441bool
442SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
443{
444 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
445
446 bool ret_val = false;
447 ProcessSP process_sp(GetSP());
448 if (process_sp)
449 {
450 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
451 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
452 }
453
454 if (log)
455 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
456 process_sp.get(), index_id, (ret_val ? "true" : "false"));
457
458 return ret_val;
459}
460
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461SBThread
462SBProcess::GetThreadAtIndex (size_t index)
463{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000464 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000465
Greg Clayton17a6ad02012-01-30 02:53:15 +0000466 SBThread sb_thread;
467 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000468 ProcessSP process_sp(GetSP());
469 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000470 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000471 Process::StopLocker stop_locker;
472 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000473 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000474 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000475 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000476 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000477
478 if (log)
479 {
Greg Clayton93aa84e2010-10-29 04:59:35 +0000480 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000481 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000482 }
483
Greg Clayton17a6ad02012-01-30 02:53:15 +0000484 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485}
486
487StateType
488SBProcess::GetState ()
489{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000490
Caroline Ticeceb6b132010-10-26 03:11:13 +0000491 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000492 ProcessSP process_sp(GetSP());
493 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000494 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000495 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
496 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000497 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000498
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000499 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000500 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000501 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000502 process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000503 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000504
505 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506}
507
508
509int
510SBProcess::GetExitStatus ()
511{
Greg Clayton48381312010-10-30 04:51:46 +0000512 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000513 ProcessSP process_sp(GetSP());
514 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000515 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000516 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
517 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000518 }
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000519 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000520 if (log)
521 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000522 process_sp.get(), exit_status, exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000523
524 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525}
526
527const char *
528SBProcess::GetExitDescription ()
529{
Greg Clayton48381312010-10-30 04:51:46 +0000530 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000531 ProcessSP process_sp(GetSP());
532 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000533 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000534 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
535 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000536 }
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000537 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000538 if (log)
539 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000540 process_sp.get(), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000541 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000542}
543
544lldb::pid_t
545SBProcess::GetProcessID ()
546{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000547 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000548 ProcessSP process_sp(GetSP());
549 if (process_sp)
550 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000551
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000552 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000553 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000554 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000555
556 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557}
558
Johnny Chencf386e22011-03-01 22:56:31 +0000559ByteOrder
560SBProcess::GetByteOrder () const
561{
562 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000563 ProcessSP process_sp(GetSP());
564 if (process_sp)
565 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chencf386e22011-03-01 22:56:31 +0000566
567 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
568 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000569 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000570
571 return byteOrder;
572}
573
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000574uint32_t
575SBProcess::GetAddressByteSize () const
576{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000577 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000578 ProcessSP process_sp(GetSP());
579 if (process_sp)
580 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000581
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000582 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000583 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000584 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000585
586 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000587}
588
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000589SBError
590SBProcess::Continue ()
591{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000592 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000593
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000595 ProcessSP process_sp(GetSP());
596
597 if (log)
598 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
599
600 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000601 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000602 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton0c74e782011-06-24 03:21:43 +0000603
Greg Claytonacdbe812012-01-30 09:04:36 +0000604 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000605 if (error.Success())
606 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000607 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000608 {
609 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000610 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
611 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000612 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000613 }
614 sb_error.SetError(error);
615 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000616 else
617 sb_error.SetErrorString ("SBProcess is invalid");
618
Caroline Ticeceb6b132010-10-26 03:11:13 +0000619 if (log)
620 {
621 SBStream sstr;
622 sb_error.GetDescription (sstr);
Greg Claytonacdbe812012-01-30 09:04:36 +0000623 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000624 }
625
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000626 return sb_error;
627}
628
629
630SBError
631SBProcess::Destroy ()
632{
633 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000634 ProcessSP process_sp(GetSP());
635 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000636 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000637 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
638 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000639 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000640 else
641 sb_error.SetErrorString ("SBProcess is invalid");
642
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000643 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000644 if (log)
645 {
646 SBStream sstr;
647 sb_error.GetDescription (sstr);
Greg Clayton6779606a2011-01-22 23:43:18 +0000648 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000649 process_sp.get(),
Greg Clayton6779606a2011-01-22 23:43:18 +0000650 sb_error.get(),
651 sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000652 }
653
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654 return sb_error;
655}
656
657
658SBError
659SBProcess::Stop ()
660{
661 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000662 ProcessSP process_sp(GetSP());
663 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000664 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000665 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
666 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000667 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000668 else
669 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000670
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000671 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000672 if (log)
673 {
674 SBStream sstr;
675 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000676 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000677 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000678 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000679 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000680 }
681
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000682 return sb_error;
683}
684
685SBError
686SBProcess::Kill ()
687{
688 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000689 ProcessSP process_sp(GetSP());
690 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000691 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000692 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
693 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000694 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000695 else
696 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000697
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000698 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000699 if (log)
700 {
701 SBStream sstr;
702 sb_error.GetDescription (sstr);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000703 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000704 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000705 sb_error.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000706 sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000707 }
708
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000709 return sb_error;
710}
711
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712SBError
713SBProcess::Detach ()
714{
715 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000716 ProcessSP process_sp(GetSP());
717 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000718 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000719 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
720 sb_error.SetError (process_sp->Detach());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000721 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000722 else
723 sb_error.SetErrorString ("SBProcess is invalid");
724
725 return sb_error;
726}
727
728SBError
Greg Clayton48381312010-10-30 04:51:46 +0000729SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000730{
731 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000732 ProcessSP process_sp(GetSP());
733 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000734 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000735 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
736 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000737 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000738 else
739 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000740 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000741 if (log)
742 {
743 SBStream sstr;
744 sb_error.GetDescription (sstr);
745 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Claytonacdbe812012-01-30 09:04:36 +0000746 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000747 signo,
748 sb_error.get(),
749 sstr.GetData());
750 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000751 return sb_error;
752}
753
Jim Inghamcfc09352012-07-27 23:57:19 +0000754void
755SBProcess::SendAsyncInterrupt ()
756{
757 ProcessSP process_sp(GetSP());
758 if (process_sp)
759 {
760 process_sp->SendAsyncInterrupt ();
761 }
762}
763
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000764SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000765SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000766{
Greg Clayton48381312010-10-30 04:51:46 +0000767 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000768 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000769 ProcessSP process_sp(GetSP());
770 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000771 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000772 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000773 Process::StopLocker stop_locker;
774 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
775 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000776 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000777 }
Greg Clayton48381312010-10-30 04:51:46 +0000778
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000779 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000780 if (log)
781 {
Greg Clayton61e7a582011-12-01 23:28:38 +0000782 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Claytonacdbe812012-01-30 09:04:36 +0000783 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000784 tid,
Greg Clayton17a6ad02012-01-30 02:53:15 +0000785 thread_sp.get());
Greg Clayton48381312010-10-30 04:51:46 +0000786 }
787
788 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000789}
790
Jim Ingham18b46892012-07-13 20:18:18 +0000791SBThread
792SBProcess::GetThreadByIndexID (uint32_t index_id)
793{
794 SBThread sb_thread;
795 ThreadSP thread_sp;
796 ProcessSP process_sp(GetSP());
797 if (process_sp)
798 {
799 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
800 Process::StopLocker stop_locker;
801 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
802 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
803 sb_thread.SetThread (thread_sp);
804 }
805
806 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
807 if (log)
808 {
809 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
810 process_sp.get(),
811 index_id,
812 thread_sp.get());
813 }
814
815 return sb_thread;
816}
817
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000818StateType
819SBProcess::GetStateFromEvent (const SBEvent &event)
820{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000821 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000822
Caroline Ticeceb6b132010-10-26 03:11:13 +0000823 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
824
825 if (log)
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000826 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000827 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000828
829 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000830}
831
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000832bool
833SBProcess::GetRestartedFromEvent (const SBEvent &event)
834{
Greg Clayton66111032010-06-23 01:19:29 +0000835 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000836}
837
838SBProcess
839SBProcess::GetProcessFromEvent (const SBEvent &event)
840{
Greg Clayton66111032010-06-23 01:19:29 +0000841 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000842 return process;
843}
844
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000845bool
846SBProcess::EventIsProcessEvent (const SBEvent &event)
847{
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000848 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000849}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000850
851SBBroadcaster
852SBProcess::GetBroadcaster () const
853{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000854 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000855
Greg Claytonacdbe812012-01-30 09:04:36 +0000856 ProcessSP process_sp(GetSP());
857
858 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000859
860 if (log)
Greg Claytonacdbe812012-01-30 09:04:36 +0000861 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice750cd172010-10-26 23:49:36 +0000862 broadcaster.get());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000863
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000864 return broadcaster;
865}
866
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000867const char *
868SBProcess::GetBroadcasterClass ()
869{
870 return Process::GetStaticBroadcasterClass().AsCString();
871}
872
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000873size_t
874SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
875{
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000876 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000877
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000878 size_t bytes_read = 0;
879
Greg Claytonacdbe812012-01-30 09:04:36 +0000880 ProcessSP process_sp(GetSP());
881
Greg Clayton48381312010-10-30 04:51:46 +0000882 if (log)
883 {
Greg Clayton43e0af02012-09-18 18:04:04 +0000884 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +0000885 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +0000886 addr,
887 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +0000888 (uint64_t)dst_len,
Greg Clayton48381312010-10-30 04:51:46 +0000889 sb_error.get());
890 }
Greg Claytonacdbe812012-01-30 09:04:36 +0000891
892 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000893 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000894 Process::StopLocker stop_locker;
895 if (stop_locker.TryLock(&process_sp->GetRunLock()))
896 {
897 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
898 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
899 }
900 else
901 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000902 if (log)
903 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000904 sb_error.SetErrorString("process is running");
905 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000906 }
907 else
908 {
909 sb_error.SetErrorString ("SBProcess is invalid");
910 }
911
Caroline Ticeceb6b132010-10-26 03:11:13 +0000912 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000913 {
914 SBStream sstr;
915 sb_error.GetDescription (sstr);
Greg Clayton43e0af02012-09-18 18:04:04 +0000916 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu",
Greg Claytonacdbe812012-01-30 09:04:36 +0000917 process_sp.get(),
Greg Clayton93aa84e2010-10-29 04:59:35 +0000918 addr,
919 dst,
Greg Clayton43e0af02012-09-18 18:04:04 +0000920 (uint64_t)dst_len,
Greg Clayton93aa84e2010-10-29 04:59:35 +0000921 sb_error.get(),
922 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +0000923 (uint64_t)bytes_read);
Greg Clayton93aa84e2010-10-29 04:59:35 +0000924 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000925
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000926 return bytes_read;
927}
928
929size_t
Greg Claytone91b7952011-12-15 03:14:23 +0000930SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
931{
932 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000933 ProcessSP process_sp(GetSP());
934 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +0000935 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000936 Process::StopLocker stop_locker;
937 if (stop_locker.TryLock(&process_sp->GetRunLock()))
938 {
939 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
940 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
941 }
942 else
943 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000944 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
945 if (log)
946 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000947 sb_error.SetErrorString("process is running");
948 }
Greg Claytone91b7952011-12-15 03:14:23 +0000949 }
950 else
951 {
952 sb_error.SetErrorString ("SBProcess is invalid");
953 }
954 return bytes_read;
955}
956
957uint64_t
958SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
959{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000960 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000961 ProcessSP process_sp(GetSP());
962 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +0000963 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000964 Process::StopLocker stop_locker;
965 if (stop_locker.TryLock(&process_sp->GetRunLock()))
966 {
967 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
968 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
969 }
970 else
971 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000972 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
973 if (log)
974 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000975 sb_error.SetErrorString("process is running");
976 }
Greg Claytone91b7952011-12-15 03:14:23 +0000977 }
978 else
979 {
980 sb_error.SetErrorString ("SBProcess is invalid");
981 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000982 return value;
Greg Claytone91b7952011-12-15 03:14:23 +0000983}
984
985lldb::addr_t
986SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
987{
988 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +0000989 ProcessSP process_sp(GetSP());
990 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +0000991 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000992 Process::StopLocker stop_locker;
993 if (stop_locker.TryLock(&process_sp->GetRunLock()))
994 {
995 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
996 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
997 }
998 else
999 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001000 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1001 if (log)
1002 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001003 sb_error.SetErrorString("process is running");
1004 }
Greg Claytone91b7952011-12-15 03:14:23 +00001005 }
1006 else
1007 {
1008 sb_error.SetErrorString ("SBProcess is invalid");
1009 }
1010 return ptr;
1011}
1012
1013size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001014SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1015{
1016 size_t bytes_written = 0;
1017
Greg Clayton2d4edfb2010-11-06 01:53:30 +00001018 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001019
1020 ProcessSP process_sp(GetSP());
1021
Greg Clayton48381312010-10-30 04:51:46 +00001022 if (log)
1023 {
Greg Clayton43e0af02012-09-18 18:04:04 +00001024 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...",
Greg Claytonacdbe812012-01-30 09:04:36 +00001025 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001026 addr,
1027 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001028 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001029 sb_error.get());
1030 }
1031
Greg Claytonacdbe812012-01-30 09:04:36 +00001032 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001033 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001034 Process::StopLocker stop_locker;
1035 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1036 {
1037 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1038 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1039 }
1040 else
1041 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001042 if (log)
1043 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001044 sb_error.SetErrorString("process is running");
1045 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001046 }
1047
Greg Clayton48381312010-10-30 04:51:46 +00001048 if (log)
1049 {
1050 SBStream sstr;
1051 sb_error.GetDescription (sstr);
Greg Clayton43e0af02012-09-18 18:04:04 +00001052 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu",
Greg Claytonacdbe812012-01-30 09:04:36 +00001053 process_sp.get(),
Greg Clayton48381312010-10-30 04:51:46 +00001054 addr,
1055 src,
Greg Clayton43e0af02012-09-18 18:04:04 +00001056 (uint64_t)src_len,
Greg Clayton48381312010-10-30 04:51:46 +00001057 sb_error.get(),
1058 sstr.GetData(),
Greg Clayton43e0af02012-09-18 18:04:04 +00001059 (uint64_t)bytes_written);
Greg Clayton48381312010-10-30 04:51:46 +00001060 }
1061
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001062 return bytes_written;
1063}
1064
Caroline Ticedde9cff2010-09-20 05:20:02 +00001065bool
1066SBProcess::GetDescription (SBStream &description)
1067{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001068 Stream &strm = description.ref();
1069
Greg Claytonacdbe812012-01-30 09:04:36 +00001070 ProcessSP process_sp(GetSP());
1071 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001072 {
1073 char path[PATH_MAX];
1074 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001075 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001076 const char *exe_name = NULL;
1077 if (exe_module)
1078 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1079
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001080 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001081 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001082 lldb_private::StateAsCString (GetState()),
1083 GetNumThreads(),
1084 exe_name ? ", executable = " : "",
1085 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001086 }
1087 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001088 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001089
1090 return true;
1091}
Greg Clayton8f343b02010-11-04 01:54:29 +00001092
1093uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001094SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1095{
1096 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1097
1098 uint32_t num = 0;
1099 ProcessSP process_sp(GetSP());
1100 if (process_sp)
1101 {
1102 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1103 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001104 if (log)
1105 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1106 process_sp.get(), num);
1107 }
1108 else
1109 {
1110 sb_error.SetErrorString ("SBProcess is invalid");
1111 }
1112 return num;
1113}
1114
1115uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001116SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1117{
Greg Claytonacdbe812012-01-30 09:04:36 +00001118 ProcessSP process_sp(GetSP());
1119 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001120 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001121 Process::StopLocker stop_locker;
1122 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1123 {
1124 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1125 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1126 }
1127 else
1128 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001129 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1130 if (log)
1131 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001132 sb_error.SetErrorString("process is running");
1133 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001134 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001135 return LLDB_INVALID_IMAGE_TOKEN;
1136}
1137
1138lldb::SBError
1139SBProcess::UnloadImage (uint32_t image_token)
1140{
1141 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001142 ProcessSP process_sp(GetSP());
1143 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001144 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001145 Process::StopLocker stop_locker;
1146 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1147 {
1148 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1149 sb_error.SetError (process_sp->UnloadImage (image_token));
1150 }
1151 else
1152 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001153 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1154 if (log)
1155 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001156 sb_error.SetErrorString("process is running");
1157 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001158 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001159 else
1160 sb_error.SetErrorString("invalid process");
1161 return sb_error;
1162}