blob: 0b1e9cf331963c7d679a52523ab1a5d88d5cda83 [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"
Chris Lattner24943d22010-06-08 16:52:24 +000016#include "lldb/Core/DataBufferHeap.h"
17#include "lldb/Core/DataExtractor.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000018#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/State.h"
21#include "lldb/Core/Stream.h"
22#include "lldb/Core/StreamFile.h"
23#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000025#include "lldb/Target/Target.h"
26#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027
28// Project includes
29
Eli Friedman7a62c8b2010-06-09 07:44:37 +000030#include "lldb/API/SBBroadcaster.h"
31#include "lldb/API/SBDebugger.h"
32#include "lldb/API/SBCommandReturnObject.h"
33#include "lldb/API/SBEvent.h"
34#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
42
43SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000044 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000045{
Caroline Tice7826c882010-10-26 03:11:13 +000046 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
47
48 if (log)
49 log->Printf ("SBProcess::SBProcess () ==> this = %p", this);
Chris Lattner24943d22010-06-08 16:52:24 +000050}
51
52
53//----------------------------------------------------------------------
54// SBProcess constructor
55//----------------------------------------------------------------------
56
57SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000058 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
Caroline Tice7826c882010-10-26 03:11:13 +000060 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
61
62 if (log)
63 log->Printf ("SBProcess::SBProcess (const SBProcess &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p",
64 rhs.m_opaque_sp.get(), this);
Chris Lattner24943d22010-06-08 16:52:24 +000065}
66
67
68SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000069 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000070{
Caroline Tice7826c882010-10-26 03:11:13 +000071 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE);
72
73 if (log)
74 log->Printf ("SBProcess::SBProcess (const lldb::ProcessSP &process_sp) process_sp.get() = %p ==> this = %p",
75 process_sp.get(), this);
Chris Lattner24943d22010-06-08 16:52:24 +000076}
77
78//----------------------------------------------------------------------
79// Destructor
80//----------------------------------------------------------------------
81SBProcess::~SBProcess()
82{
83}
84
85void
86SBProcess::SetProcess (const ProcessSP &process_sp)
87{
Greg Clayton63094e02010-06-23 01:19:29 +000088 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91void
92SBProcess::Clear ()
93{
Greg Clayton63094e02010-06-23 01:19:29 +000094 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000095}
96
97
98bool
99SBProcess::IsValid() const
100{
Greg Clayton63094e02010-06-23 01:19:29 +0000101 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000102}
103
104
105uint32_t
106SBProcess::GetNumThreads ()
107{
Caroline Tice7826c882010-10-26 03:11:13 +0000108 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
109
110 if (log)
111 log->Printf ("SBProcess::GetNumThreads ()");
112
113 uint32_t num_threads = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000114 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000115 {
116 const bool can_update = true;
Caroline Tice7826c882010-10-26 03:11:13 +0000117 num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000118 }
Caroline Tice7826c882010-10-26 03:11:13 +0000119
120 if (log)
121 log->Printf ("SBProcess::GetNumThreads ==> %d", num_threads);
122
123 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000124}
125
126SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000127SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000128{
Caroline Tice7826c882010-10-26 03:11:13 +0000129 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
130
131 if (log)
132 log->Printf ("SBProcess::GetSelectedThread ()");
133
Chris Lattner24943d22010-06-08 16:52:24 +0000134 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000135 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000136 sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
Caroline Tice7826c882010-10-26 03:11:13 +0000137
138 if (log)
139 {
140 SBStream sstr;
141 sb_thread.GetDescription (sstr);
142 log->Printf ("SBProcess::GetSelectedThread ==> SBThread (this = %p, '%s')", &sb_thread, sstr.GetData());
143 }
144
Chris Lattner24943d22010-06-08 16:52:24 +0000145 return sb_thread;
146}
147
148SBTarget
149SBProcess::GetTarget() const
150{
Caroline Tice7826c882010-10-26 03:11:13 +0000151 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
152
153 if (log)
154 log->Printf ("SBProcess::GetTarget ()");
155
Chris Lattner24943d22010-06-08 16:52:24 +0000156 SBTarget sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000157 if (m_opaque_sp)
158 sb_target = m_opaque_sp->GetTarget().GetSP();
Caroline Tice7826c882010-10-26 03:11:13 +0000159
160 if (log)
161 log->Printf ("SBProcess::GetTarget ==> SBTarget (this = %p, m_opaque_sp.get())", &sb_target,
162 sb_target.get());
163
Chris Lattner24943d22010-06-08 16:52:24 +0000164 return sb_target;
165}
166
167
168size_t
169SBProcess::PutSTDIN (const char *src, size_t src_len)
170{
Caroline Tice7826c882010-10-26 03:11:13 +0000171 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
172
173 if (log)
174 log->Printf ("SBProcess::PutSTDIN (%s, %d)", src, src_len);
175
176 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000177 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000178 {
179 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000180 ret_val = m_opaque_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000181 }
Caroline Tice7826c882010-10-26 03:11:13 +0000182
183 if (log)
184 log->Printf ("SBProcess::PutSTDIN ==> %d", ret_val);
185
186 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000187}
188
189size_t
190SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
191{
Caroline Tice7826c882010-10-26 03:11:13 +0000192 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
193
194 if (log)
195 log->Printf ("SBProcess::GetSTDOUT (char *dst, size_t dst_Len)");
196
197 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000198 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000199 {
200 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000201 ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000202 }
Caroline Tice7826c882010-10-26 03:11:13 +0000203
204 if (log)
205 log->Printf ("SBProcess::GetSTDOUT ==> %d", ret_val);
206
207 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000208}
209
210size_t
211SBProcess::GetSTDERR (char *dst, size_t dst_len) const
212{
Caroline Tice7826c882010-10-26 03:11:13 +0000213 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
214
215 if (log)
216 log->Printf ("SBProcess::GetSTDERR (char *dst, size_t dst_len)");
217
218 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000219 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000220 {
221 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000222 ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000223 }
Caroline Tice7826c882010-10-26 03:11:13 +0000224
225 if (log)
226 log->Printf ("SBProcess::GetSTDERR ==> %d", ret_val);
227
228 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000229}
230
231void
Jim Inghamc8332952010-08-26 21:32:51 +0000232SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000233{
234 if (out == NULL)
235 return;
236
Greg Clayton63094e02010-06-23 01:19:29 +0000237 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000238 {
239 const StateType event_state = SBProcess::GetStateFromEvent (event);
240 char message[1024];
241 int message_len = ::snprintf (message,
242 sizeof (message),
243 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000244 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000245 SBDebugger::StateAsCString (event_state));
246
247 if (message_len > 0)
248 ::fwrite (message, 1, message_len, out);
249 }
250}
251
252void
Jim Inghamc8332952010-08-26 21:32:51 +0000253SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000254{
Greg Clayton63094e02010-06-23 01:19:29 +0000255 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000256 {
257 const StateType event_state = SBProcess::GetStateFromEvent (event);
258 char message[1024];
259 ::snprintf (message,
260 sizeof (message),
261 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000262 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000263 SBDebugger::StateAsCString (event_state));
264
265 result.AppendMessage (message);
266 }
267}
268
269bool
Jim Inghamc8332952010-08-26 21:32:51 +0000270SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000271{
Greg Clayton63094e02010-06-23 01:19:29 +0000272 if (m_opaque_sp != NULL)
Jim Inghamc8332952010-08-26 21:32:51 +0000273 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000274 return false;
275}
276
277bool
Jim Inghamc8332952010-08-26 21:32:51 +0000278SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000279{
Caroline Tice7826c882010-10-26 03:11:13 +0000280 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
281
282 if (log)
283 log->Printf ("SBProcess::SetSelectedThreadByID (%d)", tid);
284
285 bool ret_val = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000286 if (m_opaque_sp != NULL)
Caroline Tice7826c882010-10-26 03:11:13 +0000287 ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
288
289 if (log)
290 log->Printf ("SBProcess::SetSelectedThreadByID ==> %s", (ret_val ? "true" : "false"));
291
292 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000293}
294
295SBThread
296SBProcess::GetThreadAtIndex (size_t index)
297{
Caroline Tice7826c882010-10-26 03:11:13 +0000298 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
299
300 if (log)
301 log->Printf ("SBProcess::GetThreadAtIndex (%d)");
302
Chris Lattner24943d22010-06-08 16:52:24 +0000303 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000304 if (m_opaque_sp)
305 thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
Caroline Tice7826c882010-10-26 03:11:13 +0000306
307 if (log)
308 {
309 SBStream sstr;
310 thread.GetDescription (sstr);
311 log->Printf ("SBProcess::GetThreadAtIndex ==> SBThread (this = %p, '%s')", &thread, sstr.GetData());
312 }
313
Chris Lattner24943d22010-06-08 16:52:24 +0000314 return thread;
315}
316
317StateType
318SBProcess::GetState ()
319{
Caroline Tice7826c882010-10-26 03:11:13 +0000320 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
321
322 if (log)
323 log->Printf ("SBProcess::GetState ()");
324
325 StateType ret_val = eStateInvalid;
Greg Clayton63094e02010-06-23 01:19:29 +0000326 if (m_opaque_sp != NULL)
Caroline Tice7826c882010-10-26 03:11:13 +0000327 ret_val = m_opaque_sp->GetState();
328
329 if (log)
330 log->Printf ("SBProcess::GetState ==> %s", lldb_private::StateAsCString (ret_val));
331
332 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000333}
334
335
336int
337SBProcess::GetExitStatus ()
338{
Greg Clayton63094e02010-06-23 01:19:29 +0000339 if (m_opaque_sp != NULL)
340 return m_opaque_sp->GetExitStatus ();
Chris Lattner24943d22010-06-08 16:52:24 +0000341 else
342 return 0;
343}
344
345const char *
346SBProcess::GetExitDescription ()
347{
Greg Clayton63094e02010-06-23 01:19:29 +0000348 if (m_opaque_sp != NULL)
349 return m_opaque_sp->GetExitDescription ();
Chris Lattner24943d22010-06-08 16:52:24 +0000350 else
351 return NULL;
352}
353
354lldb::pid_t
355SBProcess::GetProcessID ()
356{
Caroline Tice7826c882010-10-26 03:11:13 +0000357 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
358
359 if (log)
360 log->Printf ("SBProcess::GetProcessID ()");
361
362 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000363 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000364 ret_val = m_opaque_sp->GetID();
365
366 if (log)
367 log->Printf ("SBProcess::GetProcessID ==> %d", ret_val);
368
369 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000370}
371
372uint32_t
373SBProcess::GetAddressByteSize () const
374{
Caroline Tice7826c882010-10-26 03:11:13 +0000375 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
376
377 if (log)
378 log->Printf ("SBProcess::GetAddressByteSize()");
379
380 uint32_t size = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000381 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000382 size = m_opaque_sp->GetAddressByteSize();
383
384 if (log)
385 log->Printf ("SBProcess::GetAddressByteSize ==> %d", size);
386
387 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000388}
389
Chris Lattner24943d22010-06-08 16:52:24 +0000390bool
391SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
392{
393 bool state_changed = false;
394
395 if (IsValid())
396 {
397 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000398 StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000399
400 while (StateIsStoppedState (state))
401 {
Greg Clayton63094e02010-06-23 01:19:29 +0000402 state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000403 SBEvent event (event_sp);
Jim Inghamc8332952010-08-26 21:32:51 +0000404 AppendEventStateReport (event, result);
Chris Lattner24943d22010-06-08 16:52:24 +0000405 state_changed = true;
406 }
407 }
408 return state_changed;
409}
410
411SBError
412SBProcess::Continue ()
413{
Caroline Tice7826c882010-10-26 03:11:13 +0000414 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
415
416 if (log)
417 log->Printf ("SBProcess::Continue ()");
418
Chris Lattner24943d22010-06-08 16:52:24 +0000419 SBError sb_error;
420 if (IsValid())
Greg Clayton1a3083a2010-10-06 03:53:16 +0000421 {
422 Error error (m_opaque_sp->Resume());
423 if (error.Success())
424 {
425 if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
426 m_opaque_sp->WaitForProcessToStop (NULL);
427 }
428 sb_error.SetError(error);
429 }
Chris Lattner24943d22010-06-08 16:52:24 +0000430 else
431 sb_error.SetErrorString ("SBProcess is invalid");
432
Caroline Tice7826c882010-10-26 03:11:13 +0000433 if (log)
434 {
435 SBStream sstr;
436 sb_error.GetDescription (sstr);
437 log->Printf ("SBProcess::Continue ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData());
438 }
439
Chris Lattner24943d22010-06-08 16:52:24 +0000440 return sb_error;
441}
442
443
444SBError
445SBProcess::Destroy ()
446{
447 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000448 if (m_opaque_sp)
449 sb_error.SetError(m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000450 else
451 sb_error.SetErrorString ("SBProcess is invalid");
452
453 return sb_error;
454}
455
456
457SBError
458SBProcess::Stop ()
459{
Caroline Tice7826c882010-10-26 03:11:13 +0000460 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
461
462 if (log)
463 log->Printf ("SBProcess::Stop ()");
464
Chris Lattner24943d22010-06-08 16:52:24 +0000465 SBError sb_error;
466 if (IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +0000467 sb_error.SetError (m_opaque_sp->Halt());
Chris Lattner24943d22010-06-08 16:52:24 +0000468 else
469 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000470
471 if (log)
472 {
473 SBStream sstr;
474 sb_error.GetDescription (sstr);
475 log->Printf ("SBProcess::Stop ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData());
476 }
477
Chris Lattner24943d22010-06-08 16:52:24 +0000478 return sb_error;
479}
480
481SBError
482SBProcess::Kill ()
483{
Caroline Tice7826c882010-10-26 03:11:13 +0000484 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
485
486 if (log)
487 log->Printf ("SBProcess::Kill ()");
488
Chris Lattner24943d22010-06-08 16:52:24 +0000489 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000490 if (m_opaque_sp)
491 sb_error.SetError (m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000492 else
493 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000494
495 if (log)
496 {
497 SBStream sstr;
498 sb_error.GetDescription (sstr);
499 log->Printf ("SBProcess::Kill ==> SBError (this = %p,'%s')", &sb_error, sstr.GetData());
500 }
501
Chris Lattner24943d22010-06-08 16:52:24 +0000502 return sb_error;
503}
504
505
506SBError
507SBProcess::AttachByName (const char *name, bool wait_for_launch)
508{
509 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000510 if (m_opaque_sp)
511 sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
Chris Lattner24943d22010-06-08 16:52:24 +0000512 else
513 sb_error.SetErrorString ("SBProcess is invalid");
514 return sb_error;
515}
516
517lldb::pid_t
Caroline Ticedfc91c32010-09-15 18:29:06 +0000518SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
Chris Lattner24943d22010-06-08 16:52:24 +0000519{
520 Attach (attach_pid);
521 return GetProcessID();
522}
523
Caroline Ticedfc91c32010-09-15 18:29:06 +0000524
Chris Lattner24943d22010-06-08 16:52:24 +0000525SBError
526SBProcess::Attach (lldb::pid_t attach_pid)
527{
528 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000529 if (m_opaque_sp)
530 sb_error.SetError (m_opaque_sp->Attach (attach_pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000531 else
532 sb_error.SetErrorString ("SBProcess is invalid");
533 return sb_error;
534}
535
536SBError
537SBProcess::Detach ()
538{
539 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000540 if (m_opaque_sp)
541 sb_error.SetError (m_opaque_sp->Detach());
Chris Lattner24943d22010-06-08 16:52:24 +0000542 else
543 sb_error.SetErrorString ("SBProcess is invalid");
544
545 return sb_error;
546}
547
548SBError
549SBProcess::Signal (int signal)
550{
551 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000552 if (m_opaque_sp)
553 sb_error.SetError (m_opaque_sp->Signal (signal));
Chris Lattner24943d22010-06-08 16:52:24 +0000554 else
555 sb_error.SetErrorString ("SBProcess is invalid");
556 return sb_error;
557}
558
Chris Lattner24943d22010-06-08 16:52:24 +0000559SBThread
560SBProcess::GetThreadByID (tid_t sb_thread_id)
561{
562 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000563 if (m_opaque_sp)
564 thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
Chris Lattner24943d22010-06-08 16:52:24 +0000565 return thread;
566}
567
Chris Lattner24943d22010-06-08 16:52:24 +0000568StateType
569SBProcess::GetStateFromEvent (const SBEvent &event)
570{
Caroline Tice7826c882010-10-26 03:11:13 +0000571 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
572
573 if (log)
574 {
575 SBStream sstr;
576 event.GetDescription (sstr);
577 log->Printf ("SBProcess::GetStateFromEvent (%s)", sstr.GetData());
578 }
579
580 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
581
582 if (log)
583 log->Printf ("SBProcess::GetStateFromEvent ==> %s", lldb_private::StateAsCString (ret_val));
584
585 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000586}
587
Chris Lattner24943d22010-06-08 16:52:24 +0000588bool
589SBProcess::GetRestartedFromEvent (const SBEvent &event)
590{
Greg Clayton63094e02010-06-23 01:19:29 +0000591 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000592}
593
594SBProcess
595SBProcess::GetProcessFromEvent (const SBEvent &event)
596{
Greg Clayton63094e02010-06-23 01:19:29 +0000597 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000598 return process;
599}
600
601
602SBBroadcaster
603SBProcess::GetBroadcaster () const
604{
Caroline Tice7826c882010-10-26 03:11:13 +0000605 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
606
607 if (log)
608 log->Printf ("SBProcess::GetBroadcaster ()");
Greg Clayton63094e02010-06-23 01:19:29 +0000609 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000610
611 if (log)
612 log->Printf ("SBProcess::GetBroadcaster ==> SBBroadcaster (this = %p, m_opaque = %p)", &broadcaster,
613 m_opaque_sp.get());
614
Chris Lattner24943d22010-06-08 16:52:24 +0000615 return broadcaster;
616}
617
618lldb_private::Process *
619SBProcess::operator->() const
620{
Greg Clayton63094e02010-06-23 01:19:29 +0000621 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000622}
623
624size_t
625SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
626{
Caroline Tice7826c882010-10-26 03:11:13 +0000627 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
628
629 if (log)
630 log->Printf ("SBProcess::ReadMemory (%p, %p, %d, sb_error)", addr, dst, dst_len);
631
Chris Lattner24943d22010-06-08 16:52:24 +0000632 size_t bytes_read = 0;
633
634 if (IsValid())
635 {
636 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000637 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000638 sb_error.SetError (error);
639 }
640 else
641 {
642 sb_error.SetErrorString ("SBProcess is invalid");
643 }
644
Caroline Tice7826c882010-10-26 03:11:13 +0000645 if (log)
646 log->Printf ("SBProcess::ReadMemory ==> %d", bytes_read);
647
Chris Lattner24943d22010-06-08 16:52:24 +0000648 return bytes_read;
649}
650
651size_t
652SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
653{
654 size_t bytes_written = 0;
655
656 if (IsValid())
657 {
658 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000659 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000660 sb_error.SetError (error);
661 }
662
663 return bytes_written;
664}
665
666// Mimic shared pointer...
667lldb_private::Process *
668SBProcess::get() const
669{
Greg Clayton63094e02010-06-23 01:19:29 +0000670 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000671}
672
Caroline Tice98f930f2010-09-20 05:20:02 +0000673bool
674SBProcess::GetDescription (SBStream &description)
675{
676 if (m_opaque_sp)
677 {
678 char path[PATH_MAX];
679 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton5c4c7462010-10-06 03:09:58 +0000680 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
681 const char *exe_name = NULL;
682 if (exe_module)
683 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
684
Greg Claytond8c62532010-10-07 04:19:01 +0000685 description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000686 m_opaque_sp->GetID(),
Caroline Tice7826c882010-10-26 03:11:13 +0000687 lldb_private::StateAsCString (GetState()),
Greg Clayton5c4c7462010-10-06 03:09:58 +0000688 GetNumThreads(),
Greg Claytond8c62532010-10-07 04:19:01 +0000689 exe_name ? ", executable = " : "",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000690 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000691 }
692 else
693 description.Printf ("No value");
694
695 return true;
696}