SBProcess.cpp revision 952e9dc874944fcdbbb224f3ec4fc2c859376f64
1//===-- 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
10#include "lldb/lldb-python.h"
11
12#include "lldb/API/SBProcess.h"
13
14#include "lldb/lldb-defines.h"
15#include "lldb/lldb-types.h"
16
17#include "lldb/Interpreter/Args.h"
18#include "lldb/Core/Debugger.h"
19#include "lldb/Core/Log.h"
20#include "lldb/Core/Module.h"
21#include "lldb/Core/State.h"
22#include "lldb/Core/Stream.h"
23#include "lldb/Core/StreamFile.h"
24#include "lldb/Target/Process.h"
25#include "lldb/Target/RegisterContext.h"
26#include "lldb/Target/Target.h"
27#include "lldb/Target/Thread.h"
28
29// Project includes
30
31#include "lldb/API/SBBroadcaster.h"
32#include "lldb/API/SBCommandReturnObject.h"
33#include "lldb/API/SBDebugger.h"
34#include "lldb/API/SBEvent.h"
35#include "lldb/API/SBFileSpec.h"
36#include "lldb/API/SBThread.h"
37#include "lldb/API/SBStream.h"
38#include "lldb/API/SBStringList.h"
39
40using namespace lldb;
41using namespace lldb_private;
42
43
44SBProcess::SBProcess () :
45    m_opaque_wp()
46{
47}
48
49
50//----------------------------------------------------------------------
51// SBProcess constructor
52//----------------------------------------------------------------------
53
54SBProcess::SBProcess (const SBProcess& rhs) :
55    m_opaque_wp (rhs.m_opaque_wp)
56{
57}
58
59
60SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
61    m_opaque_wp (process_sp)
62{
63}
64
65const SBProcess&
66SBProcess::operator = (const SBProcess& rhs)
67{
68    if (this != &rhs)
69        m_opaque_wp = rhs.m_opaque_wp;
70    return *this;
71}
72
73//----------------------------------------------------------------------
74// Destructor
75//----------------------------------------------------------------------
76SBProcess::~SBProcess()
77{
78}
79
80const char *
81SBProcess::GetBroadcasterClassName ()
82{
83    return Process::GetStaticBroadcasterClass().AsCString();
84}
85
86const char *
87SBProcess::GetPluginName ()
88{
89    ProcessSP process_sp(GetSP());
90    if (process_sp)
91    {
92        return process_sp->GetPluginName();
93    }
94    return "<Unknown>";
95}
96
97const char *
98SBProcess::GetShortPluginName ()
99{
100    ProcessSP process_sp(GetSP());
101    if (process_sp)
102    {
103        return process_sp->GetShortPluginName();
104    }
105    return "<Unknown>";
106}
107
108
109lldb::ProcessSP
110SBProcess::GetSP() const
111{
112    return m_opaque_wp.lock();
113}
114
115void
116SBProcess::SetSP (const ProcessSP &process_sp)
117{
118    m_opaque_wp = process_sp;
119}
120
121void
122SBProcess::Clear ()
123{
124    m_opaque_wp.reset();
125}
126
127
128bool
129SBProcess::IsValid() const
130{
131    ProcessSP process_sp(m_opaque_wp.lock());
132    return ((bool) process_sp && process_sp->IsValid());
133}
134
135bool
136SBProcess::RemoteLaunch (char const **argv,
137                         char const **envp,
138                         const char *stdin_path,
139                         const char *stdout_path,
140                         const char *stderr_path,
141                         const char *working_directory,
142                         uint32_t launch_flags,
143                         bool stop_at_entry,
144                         lldb::SBError& error)
145{
146    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
147    if (log) {
148        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))...",
149                     m_opaque_wp.lock().get(),
150                     argv,
151                     envp,
152                     stdin_path ? stdin_path : "NULL",
153                     stdout_path ? stdout_path : "NULL",
154                     stderr_path ? stderr_path : "NULL",
155                     working_directory ? working_directory : "NULL",
156                     launch_flags,
157                     stop_at_entry,
158                     error.get());
159    }
160
161    ProcessSP process_sp(GetSP());
162    if (process_sp)
163    {
164        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
165        if (process_sp->GetState() == eStateConnected)
166        {
167            if (stop_at_entry)
168                launch_flags |= eLaunchFlagStopAtEntry;
169            ProcessLaunchInfo launch_info (stdin_path,
170                                           stdout_path,
171                                           stderr_path,
172                                           working_directory,
173                                           launch_flags);
174            Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
175            if (exe_module)
176                launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
177            if (argv)
178                launch_info.GetArguments().AppendArguments (argv);
179            if (envp)
180                launch_info.GetEnvironmentEntries ().SetArguments (envp);
181            error.SetError (process_sp->Launch (launch_info));
182        }
183        else
184        {
185            error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
186        }
187    }
188    else
189    {
190        error.SetErrorString ("unable to attach pid");
191    }
192
193    if (log) {
194        SBStream sstr;
195        error.GetDescription (sstr);
196        log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
197    }
198
199    return error.Success();
200}
201
202bool
203SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
204{
205    ProcessSP process_sp(GetSP());
206    if (process_sp)
207    {
208        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
209        if (process_sp->GetState() == eStateConnected)
210        {
211            ProcessAttachInfo attach_info;
212            attach_info.SetProcessID (pid);
213            error.SetError (process_sp->Attach (attach_info));
214        }
215        else
216        {
217            error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
218        }
219    }
220    else
221    {
222        error.SetErrorString ("unable to attach pid");
223    }
224
225    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
226    if (log) {
227        SBStream sstr;
228        error.GetDescription (sstr);
229        log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
230    }
231
232    return error.Success();
233}
234
235
236uint32_t
237SBProcess::GetNumThreads ()
238{
239    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
240
241    uint32_t num_threads = 0;
242    ProcessSP process_sp(GetSP());
243    if (process_sp)
244    {
245        Process::StopLocker stop_locker;
246
247        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
248        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
249        num_threads = process_sp->GetThreadList().GetSize(can_update);
250    }
251
252    if (log)
253        log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
254
255    return num_threads;
256}
257
258SBThread
259SBProcess::GetSelectedThread () const
260{
261    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
262
263    SBThread sb_thread;
264    ThreadSP thread_sp;
265    ProcessSP process_sp(GetSP());
266    if (process_sp)
267    {
268        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
269        thread_sp = process_sp->GetThreadList().GetSelectedThread();
270        sb_thread.SetThread (thread_sp);
271    }
272
273    if (log)
274    {
275        log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
276    }
277
278    return sb_thread;
279}
280
281SBThread
282SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
283{
284    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
285
286    SBThread sb_thread;
287    ThreadSP thread_sp;
288    ProcessSP process_sp(GetSP());
289    if (process_sp)
290    {
291        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
292        thread_sp = process_sp->CreateOSPluginThread(tid, context);
293        sb_thread.SetThread (thread_sp);
294    }
295
296    if (log)
297        log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get());
298
299    return sb_thread;
300}
301
302SBTarget
303SBProcess::GetTarget() const
304{
305    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
306
307    SBTarget sb_target;
308    TargetSP target_sp;
309    ProcessSP process_sp(GetSP());
310    if (process_sp)
311    {
312        target_sp = process_sp->GetTarget().shared_from_this();
313        sb_target.SetSP (target_sp);
314    }
315
316    if (log)
317        log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
318
319    return sb_target;
320}
321
322
323size_t
324SBProcess::PutSTDIN (const char *src, size_t src_len)
325{
326    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
327
328    size_t ret_val = 0;
329    ProcessSP process_sp(GetSP());
330    if (process_sp)
331    {
332        Error error;
333        ret_val =  process_sp->PutSTDIN (src, src_len, error);
334    }
335
336    if (log)
337        log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
338                     process_sp.get(),
339                     src,
340                     (uint32_t) src_len,
341                     ret_val);
342
343    return ret_val;
344}
345
346size_t
347SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
348{
349    size_t bytes_read = 0;
350    ProcessSP process_sp(GetSP());
351    if (process_sp)
352    {
353        Error error;
354        bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
355    }
356
357    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
358    if (log)
359        log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
360                     process_sp.get(),
361                     (int) bytes_read,
362                     dst,
363                     (uint64_t)dst_len,
364                     (uint64_t)bytes_read);
365
366    return bytes_read;
367}
368
369size_t
370SBProcess::GetSTDERR (char *dst, size_t dst_len) const
371{
372    size_t bytes_read = 0;
373    ProcessSP process_sp(GetSP());
374    if (process_sp)
375    {
376        Error error;
377        bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
378    }
379
380    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
381    if (log)
382        log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
383                     process_sp.get(),
384                     (int) bytes_read,
385                     dst,
386                     (uint64_t)dst_len,
387                     (uint64_t)bytes_read);
388
389    return bytes_read;
390}
391
392size_t
393SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
394{
395    size_t bytes_read = 0;
396    ProcessSP process_sp(GetSP());
397    if (process_sp)
398    {
399        Error error;
400        bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
401    }
402
403    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
404    if (log)
405        log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
406                     process_sp.get(),
407                     (int) bytes_read,
408                     dst,
409                     (uint64_t)dst_len,
410                     (uint64_t)bytes_read);
411
412    return bytes_read;
413}
414
415void
416SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
417{
418    if (out == NULL)
419        return;
420
421    ProcessSP process_sp(GetSP());
422    if (process_sp)
423    {
424        const StateType event_state = SBProcess::GetStateFromEvent (event);
425        char message[1024];
426        int message_len = ::snprintf (message,
427                                      sizeof (message),
428                                      "Process %" PRIu64 " %s\n",
429                                      process_sp->GetID(),
430                                      SBDebugger::StateAsCString (event_state));
431
432        if (message_len > 0)
433            ::fwrite (message, 1, message_len, out);
434    }
435}
436
437void
438SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
439{
440    ProcessSP process_sp(GetSP());
441    if (process_sp)
442    {
443        const StateType event_state = SBProcess::GetStateFromEvent (event);
444        char message[1024];
445        ::snprintf (message,
446                    sizeof (message),
447                    "Process %" PRIu64 " %s\n",
448                    process_sp->GetID(),
449                    SBDebugger::StateAsCString (event_state));
450
451        result.AppendMessage (message);
452    }
453}
454
455bool
456SBProcess::SetSelectedThread (const SBThread &thread)
457{
458    ProcessSP process_sp(GetSP());
459    if (process_sp)
460    {
461        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
462        return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
463    }
464    return false;
465}
466
467bool
468SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
469{
470    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
471
472    bool ret_val = false;
473    ProcessSP process_sp(GetSP());
474    if (process_sp)
475    {
476        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
477        ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
478    }
479
480    if (log)
481        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
482                     process_sp.get(), tid, (ret_val ? "true" : "false"));
483
484    return ret_val;
485}
486
487bool
488SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
489{
490    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
491
492    bool ret_val = false;
493    ProcessSP process_sp(GetSP());
494    if (process_sp)
495    {
496        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
497        ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
498    }
499
500    if (log)
501        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
502                     process_sp.get(), index_id, (ret_val ? "true" : "false"));
503
504    return ret_val;
505}
506
507SBThread
508SBProcess::GetThreadAtIndex (size_t index)
509{
510    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
511
512    SBThread sb_thread;
513    ThreadSP thread_sp;
514    ProcessSP process_sp(GetSP());
515    if (process_sp)
516    {
517        Process::StopLocker stop_locker;
518        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
519        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
520        thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
521        sb_thread.SetThread (thread_sp);
522    }
523
524    if (log)
525    {
526        log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
527                     process_sp.get(), (uint32_t) index, thread_sp.get());
528    }
529
530    return sb_thread;
531}
532
533uint32_t
534SBProcess::GetStopID(bool include_expression_stops)
535{
536    ProcessSP process_sp(GetSP());
537    if (process_sp)
538    {
539        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
540        if (include_expression_stops)
541            return process_sp->GetStopID();
542        else
543            return process_sp->GetLastNaturalStopID();
544    }
545    return 0;
546}
547
548StateType
549SBProcess::GetState ()
550{
551
552    StateType ret_val = eStateInvalid;
553    ProcessSP process_sp(GetSP());
554    if (process_sp)
555    {
556        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
557        ret_val = process_sp->GetState();
558    }
559
560    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
561    if (log)
562        log->Printf ("SBProcess(%p)::GetState () => %s",
563                     process_sp.get(),
564                     lldb_private::StateAsCString (ret_val));
565
566    return ret_val;
567}
568
569
570int
571SBProcess::GetExitStatus ()
572{
573    int exit_status = 0;
574    ProcessSP process_sp(GetSP());
575    if (process_sp)
576    {
577        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
578        exit_status = process_sp->GetExitStatus ();
579    }
580    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
581    if (log)
582        log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
583                     process_sp.get(), exit_status, exit_status);
584
585    return exit_status;
586}
587
588const char *
589SBProcess::GetExitDescription ()
590{
591    const char *exit_desc = NULL;
592    ProcessSP process_sp(GetSP());
593    if (process_sp)
594    {
595        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
596        exit_desc = process_sp->GetExitDescription ();
597    }
598    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
599    if (log)
600        log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
601                     process_sp.get(), exit_desc);
602    return exit_desc;
603}
604
605lldb::pid_t
606SBProcess::GetProcessID ()
607{
608    lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
609    ProcessSP process_sp(GetSP());
610    if (process_sp)
611        ret_val = process_sp->GetID();
612
613    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
614    if (log)
615        log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
616
617    return ret_val;
618}
619
620uint32_t
621SBProcess::GetUniqueID()
622{
623    uint32_t ret_val = 0;
624    ProcessSP process_sp(GetSP());
625    if (process_sp)
626        ret_val = process_sp->GetUniqueID();
627    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
628    if (log)
629        log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
630    return ret_val;
631}
632
633ByteOrder
634SBProcess::GetByteOrder () const
635{
636    ByteOrder byteOrder = eByteOrderInvalid;
637    ProcessSP process_sp(GetSP());
638    if (process_sp)
639        byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
640
641    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
642    if (log)
643        log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
644
645    return byteOrder;
646}
647
648uint32_t
649SBProcess::GetAddressByteSize () const
650{
651    uint32_t size = 0;
652    ProcessSP process_sp(GetSP());
653    if (process_sp)
654        size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
655
656    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
657    if (log)
658        log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
659
660    return size;
661}
662
663SBError
664SBProcess::Continue ()
665{
666    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
667
668    SBError sb_error;
669    ProcessSP process_sp(GetSP());
670
671    if (log)
672        log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
673
674    if (process_sp)
675    {
676        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
677
678        Error error (process_sp->Resume());
679        if (error.Success())
680        {
681            if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
682            {
683                if (log)
684                    log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
685                process_sp->WaitForProcessToStop (NULL);
686            }
687        }
688        sb_error.SetError(error);
689    }
690    else
691        sb_error.SetErrorString ("SBProcess is invalid");
692
693    if (log)
694    {
695        SBStream sstr;
696        sb_error.GetDescription (sstr);
697        log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
698    }
699
700    return sb_error;
701}
702
703
704SBError
705SBProcess::Destroy ()
706{
707    SBError sb_error;
708    ProcessSP process_sp(GetSP());
709    if (process_sp)
710    {
711        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
712        sb_error.SetError(process_sp->Destroy());
713    }
714    else
715        sb_error.SetErrorString ("SBProcess is invalid");
716
717    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
718    if (log)
719    {
720        SBStream sstr;
721        sb_error.GetDescription (sstr);
722        log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
723                     process_sp.get(),
724                     sb_error.get(),
725                     sstr.GetData());
726    }
727
728    return sb_error;
729}
730
731
732SBError
733SBProcess::Stop ()
734{
735    SBError sb_error;
736    ProcessSP process_sp(GetSP());
737    if (process_sp)
738    {
739        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
740        sb_error.SetError (process_sp->Halt());
741    }
742    else
743        sb_error.SetErrorString ("SBProcess is invalid");
744
745    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
746    if (log)
747    {
748        SBStream sstr;
749        sb_error.GetDescription (sstr);
750        log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
751                     process_sp.get(),
752                     sb_error.get(),
753                     sstr.GetData());
754    }
755
756    return sb_error;
757}
758
759SBError
760SBProcess::Kill ()
761{
762    SBError sb_error;
763    ProcessSP process_sp(GetSP());
764    if (process_sp)
765    {
766        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
767        sb_error.SetError (process_sp->Destroy());
768    }
769    else
770        sb_error.SetErrorString ("SBProcess is invalid");
771
772    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
773    if (log)
774    {
775        SBStream sstr;
776        sb_error.GetDescription (sstr);
777        log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
778                     process_sp.get(),
779                     sb_error.get(),
780                     sstr.GetData());
781    }
782
783    return sb_error;
784}
785
786SBError
787SBProcess::Detach ()
788{
789    SBError sb_error;
790    ProcessSP process_sp(GetSP());
791    if (process_sp)
792    {
793        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
794        sb_error.SetError (process_sp->Detach());
795    }
796    else
797        sb_error.SetErrorString ("SBProcess is invalid");
798
799    return sb_error;
800}
801
802SBError
803SBProcess::Signal (int signo)
804{
805    SBError sb_error;
806    ProcessSP process_sp(GetSP());
807    if (process_sp)
808    {
809        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
810        sb_error.SetError (process_sp->Signal (signo));
811    }
812    else
813        sb_error.SetErrorString ("SBProcess is invalid");
814    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
815    if (log)
816    {
817        SBStream sstr;
818        sb_error.GetDescription (sstr);
819        log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
820                     process_sp.get(),
821                     signo,
822                     sb_error.get(),
823                     sstr.GetData());
824    }
825    return sb_error;
826}
827
828void
829SBProcess::SendAsyncInterrupt ()
830{
831    ProcessSP process_sp(GetSP());
832    if (process_sp)
833    {
834        process_sp->SendAsyncInterrupt ();
835    }
836}
837
838SBThread
839SBProcess::GetThreadByID (tid_t tid)
840{
841    SBThread sb_thread;
842    ThreadSP thread_sp;
843    ProcessSP process_sp(GetSP());
844    if (process_sp)
845    {
846        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
847        Process::StopLocker stop_locker;
848        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
849        thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
850        sb_thread.SetThread (thread_sp);
851    }
852
853    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
854    if (log)
855    {
856        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
857                     process_sp.get(),
858                     tid,
859                     thread_sp.get());
860    }
861
862    return sb_thread;
863}
864
865SBThread
866SBProcess::GetThreadByIndexID (uint32_t index_id)
867{
868    SBThread sb_thread;
869    ThreadSP thread_sp;
870    ProcessSP process_sp(GetSP());
871    if (process_sp)
872    {
873        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
874        Process::StopLocker stop_locker;
875        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
876        thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
877        sb_thread.SetThread (thread_sp);
878    }
879
880    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
881    if (log)
882    {
883        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
884                     process_sp.get(),
885                     index_id,
886                     thread_sp.get());
887    }
888
889    return sb_thread;
890}
891
892StateType
893SBProcess::GetStateFromEvent (const SBEvent &event)
894{
895    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
896
897    StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
898
899    if (log)
900        log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
901                     lldb_private::StateAsCString (ret_val));
902
903    return ret_val;
904}
905
906bool
907SBProcess::GetRestartedFromEvent (const SBEvent &event)
908{
909    return Process::ProcessEventData::GetRestartedFromEvent (event.get());
910}
911
912size_t
913SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
914{
915    return Process::ProcessEventData::GetNumRestartedReasons(event.get());
916}
917
918const char *
919SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
920{
921    return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
922}
923
924SBProcess
925SBProcess::GetProcessFromEvent (const SBEvent &event)
926{
927    SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
928    return process;
929}
930
931bool
932SBProcess::EventIsProcessEvent (const SBEvent &event)
933{
934    return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
935}
936
937SBBroadcaster
938SBProcess::GetBroadcaster () const
939{
940    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
941
942    ProcessSP process_sp(GetSP());
943
944    SBBroadcaster broadcaster(process_sp.get(), false);
945
946    if (log)
947        log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  process_sp.get(),
948                     broadcaster.get());
949
950    return broadcaster;
951}
952
953const char *
954SBProcess::GetBroadcasterClass ()
955{
956    return Process::GetStaticBroadcasterClass().AsCString();
957}
958
959size_t
960SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
961{
962    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
963
964    size_t bytes_read = 0;
965
966    ProcessSP process_sp(GetSP());
967
968    if (log)
969    {
970        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
971                     process_sp.get(),
972                     addr,
973                     dst,
974                     (uint64_t)dst_len,
975                     sb_error.get());
976    }
977
978    if (process_sp)
979    {
980        Process::StopLocker stop_locker;
981        if (stop_locker.TryLock(&process_sp->GetRunLock()))
982        {
983            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
984            bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
985        }
986        else
987        {
988            if (log)
989                log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
990            sb_error.SetErrorString("process is running");
991        }
992    }
993    else
994    {
995        sb_error.SetErrorString ("SBProcess is invalid");
996    }
997
998    if (log)
999    {
1000        SBStream sstr;
1001        sb_error.GetDescription (sstr);
1002        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1003                     process_sp.get(),
1004                     addr,
1005                     dst,
1006                     (uint64_t)dst_len,
1007                     sb_error.get(),
1008                     sstr.GetData(),
1009                     (uint64_t)bytes_read);
1010    }
1011
1012    return bytes_read;
1013}
1014
1015size_t
1016SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1017{
1018    size_t bytes_read = 0;
1019    ProcessSP process_sp(GetSP());
1020    if (process_sp)
1021    {
1022        Process::StopLocker stop_locker;
1023        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1024        {
1025            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1026            bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1027        }
1028        else
1029        {
1030            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1031            if (log)
1032                log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
1033            sb_error.SetErrorString("process is running");
1034        }
1035    }
1036    else
1037    {
1038        sb_error.SetErrorString ("SBProcess is invalid");
1039    }
1040    return bytes_read;
1041}
1042
1043uint64_t
1044SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1045{
1046    uint64_t value = 0;
1047    ProcessSP process_sp(GetSP());
1048    if (process_sp)
1049    {
1050        Process::StopLocker stop_locker;
1051        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1052        {
1053            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1054            value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1055        }
1056        else
1057        {
1058            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1059            if (log)
1060                log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
1061            sb_error.SetErrorString("process is running");
1062        }
1063    }
1064    else
1065    {
1066        sb_error.SetErrorString ("SBProcess is invalid");
1067    }
1068    return value;
1069}
1070
1071lldb::addr_t
1072SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1073{
1074    lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1075    ProcessSP process_sp(GetSP());
1076    if (process_sp)
1077    {
1078        Process::StopLocker stop_locker;
1079        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1080        {
1081            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1082            ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1083        }
1084        else
1085        {
1086            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1087            if (log)
1088                log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
1089            sb_error.SetErrorString("process is running");
1090        }
1091    }
1092    else
1093    {
1094        sb_error.SetErrorString ("SBProcess is invalid");
1095    }
1096    return ptr;
1097}
1098
1099size_t
1100SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1101{
1102    size_t bytes_written = 0;
1103
1104    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1105
1106    ProcessSP process_sp(GetSP());
1107
1108    if (log)
1109    {
1110        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1111                     process_sp.get(),
1112                     addr,
1113                     src,
1114                     (uint64_t)src_len,
1115                     sb_error.get());
1116    }
1117
1118    if (process_sp)
1119    {
1120        Process::StopLocker stop_locker;
1121        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1122        {
1123            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1124            bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1125        }
1126        else
1127        {
1128            if (log)
1129                log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
1130            sb_error.SetErrorString("process is running");
1131        }
1132    }
1133
1134    if (log)
1135    {
1136        SBStream sstr;
1137        sb_error.GetDescription (sstr);
1138        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1139                     process_sp.get(),
1140                     addr,
1141                     src,
1142                     (uint64_t)src_len,
1143                     sb_error.get(),
1144                     sstr.GetData(),
1145                     (uint64_t)bytes_written);
1146    }
1147
1148    return bytes_written;
1149}
1150
1151bool
1152SBProcess::GetDescription (SBStream &description)
1153{
1154    Stream &strm = description.ref();
1155
1156    ProcessSP process_sp(GetSP());
1157    if (process_sp)
1158    {
1159        char path[PATH_MAX];
1160        GetTarget().GetExecutable().GetPath (path, sizeof(path));
1161        Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
1162        const char *exe_name = NULL;
1163        if (exe_module)
1164            exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1165
1166        strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1167                     process_sp->GetID(),
1168                     lldb_private::StateAsCString (GetState()),
1169                     GetNumThreads(),
1170                     exe_name ? ", executable = " : "",
1171                     exe_name ? exe_name : "");
1172    }
1173    else
1174        strm.PutCString ("No value");
1175
1176    return true;
1177}
1178
1179uint32_t
1180SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1181{
1182    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1183
1184    uint32_t num = 0;
1185    ProcessSP process_sp(GetSP());
1186    if (process_sp)
1187    {
1188        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1189        sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1190        if (log)
1191            log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1192                         process_sp.get(), num);
1193    }
1194    else
1195    {
1196        sb_error.SetErrorString ("SBProcess is invalid");
1197    }
1198    return num;
1199}
1200
1201uint32_t
1202SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1203{
1204    ProcessSP process_sp(GetSP());
1205    if (process_sp)
1206    {
1207        Process::StopLocker stop_locker;
1208        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1209        {
1210            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1211            return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1212        }
1213        else
1214        {
1215            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1216            if (log)
1217                log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
1218            sb_error.SetErrorString("process is running");
1219        }
1220    }
1221    return LLDB_INVALID_IMAGE_TOKEN;
1222}
1223
1224lldb::SBError
1225SBProcess::UnloadImage (uint32_t image_token)
1226{
1227    lldb::SBError sb_error;
1228    ProcessSP process_sp(GetSP());
1229    if (process_sp)
1230    {
1231        Process::StopLocker stop_locker;
1232        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1233        {
1234            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1235            sb_error.SetError (process_sp->UnloadImage (image_token));
1236        }
1237        else
1238        {
1239            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1240            if (log)
1241                log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
1242            sb_error.SetErrorString("process is running");
1243        }
1244    }
1245    else
1246        sb_error.SetErrorString("invalid process");
1247    return sb_error;
1248}
1249