130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBProcess.h"
1130fdc8d8SChris Lattner 
12bdae3787SVirgile Bello // C Includes
13bdae3787SVirgile Bello #include <inttypes.h>
14bdae3787SVirgile Bello 
1530fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1630fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1730fdc8d8SChris Lattner 
1840af72e1SJim Ingham #include "lldb/Interpreter/Args.h"
195d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
20ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
211f746071SGreg Clayton #include "lldb/Core/Module.h"
22f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h"
2330fdc8d8SChris Lattner #include "lldb/Core/State.h"
2430fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2730fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
288c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
296611103cSGreg Clayton #include "lldb/Target/Target.h"
306611103cSGreg Clayton #include "lldb/Target/Thread.h"
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner // Project includes
3330fdc8d8SChris Lattner 
344c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
354c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
360e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
374c5de699SEli Friedman #include "lldb/API/SBEvent.h"
380e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
394c5de699SEli Friedman #include "lldb/API/SBThread.h"
40a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h"
41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
424c5de699SEli Friedman #include "lldb/API/SBStringList.h"
43802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h"
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner using namespace lldb;
4630fdc8d8SChris Lattner using namespace lldb_private;
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner 
4930fdc8d8SChris Lattner SBProcess::SBProcess () :
504e0fe8abSGreg Clayton     m_opaque_wp()
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner //----------------------------------------------------------------------
5630fdc8d8SChris Lattner // SBProcess constructor
5730fdc8d8SChris Lattner //----------------------------------------------------------------------
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
604e0fe8abSGreg Clayton     m_opaque_wp (rhs.m_opaque_wp)
6130fdc8d8SChris Lattner {
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
664e0fe8abSGreg Clayton     m_opaque_wp (process_sp)
6730fdc8d8SChris Lattner {
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
70efabb123SGreg Clayton const SBProcess&
71efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs)
72efabb123SGreg Clayton {
73efabb123SGreg Clayton     if (this != &rhs)
744e0fe8abSGreg Clayton         m_opaque_wp = rhs.m_opaque_wp;
75efabb123SGreg Clayton     return *this;
76efabb123SGreg Clayton }
77efabb123SGreg Clayton 
7830fdc8d8SChris Lattner //----------------------------------------------------------------------
7930fdc8d8SChris Lattner // Destructor
8030fdc8d8SChris Lattner //----------------------------------------------------------------------
8130fdc8d8SChris Lattner SBProcess::~SBProcess()
8230fdc8d8SChris Lattner {
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
854bddaeb5SJim Ingham const char *
864bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName ()
874bddaeb5SJim Ingham {
884bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
894bddaeb5SJim Ingham }
904bddaeb5SJim Ingham 
91d7b30ef9SJim Ingham const char *
92d7b30ef9SJim Ingham SBProcess::GetPluginName ()
93d7b30ef9SJim Ingham {
94d7b30ef9SJim Ingham     ProcessSP process_sp(GetSP());
95d7b30ef9SJim Ingham     if (process_sp)
96d7b30ef9SJim Ingham     {
9757abc5d6SGreg Clayton         return process_sp->GetPluginName().GetCString();
98d7b30ef9SJim Ingham     }
99d7b30ef9SJim Ingham     return "<Unknown>";
100d7b30ef9SJim Ingham }
101d7b30ef9SJim Ingham 
102d7b30ef9SJim Ingham const char *
103d7b30ef9SJim Ingham SBProcess::GetShortPluginName ()
104d7b30ef9SJim Ingham {
105d7b30ef9SJim Ingham     ProcessSP process_sp(GetSP());
106d7b30ef9SJim Ingham     if (process_sp)
107d7b30ef9SJim Ingham     {
10857abc5d6SGreg Clayton         return process_sp->GetPluginName().GetCString();
109d7b30ef9SJim Ingham     }
110d7b30ef9SJim Ingham     return "<Unknown>";
111d7b30ef9SJim Ingham }
112d7b30ef9SJim Ingham 
113d7b30ef9SJim Ingham 
114b9556accSGreg Clayton lldb::ProcessSP
115b9556accSGreg Clayton SBProcess::GetSP() const
116b9556accSGreg Clayton {
1174e0fe8abSGreg Clayton     return m_opaque_wp.lock();
118b9556accSGreg Clayton }
119b9556accSGreg Clayton 
12030fdc8d8SChris Lattner void
121b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp)
12230fdc8d8SChris Lattner {
1234e0fe8abSGreg Clayton     m_opaque_wp = process_sp;
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner void
12730fdc8d8SChris Lattner SBProcess::Clear ()
12830fdc8d8SChris Lattner {
1294e0fe8abSGreg Clayton     m_opaque_wp.reset();
13030fdc8d8SChris Lattner }
13130fdc8d8SChris Lattner 
13230fdc8d8SChris Lattner 
13330fdc8d8SChris Lattner bool
13430fdc8d8SChris Lattner SBProcess::IsValid() const
13530fdc8d8SChris Lattner {
1364fc6cb9cSJim Ingham     ProcessSP process_sp(m_opaque_wp.lock());
1374fc6cb9cSJim Ingham     return ((bool) process_sp && process_sp->IsValid());
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
1409631aae2SJames McIlree bool
1419631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv,
1429631aae2SJames McIlree                          char const **envp,
1439631aae2SJames McIlree                          const char *stdin_path,
1449631aae2SJames McIlree                          const char *stdout_path,
1459631aae2SJames McIlree                          const char *stderr_path,
1469631aae2SJames McIlree                          const char *working_directory,
1479631aae2SJames McIlree                          uint32_t launch_flags,
1489631aae2SJames McIlree                          bool stop_at_entry,
1499631aae2SJames McIlree                          lldb::SBError& error)
1509631aae2SJames McIlree {
1515160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
152324a1036SSaleem Abdulrasool     if (log)
1539631aae2SJames McIlree         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))...",
154324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_wp.lock().get()),
155324a1036SSaleem Abdulrasool                      static_cast<void*>(argv), static_cast<void*>(envp),
1569631aae2SJames McIlree                      stdin_path ? stdin_path : "NULL",
1579631aae2SJames McIlree                      stdout_path ? stdout_path : "NULL",
1589631aae2SJames McIlree                      stderr_path ? stderr_path : "NULL",
1599631aae2SJames McIlree                      working_directory ? working_directory : "NULL",
160324a1036SSaleem Abdulrasool                      launch_flags, stop_at_entry,
161324a1036SSaleem Abdulrasool                      static_cast<void*>(error.get()));
1629631aae2SJames McIlree 
163acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
164acdbe816SGreg Clayton     if (process_sp)
1659631aae2SJames McIlree     {
166bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
167acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1689631aae2SJames McIlree         {
169982c9762SGreg Clayton             if (stop_at_entry)
170982c9762SGreg Clayton                 launch_flags |= eLaunchFlagStopAtEntry;
171d3173f34SChaoren Lin             ProcessLaunchInfo launch_info(FileSpec{stdin_path, false},
172d3173f34SChaoren Lin                                           FileSpec{stdout_path, false},
173d3173f34SChaoren Lin                                           FileSpec{stderr_path, false},
174d3173f34SChaoren Lin                                           FileSpec{working_directory, false},
175982c9762SGreg Clayton                                           launch_flags);
176acdbe816SGreg Clayton             Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
177982c9762SGreg Clayton             if (exe_module)
17814715c68SGreg Clayton                 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
179982c9762SGreg Clayton             if (argv)
180982c9762SGreg Clayton                 launch_info.GetArguments().AppendArguments (argv);
181982c9762SGreg Clayton             if (envp)
182982c9762SGreg Clayton                 launch_info.GetEnvironmentEntries ().SetArguments (envp);
183acdbe816SGreg Clayton             error.SetError (process_sp->Launch (launch_info));
1849631aae2SJames McIlree         }
1859631aae2SJames McIlree         else
1869631aae2SJames McIlree         {
1879631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
1889631aae2SJames McIlree         }
1899631aae2SJames McIlree     }
1909631aae2SJames McIlree     else
1919631aae2SJames McIlree     {
1929631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1939631aae2SJames McIlree     }
1949631aae2SJames McIlree 
1959631aae2SJames McIlree     if (log) {
1969631aae2SJames McIlree         SBStream sstr;
1979631aae2SJames McIlree         error.GetDescription (sstr);
198324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
199324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
200324a1036SSaleem Abdulrasool                      static_cast<void*>(error.get()), sstr.GetData());
2019631aae2SJames McIlree     }
2029631aae2SJames McIlree 
2039631aae2SJames McIlree     return error.Success();
2049631aae2SJames McIlree }
2059631aae2SJames McIlree 
2069631aae2SJames McIlree bool
2079631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
2089631aae2SJames McIlree {
209acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
210acdbe816SGreg Clayton     if (process_sp)
2119631aae2SJames McIlree     {
212bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
213acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
2149631aae2SJames McIlree         {
215144f3a9cSGreg Clayton             ProcessAttachInfo attach_info;
216144f3a9cSGreg Clayton             attach_info.SetProcessID (pid);
217acdbe816SGreg Clayton             error.SetError (process_sp->Attach (attach_info));
2189631aae2SJames McIlree         }
2199631aae2SJames McIlree         else
2209631aae2SJames McIlree         {
2219631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
2229631aae2SJames McIlree         }
2239631aae2SJames McIlree     }
2249631aae2SJames McIlree     else
2259631aae2SJames McIlree     {
2269631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
2279631aae2SJames McIlree     }
2289631aae2SJames McIlree 
2295160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2309631aae2SJames McIlree     if (log) {
2319631aae2SJames McIlree         SBStream sstr;
2329631aae2SJames McIlree         error.GetDescription (sstr);
233324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s",
234324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), pid,
235324a1036SSaleem Abdulrasool                      static_cast<void*>(error.get()), sstr.GetData());
2369631aae2SJames McIlree     }
2379631aae2SJames McIlree 
2389631aae2SJames McIlree     return error.Success();
2399631aae2SJames McIlree }
2409631aae2SJames McIlree 
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner uint32_t
24330fdc8d8SChris Lattner SBProcess::GetNumThreads ()
24430fdc8d8SChris Lattner {
2455160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
246ceb6b139SCaroline Tice 
247ceb6b139SCaroline Tice     uint32_t num_threads = 0;
248acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
249acdbe816SGreg Clayton     if (process_sp)
25030fdc8d8SChris Lattner     {
2517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2527fdf9ef1SGreg Clayton 
2537fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
254bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
255acdbe816SGreg Clayton         num_threads = process_sp->GetThreadList().GetSize(can_update);
25630fdc8d8SChris Lattner     }
257ceb6b139SCaroline Tice 
258ceb6b139SCaroline Tice     if (log)
259324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetNumThreads () => %d",
260324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), num_threads);
261ceb6b139SCaroline Tice 
262ceb6b139SCaroline Tice     return num_threads;
26330fdc8d8SChris Lattner }
26430fdc8d8SChris Lattner 
26530fdc8d8SChris Lattner SBThread
2662976d00aSJim Ingham SBProcess::GetSelectedThread () const
26730fdc8d8SChris Lattner {
2685160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
269ceb6b139SCaroline Tice 
27030fdc8d8SChris Lattner     SBThread sb_thread;
27117a6ad05SGreg Clayton     ThreadSP thread_sp;
272acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
273acdbe816SGreg Clayton     if (process_sp)
274af67cecdSGreg Clayton     {
275bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
276acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().GetSelectedThread();
27717a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
278af67cecdSGreg Clayton     }
279ceb6b139SCaroline Tice 
280ceb6b139SCaroline Tice     if (log)
281324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
282324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
283324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
284ceb6b139SCaroline Tice 
28530fdc8d8SChris Lattner     return sb_thread;
28630fdc8d8SChris Lattner }
28730fdc8d8SChris Lattner 
288a4d8747dSGreg Clayton SBThread
289a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
290a4d8747dSGreg Clayton {
2915160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
292a4d8747dSGreg Clayton 
293a4d8747dSGreg Clayton     SBThread sb_thread;
294a4d8747dSGreg Clayton     ThreadSP thread_sp;
295a4d8747dSGreg Clayton     ProcessSP process_sp(GetSP());
296a4d8747dSGreg Clayton     if (process_sp)
297a4d8747dSGreg Clayton     {
298bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
299a4d8747dSGreg Clayton         thread_sp = process_sp->CreateOSPluginThread(tid, context);
300a4d8747dSGreg Clayton         sb_thread.SetThread (thread_sp);
301a4d8747dSGreg Clayton     }
302a4d8747dSGreg Clayton 
303a4d8747dSGreg Clayton     if (log)
304324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)",
305324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), tid, context,
306324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
307a4d8747dSGreg Clayton 
308a4d8747dSGreg Clayton     return sb_thread;
309a4d8747dSGreg Clayton }
310a4d8747dSGreg Clayton 
31130fdc8d8SChris Lattner SBTarget
31230fdc8d8SChris Lattner SBProcess::GetTarget() const
31330fdc8d8SChris Lattner {
3145160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
315ceb6b139SCaroline Tice 
31630fdc8d8SChris Lattner     SBTarget sb_target;
317b9556accSGreg Clayton     TargetSP target_sp;
318acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
319acdbe816SGreg Clayton     if (process_sp)
320b9556accSGreg Clayton     {
321acdbe816SGreg Clayton         target_sp = process_sp->GetTarget().shared_from_this();
322b9556accSGreg Clayton         sb_target.SetSP (target_sp);
323b9556accSGreg Clayton     }
324ceb6b139SCaroline Tice 
325ceb6b139SCaroline Tice     if (log)
326324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)",
327324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
328324a1036SSaleem Abdulrasool                      static_cast<void*>(target_sp.get()));
329ceb6b139SCaroline Tice 
33030fdc8d8SChris Lattner     return sb_target;
33130fdc8d8SChris Lattner }
33230fdc8d8SChris Lattner 
33330fdc8d8SChris Lattner 
33430fdc8d8SChris Lattner size_t
33530fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
33630fdc8d8SChris Lattner {
3375160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
338ceb6b139SCaroline Tice 
339ceb6b139SCaroline Tice     size_t ret_val = 0;
340acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
341acdbe816SGreg Clayton     if (process_sp)
34230fdc8d8SChris Lattner     {
34330fdc8d8SChris Lattner         Error error;
344acdbe816SGreg Clayton         ret_val =  process_sp->PutSTDIN (src, src_len, error);
34530fdc8d8SChris Lattner     }
346ceb6b139SCaroline Tice 
347ceb6b139SCaroline Tice     if (log)
3486fea17e8SGreg Clayton         log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64,
349324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), src,
350324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(src_len),
351324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(ret_val));
352ceb6b139SCaroline Tice 
353ceb6b139SCaroline Tice     return ret_val;
35430fdc8d8SChris Lattner }
35530fdc8d8SChris Lattner 
35630fdc8d8SChris Lattner size_t
35730fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
35830fdc8d8SChris Lattner {
359cfd1acedSGreg Clayton     size_t bytes_read = 0;
360acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
361acdbe816SGreg Clayton     if (process_sp)
36230fdc8d8SChris Lattner     {
36330fdc8d8SChris Lattner         Error error;
364acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
36530fdc8d8SChris Lattner     }
366ceb6b139SCaroline Tice 
3675160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
368ceb6b139SCaroline Tice     if (log)
369d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
370324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
371324a1036SSaleem Abdulrasool                      static_cast<int>(bytes_read), dst,
372324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len),
373324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_read));
374ceb6b139SCaroline Tice 
375cfd1acedSGreg Clayton     return bytes_read;
37630fdc8d8SChris Lattner }
37730fdc8d8SChris Lattner 
37830fdc8d8SChris Lattner size_t
37930fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
38030fdc8d8SChris Lattner {
381cfd1acedSGreg Clayton     size_t bytes_read = 0;
382acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
383acdbe816SGreg Clayton     if (process_sp)
38430fdc8d8SChris Lattner     {
38530fdc8d8SChris Lattner         Error error;
386acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
38730fdc8d8SChris Lattner     }
388ceb6b139SCaroline Tice 
3895160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
390ceb6b139SCaroline Tice     if (log)
391d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
392324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
393324a1036SSaleem Abdulrasool                      static_cast<int>(bytes_read), dst,
394324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len),
395324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_read));
396ceb6b139SCaroline Tice 
397cfd1acedSGreg Clayton     return bytes_read;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
400ab3b8b22SHan Ming Ong size_t
401ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
402ab3b8b22SHan Ming Ong {
403ab3b8b22SHan Ming Ong     size_t bytes_read = 0;
404ab3b8b22SHan Ming Ong     ProcessSP process_sp(GetSP());
405ab3b8b22SHan Ming Ong     if (process_sp)
406ab3b8b22SHan Ming Ong     {
407ab3b8b22SHan Ming Ong         Error error;
408ab3b8b22SHan Ming Ong         bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
409ab3b8b22SHan Ming Ong     }
410ab3b8b22SHan Ming Ong 
4115160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
412ab3b8b22SHan Ming Ong     if (log)
413adb99821SBruce Mitchener         log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
414324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
415324a1036SSaleem Abdulrasool                      static_cast<int>(bytes_read), dst,
416324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(dst_len),
417324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_read));
418ab3b8b22SHan Ming Ong 
419ab3b8b22SHan Ming Ong     return bytes_read;
420ab3b8b22SHan Ming Ong }
421ab3b8b22SHan Ming Ong 
42230fdc8d8SChris Lattner void
4232976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
42430fdc8d8SChris Lattner {
42530fdc8d8SChris Lattner     if (out == NULL)
42630fdc8d8SChris Lattner         return;
42730fdc8d8SChris Lattner 
428acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
429acdbe816SGreg Clayton     if (process_sp)
43030fdc8d8SChris Lattner     {
43130fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
43230fdc8d8SChris Lattner         char message[1024];
43330fdc8d8SChris Lattner         int message_len = ::snprintf (message,
43430fdc8d8SChris Lattner                                       sizeof (message),
435d01b2953SDaniel Malea                                       "Process %" PRIu64 " %s\n",
436acdbe816SGreg Clayton                                       process_sp->GetID(),
43730fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
43830fdc8d8SChris Lattner 
43930fdc8d8SChris Lattner         if (message_len > 0)
44030fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
44130fdc8d8SChris Lattner     }
44230fdc8d8SChris Lattner }
44330fdc8d8SChris Lattner 
44430fdc8d8SChris Lattner void
4452976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
44630fdc8d8SChris Lattner {
447acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
448acdbe816SGreg Clayton     if (process_sp)
44930fdc8d8SChris Lattner     {
45030fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
45130fdc8d8SChris Lattner         char message[1024];
45230fdc8d8SChris Lattner         ::snprintf (message,
45330fdc8d8SChris Lattner                     sizeof (message),
454d01b2953SDaniel Malea                     "Process %" PRIu64 " %s\n",
455acdbe816SGreg Clayton                     process_sp->GetID(),
45630fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner         result.AppendMessage (message);
45930fdc8d8SChris Lattner     }
46030fdc8d8SChris Lattner }
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner bool
4632976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
46430fdc8d8SChris Lattner {
465acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
466acdbe816SGreg Clayton     if (process_sp)
467af67cecdSGreg Clayton     {
468bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
469acdbe816SGreg Clayton         return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
470af67cecdSGreg Clayton     }
47130fdc8d8SChris Lattner     return false;
47230fdc8d8SChris Lattner }
47330fdc8d8SChris Lattner 
47430fdc8d8SChris Lattner bool
475ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
476ea561dcfSGreg Clayton {
4775160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
478ceb6b139SCaroline Tice 
479ceb6b139SCaroline Tice     bool ret_val = false;
480acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
481acdbe816SGreg Clayton     if (process_sp)
482af67cecdSGreg Clayton     {
483bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
484acdbe816SGreg Clayton         ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
485af67cecdSGreg Clayton     }
486ceb6b139SCaroline Tice 
487ceb6b139SCaroline Tice     if (log)
488d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
489324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), tid,
490324a1036SSaleem Abdulrasool                      (ret_val ? "true" : "false"));
491ceb6b139SCaroline Tice 
492ceb6b139SCaroline Tice     return ret_val;
49330fdc8d8SChris Lattner }
49430fdc8d8SChris Lattner 
49518b46896SJim Ingham bool
49618b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
49718b46896SJim Ingham {
4985160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
49918b46896SJim Ingham 
50018b46896SJim Ingham     bool ret_val = false;
50118b46896SJim Ingham     ProcessSP process_sp(GetSP());
50218b46896SJim Ingham     if (process_sp)
50318b46896SJim Ingham     {
504bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
50518b46896SJim Ingham         ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
50618b46896SJim Ingham     }
50718b46896SJim Ingham 
50818b46896SJim Ingham     if (log)
50918b46896SJim Ingham         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
510324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), index_id,
511324a1036SSaleem Abdulrasool                      (ret_val ? "true" : "false"));
51218b46896SJim Ingham 
51318b46896SJim Ingham     return ret_val;
51418b46896SJim Ingham }
51518b46896SJim Ingham 
51630fdc8d8SChris Lattner SBThread
51730fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
51830fdc8d8SChris Lattner {
5195160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
520ceb6b139SCaroline Tice 
52117a6ad05SGreg Clayton     SBThread sb_thread;
52217a6ad05SGreg Clayton     ThreadSP thread_sp;
523acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
524acdbe816SGreg Clayton     if (process_sp)
525af67cecdSGreg Clayton     {
5267fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5277fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
528bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
5297fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
53017a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
531af67cecdSGreg Clayton     }
532ceb6b139SCaroline Tice 
533ceb6b139SCaroline Tice     if (log)
53493aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
535324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
536324a1036SSaleem Abdulrasool                      static_cast<uint32_t>(index),
537324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
538ceb6b139SCaroline Tice 
53917a6ad05SGreg Clayton     return sb_thread;
54030fdc8d8SChris Lattner }
54130fdc8d8SChris Lattner 
542bf2956a2SJim Ingham uint32_t
5435e8dce4dSJason Molenda SBProcess::GetNumQueues ()
5445e8dce4dSJason Molenda {
5455e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5465e8dce4dSJason Molenda 
5475e8dce4dSJason Molenda     uint32_t num_queues = 0;
5485e8dce4dSJason Molenda     ProcessSP process_sp(GetSP());
5495e8dce4dSJason Molenda     if (process_sp)
5505e8dce4dSJason Molenda     {
5515e8dce4dSJason Molenda         Process::StopLocker stop_locker;
552*a61d0a5bSGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
553*a61d0a5bSGreg Clayton         {
554bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
5555e8dce4dSJason Molenda             num_queues = process_sp->GetQueueList().GetSize();
5565e8dce4dSJason Molenda         }
557*a61d0a5bSGreg Clayton     }
5585e8dce4dSJason Molenda 
5595e8dce4dSJason Molenda     if (log)
560324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetNumQueues () => %d",
561324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), num_queues);
5625e8dce4dSJason Molenda 
5635e8dce4dSJason Molenda     return num_queues;
5645e8dce4dSJason Molenda }
5655e8dce4dSJason Molenda 
5665e8dce4dSJason Molenda SBQueue
5675e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index)
5685e8dce4dSJason Molenda {
5695e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5705e8dce4dSJason Molenda 
5715e8dce4dSJason Molenda     SBQueue sb_queue;
5725e8dce4dSJason Molenda     QueueSP queue_sp;
5735e8dce4dSJason Molenda     ProcessSP process_sp(GetSP());
5745e8dce4dSJason Molenda     if (process_sp)
5755e8dce4dSJason Molenda     {
5765e8dce4dSJason Molenda         Process::StopLocker stop_locker;
577*a61d0a5bSGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
578*a61d0a5bSGreg Clayton         {
579bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
5805e8dce4dSJason Molenda             queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5815e8dce4dSJason Molenda             sb_queue.SetQueue (queue_sp);
5825e8dce4dSJason Molenda         }
583*a61d0a5bSGreg Clayton     }
5845e8dce4dSJason Molenda 
5855e8dce4dSJason Molenda     if (log)
5865e8dce4dSJason Molenda         log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
587324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
588324a1036SSaleem Abdulrasool                      static_cast<uint32_t>(index),
589324a1036SSaleem Abdulrasool                      static_cast<void*>(queue_sp.get()));
5905e8dce4dSJason Molenda 
5915e8dce4dSJason Molenda     return sb_queue;
5925e8dce4dSJason Molenda }
5935e8dce4dSJason Molenda 
5945e8dce4dSJason Molenda 
5955e8dce4dSJason Molenda uint32_t
596bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops)
597bf2956a2SJim Ingham {
598bf2956a2SJim Ingham     ProcessSP process_sp(GetSP());
599bf2956a2SJim Ingham     if (process_sp)
600bf2956a2SJim Ingham     {
601bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
602bf2956a2SJim Ingham         if (include_expression_stops)
603bf2956a2SJim Ingham             return process_sp->GetStopID();
604bf2956a2SJim Ingham         else
605bf2956a2SJim Ingham             return process_sp->GetLastNaturalStopID();
606bf2956a2SJim Ingham     }
607bf2956a2SJim Ingham     return 0;
608bf2956a2SJim Ingham }
609bf2956a2SJim Ingham 
61038810f43SIlia K SBEvent
61138810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id)
61238810f43SIlia K {
61338810f43SIlia K     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61438810f43SIlia K 
61538810f43SIlia K     SBEvent sb_event;
61638810f43SIlia K     EventSP event_sp;
61738810f43SIlia K     ProcessSP process_sp(GetSP());
61838810f43SIlia K     if (process_sp)
61938810f43SIlia K     {
620bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
62138810f43SIlia K         event_sp = process_sp->GetStopEventForStopID(stop_id);
62238810f43SIlia K         sb_event.reset(event_sp);
62338810f43SIlia K     }
62438810f43SIlia K 
62538810f43SIlia K     if (log)
62638810f43SIlia K         log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)",
62738810f43SIlia K                      static_cast<void*>(process_sp.get()),
62838810f43SIlia K                      stop_id,
62938810f43SIlia K                      static_cast<void*>(event_sp.get()));
63038810f43SIlia K 
63138810f43SIlia K     return sb_event;
63238810f43SIlia K }
63338810f43SIlia K 
63430fdc8d8SChris Lattner StateType
63530fdc8d8SChris Lattner SBProcess::GetState ()
63630fdc8d8SChris Lattner {
637ceb6b139SCaroline Tice 
638ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
639acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
640acdbe816SGreg Clayton     if (process_sp)
641af67cecdSGreg Clayton     {
642bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
643acdbe816SGreg Clayton         ret_val = process_sp->GetState();
644af67cecdSGreg Clayton     }
645ceb6b139SCaroline Tice 
6465160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
647ceb6b139SCaroline Tice     if (log)
648cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
649324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
650750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
651ceb6b139SCaroline Tice 
652ceb6b139SCaroline Tice     return ret_val;
65330fdc8d8SChris Lattner }
65430fdc8d8SChris Lattner 
65530fdc8d8SChris Lattner 
65630fdc8d8SChris Lattner int
65730fdc8d8SChris Lattner SBProcess::GetExitStatus ()
65830fdc8d8SChris Lattner {
6594838131bSGreg Clayton     int exit_status = 0;
660acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
661acdbe816SGreg Clayton     if (process_sp)
662af67cecdSGreg Clayton     {
663bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
664acdbe816SGreg Clayton         exit_status = process_sp->GetExitStatus ();
665af67cecdSGreg Clayton     }
6665160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6674838131bSGreg Clayton     if (log)
6684838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
669324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), exit_status,
670324a1036SSaleem Abdulrasool                      exit_status);
6714838131bSGreg Clayton 
6724838131bSGreg Clayton     return exit_status;
67330fdc8d8SChris Lattner }
67430fdc8d8SChris Lattner 
67530fdc8d8SChris Lattner const char *
67630fdc8d8SChris Lattner SBProcess::GetExitDescription ()
67730fdc8d8SChris Lattner {
6784838131bSGreg Clayton     const char *exit_desc = NULL;
679acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
680acdbe816SGreg Clayton     if (process_sp)
681af67cecdSGreg Clayton     {
682bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
683acdbe816SGreg Clayton         exit_desc = process_sp->GetExitDescription ();
684af67cecdSGreg Clayton     }
6855160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6864838131bSGreg Clayton     if (log)
6874838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
688324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), exit_desc);
6894838131bSGreg Clayton     return exit_desc;
69030fdc8d8SChris Lattner }
69130fdc8d8SChris Lattner 
69230fdc8d8SChris Lattner lldb::pid_t
69330fdc8d8SChris Lattner SBProcess::GetProcessID ()
69430fdc8d8SChris Lattner {
695ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
696acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
697acdbe816SGreg Clayton     if (process_sp)
698acdbe816SGreg Clayton         ret_val = process_sp->GetID();
699ceb6b139SCaroline Tice 
7005160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
701ceb6b139SCaroline Tice     if (log)
702324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
703324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), ret_val);
704ceb6b139SCaroline Tice 
705ceb6b139SCaroline Tice     return ret_val;
70630fdc8d8SChris Lattner }
70730fdc8d8SChris Lattner 
708949e8221SGreg Clayton uint32_t
709949e8221SGreg Clayton SBProcess::GetUniqueID()
710949e8221SGreg Clayton {
711949e8221SGreg Clayton     uint32_t ret_val = 0;
712949e8221SGreg Clayton     ProcessSP process_sp(GetSP());
713949e8221SGreg Clayton     if (process_sp)
714949e8221SGreg Clayton         ret_val = process_sp->GetUniqueID();
7155160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
716949e8221SGreg Clayton     if (log)
717324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
718324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), ret_val);
719949e8221SGreg Clayton     return ret_val;
720949e8221SGreg Clayton }
721949e8221SGreg Clayton 
722cf386e24SJohnny Chen ByteOrder
723cf386e24SJohnny Chen SBProcess::GetByteOrder () const
724cf386e24SJohnny Chen {
725cf386e24SJohnny Chen     ByteOrder byteOrder = eByteOrderInvalid;
726acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
727acdbe816SGreg Clayton     if (process_sp)
728acdbe816SGreg Clayton         byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
729cf386e24SJohnny Chen 
7305160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
731cf386e24SJohnny Chen     if (log)
732324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
733324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), byteOrder);
734cf386e24SJohnny Chen 
735cf386e24SJohnny Chen     return byteOrder;
736cf386e24SJohnny Chen }
737cf386e24SJohnny Chen 
73830fdc8d8SChris Lattner uint32_t
73930fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
74030fdc8d8SChris Lattner {
741ceb6b139SCaroline Tice     uint32_t size = 0;
742acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
743acdbe816SGreg Clayton     if (process_sp)
744acdbe816SGreg Clayton         size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
745ceb6b139SCaroline Tice 
7465160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
747ceb6b139SCaroline Tice     if (log)
748324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
749324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), size);
750ceb6b139SCaroline Tice 
751ceb6b139SCaroline Tice     return size;
75230fdc8d8SChris Lattner }
75330fdc8d8SChris Lattner 
75430fdc8d8SChris Lattner SBError
75530fdc8d8SChris Lattner SBProcess::Continue ()
75630fdc8d8SChris Lattner {
7575160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
758ceb6b139SCaroline Tice 
75930fdc8d8SChris Lattner     SBError sb_error;
760acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
7610c74e78dSGreg Clayton 
762acdbe816SGreg Clayton     if (log)
763324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::Continue ()...",
764324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()));
765acdbe816SGreg Clayton 
766acdbe816SGreg Clayton     if (process_sp)
767acdbe816SGreg Clayton     {
768bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
769acdbe816SGreg Clayton 
770dc6224e0SGreg Clayton         if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ())
771dc6224e0SGreg Clayton             sb_error.ref() = process_sp->Resume ();
772dc6224e0SGreg Clayton         else
773dc6224e0SGreg Clayton             sb_error.ref() = process_sp->ResumeSynchronous (NULL);
7745d5028b5SGreg Clayton     }
77530fdc8d8SChris Lattner     else
77630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
77730fdc8d8SChris Lattner 
778ceb6b139SCaroline Tice     if (log)
779ceb6b139SCaroline Tice     {
780ceb6b139SCaroline Tice         SBStream sstr;
781ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
782324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
783324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
784324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
785ceb6b139SCaroline Tice     }
786ceb6b139SCaroline Tice 
78730fdc8d8SChris Lattner     return sb_error;
78830fdc8d8SChris Lattner }
78930fdc8d8SChris Lattner 
79030fdc8d8SChris Lattner 
79130fdc8d8SChris Lattner SBError
79230fdc8d8SChris Lattner SBProcess::Destroy ()
79330fdc8d8SChris Lattner {
79430fdc8d8SChris Lattner     SBError sb_error;
795acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
796acdbe816SGreg Clayton     if (process_sp)
7976779606aSGreg Clayton     {
798bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
799ede3193bSJason Molenda         sb_error.SetError(process_sp->Destroy(false));
8006779606aSGreg Clayton     }
80130fdc8d8SChris Lattner     else
80230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
80330fdc8d8SChris Lattner 
8045160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8054838131bSGreg Clayton     if (log)
8064838131bSGreg Clayton     {
8074838131bSGreg Clayton         SBStream sstr;
8084838131bSGreg Clayton         sb_error.GetDescription (sstr);
8096779606aSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
810324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
811324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
8124838131bSGreg Clayton     }
8134838131bSGreg Clayton 
81430fdc8d8SChris Lattner     return sb_error;
81530fdc8d8SChris Lattner }
81630fdc8d8SChris Lattner 
81730fdc8d8SChris Lattner 
81830fdc8d8SChris Lattner SBError
81930fdc8d8SChris Lattner SBProcess::Stop ()
82030fdc8d8SChris Lattner {
82130fdc8d8SChris Lattner     SBError sb_error;
822acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
823acdbe816SGreg Clayton     if (process_sp)
824af67cecdSGreg Clayton     {
825bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
826acdbe816SGreg Clayton         sb_error.SetError (process_sp->Halt());
827af67cecdSGreg Clayton     }
82830fdc8d8SChris Lattner     else
82930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
830ceb6b139SCaroline Tice 
8315160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
832ceb6b139SCaroline Tice     if (log)
833ceb6b139SCaroline Tice     {
834ceb6b139SCaroline Tice         SBStream sstr;
835ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
83693aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
837324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
838324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
839ceb6b139SCaroline Tice     }
840ceb6b139SCaroline Tice 
84130fdc8d8SChris Lattner     return sb_error;
84230fdc8d8SChris Lattner }
84330fdc8d8SChris Lattner 
84430fdc8d8SChris Lattner SBError
84530fdc8d8SChris Lattner SBProcess::Kill ()
84630fdc8d8SChris Lattner {
84730fdc8d8SChris Lattner     SBError sb_error;
848acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
849acdbe816SGreg Clayton     if (process_sp)
850af67cecdSGreg Clayton     {
851bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
852ede3193bSJason Molenda         sb_error.SetError (process_sp->Destroy(true));
853af67cecdSGreg Clayton     }
85430fdc8d8SChris Lattner     else
85530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
856ceb6b139SCaroline Tice 
8575160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
858ceb6b139SCaroline Tice     if (log)
859ceb6b139SCaroline Tice     {
860ceb6b139SCaroline Tice         SBStream sstr;
861ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
86293aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
863324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
864324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
865ceb6b139SCaroline Tice     }
866ceb6b139SCaroline Tice 
86730fdc8d8SChris Lattner     return sb_error;
86830fdc8d8SChris Lattner }
86930fdc8d8SChris Lattner 
87030fdc8d8SChris Lattner SBError
87130fdc8d8SChris Lattner SBProcess::Detach ()
87230fdc8d8SChris Lattner {
873acff8950SJim Ingham     // FIXME: This should come from a process default.
874acff8950SJim Ingham     bool keep_stopped = false;
875acff8950SJim Ingham     return Detach (keep_stopped);
876acff8950SJim Ingham }
877acff8950SJim Ingham 
878acff8950SJim Ingham SBError
879acff8950SJim Ingham SBProcess::Detach (bool keep_stopped)
880acff8950SJim Ingham {
88130fdc8d8SChris Lattner     SBError sb_error;
882acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
883acdbe816SGreg Clayton     if (process_sp)
884af67cecdSGreg Clayton     {
885bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
886acff8950SJim Ingham         sb_error.SetError (process_sp->Detach(keep_stopped));
887af67cecdSGreg Clayton     }
88830fdc8d8SChris Lattner     else
88930fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
89030fdc8d8SChris Lattner 
89130fdc8d8SChris Lattner     return sb_error;
89230fdc8d8SChris Lattner }
89330fdc8d8SChris Lattner 
89430fdc8d8SChris Lattner SBError
8954838131bSGreg Clayton SBProcess::Signal (int signo)
89630fdc8d8SChris Lattner {
89730fdc8d8SChris Lattner     SBError sb_error;
898acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
899acdbe816SGreg Clayton     if (process_sp)
900af67cecdSGreg Clayton     {
901bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
902acdbe816SGreg Clayton         sb_error.SetError (process_sp->Signal (signo));
903af67cecdSGreg Clayton     }
90430fdc8d8SChris Lattner     else
90530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
9065160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9074838131bSGreg Clayton     if (log)
9084838131bSGreg Clayton     {
9094838131bSGreg Clayton         SBStream sstr;
9104838131bSGreg Clayton         sb_error.GetDescription (sstr);
9114838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
912324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), signo,
913324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
9144838131bSGreg Clayton     }
91530fdc8d8SChris Lattner     return sb_error;
91630fdc8d8SChris Lattner }
91730fdc8d8SChris Lattner 
918802dc402STodd Fiala SBUnixSignals
919802dc402STodd Fiala SBProcess::GetUnixSignals()
920802dc402STodd Fiala {
92198d0a4b3SChaoren Lin     if (auto process_sp = GetSP())
92298d0a4b3SChaoren Lin         return SBUnixSignals{process_sp};
923802dc402STodd Fiala 
92498d0a4b3SChaoren Lin     return {};
925802dc402STodd Fiala }
926802dc402STodd Fiala 
927cfc0935eSJim Ingham void
928cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt ()
929cfc0935eSJim Ingham {
930cfc0935eSJim Ingham     ProcessSP process_sp(GetSP());
931cfc0935eSJim Ingham     if (process_sp)
932cfc0935eSJim Ingham     {
933cfc0935eSJim Ingham         process_sp->SendAsyncInterrupt ();
934cfc0935eSJim Ingham     }
935cfc0935eSJim Ingham }
936cfc0935eSJim Ingham 
93730fdc8d8SChris Lattner SBThread
9384838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
93930fdc8d8SChris Lattner {
9404838131bSGreg Clayton     SBThread sb_thread;
94117a6ad05SGreg Clayton     ThreadSP thread_sp;
942acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
943acdbe816SGreg Clayton     if (process_sp)
944af67cecdSGreg Clayton     {
9457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9467fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
947bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
9487fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
94917a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
950af67cecdSGreg Clayton     }
9514838131bSGreg Clayton 
9525160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9534838131bSGreg Clayton     if (log)
954d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
955324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), tid,
956324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
9574838131bSGreg Clayton 
9584838131bSGreg Clayton     return sb_thread;
95930fdc8d8SChris Lattner }
96030fdc8d8SChris Lattner 
96118b46896SJim Ingham SBThread
96218b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id)
96318b46896SJim Ingham {
96418b46896SJim Ingham     SBThread sb_thread;
96518b46896SJim Ingham     ThreadSP thread_sp;
96618b46896SJim Ingham     ProcessSP process_sp(GetSP());
96718b46896SJim Ingham     if (process_sp)
96818b46896SJim Ingham     {
96918b46896SJim Ingham         Process::StopLocker stop_locker;
97018b46896SJim Ingham         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
971bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
97218b46896SJim Ingham         thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
97318b46896SJim Ingham         sb_thread.SetThread (thread_sp);
97418b46896SJim Ingham     }
97518b46896SJim Ingham 
9765160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
97718b46896SJim Ingham     if (log)
97818b46896SJim Ingham         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
979324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), index_id,
980324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
98118b46896SJim Ingham 
98218b46896SJim Ingham     return sb_thread;
98318b46896SJim Ingham }
98418b46896SJim Ingham 
98530fdc8d8SChris Lattner StateType
98630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
98730fdc8d8SChris Lattner {
9885160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
989ceb6b139SCaroline Tice 
990ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
991ceb6b139SCaroline Tice 
992ceb6b139SCaroline Tice     if (log)
993324a1036SSaleem Abdulrasool         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
994324a1036SSaleem Abdulrasool                      static_cast<void*>(event.get()),
995750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
996ceb6b139SCaroline Tice 
997ceb6b139SCaroline Tice     return ret_val;
99830fdc8d8SChris Lattner }
99930fdc8d8SChris Lattner 
100030fdc8d8SChris Lattner bool
100130fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
100230fdc8d8SChris Lattner {
1003ea2cc5e0SPavel Labath     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1004ea2cc5e0SPavel Labath 
1005ea2cc5e0SPavel Labath     bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get());
1006ea2cc5e0SPavel Labath 
1007ea2cc5e0SPavel Labath     if (log)
1008400e1809SHans Wennborg         log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
1009400e1809SHans Wennborg                      static_cast<void*>(event.get()), ret_val);
1010ea2cc5e0SPavel Labath 
1011ea2cc5e0SPavel Labath     return ret_val;
101230fdc8d8SChris Lattner }
101330fdc8d8SChris Lattner 
10140161b49cSJim Ingham size_t
10150161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
10160161b49cSJim Ingham {
10170161b49cSJim Ingham     return Process::ProcessEventData::GetNumRestartedReasons(event.get());
10180161b49cSJim Ingham }
10190161b49cSJim Ingham 
10200161b49cSJim Ingham const char *
10210161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
10220161b49cSJim Ingham {
10230161b49cSJim Ingham     return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
10240161b49cSJim Ingham }
10250161b49cSJim Ingham 
102630fdc8d8SChris Lattner SBProcess
102730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
102830fdc8d8SChris Lattner {
10296611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
103030fdc8d8SChris Lattner     return process;
103130fdc8d8SChris Lattner }
103230fdc8d8SChris Lattner 
1033e6bc6cb9SJim Ingham bool
103406d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event)
103506d2855fSIlia K {
103606d2855fSIlia K     return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
103706d2855fSIlia K }
103806d2855fSIlia K 
103906d2855fSIlia K bool
1040e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event)
1041e6bc6cb9SJim Ingham {
1042f9e5dc16SIlia K     return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
1043e6bc6cb9SJim Ingham }
104430fdc8d8SChris Lattner 
104530fdc8d8SChris Lattner SBBroadcaster
104630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
104730fdc8d8SChris Lattner {
10485160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1049ceb6b139SCaroline Tice 
1050acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1051acdbe816SGreg Clayton 
1052acdbe816SGreg Clayton     SBBroadcaster broadcaster(process_sp.get(), false);
1053ceb6b139SCaroline Tice 
1054ceb6b139SCaroline Tice     if (log)
1055324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1056324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
1057324a1036SSaleem Abdulrasool                      static_cast<void*>(broadcaster.get()));
1058ceb6b139SCaroline Tice 
105930fdc8d8SChris Lattner     return broadcaster;
106030fdc8d8SChris Lattner }
106130fdc8d8SChris Lattner 
10624bddaeb5SJim Ingham const char *
10634bddaeb5SJim Ingham SBProcess::GetBroadcasterClass ()
10644bddaeb5SJim Ingham {
10654bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
10664bddaeb5SJim Ingham }
10674bddaeb5SJim Ingham 
106830fdc8d8SChris Lattner size_t
106930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
107030fdc8d8SChris Lattner {
10715160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1072ceb6b139SCaroline Tice 
107330fdc8d8SChris Lattner     size_t bytes_read = 0;
107430fdc8d8SChris Lattner 
1075acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1076acdbe816SGreg Clayton 
10774838131bSGreg Clayton     if (log)
1078d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
1079324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1080324a1036SSaleem Abdulrasool                      static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1081324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()));
10824838131bSGreg Clayton 
1083acdbe816SGreg Clayton     if (process_sp)
108430fdc8d8SChris Lattner     {
10857fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10867fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
10877fdf9ef1SGreg Clayton         {
1088bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
10897fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
10907fdf9ef1SGreg Clayton         }
10917fdf9ef1SGreg Clayton         else
10927fdf9ef1SGreg Clayton         {
1093c9858e4dSGreg Clayton             if (log)
1094324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1095324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
10967fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
10977fdf9ef1SGreg Clayton         }
109830fdc8d8SChris Lattner     }
109930fdc8d8SChris Lattner     else
110030fdc8d8SChris Lattner     {
110130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
110230fdc8d8SChris Lattner     }
110330fdc8d8SChris Lattner 
1104ceb6b139SCaroline Tice     if (log)
110593aa84e8SGreg Clayton     {
110693aa84e8SGreg Clayton         SBStream sstr;
110793aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
1108d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1109324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1110324a1036SSaleem Abdulrasool                      static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1111324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData(),
1112324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_read));
111393aa84e8SGreg Clayton     }
1114ceb6b139SCaroline Tice 
111530fdc8d8SChris Lattner     return bytes_read;
111630fdc8d8SChris Lattner }
111730fdc8d8SChris Lattner 
111830fdc8d8SChris Lattner size_t
1119e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1120e91b7957SGreg Clayton {
1121e91b7957SGreg Clayton     size_t bytes_read = 0;
1122acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1123acdbe816SGreg Clayton     if (process_sp)
1124e91b7957SGreg Clayton     {
11257fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11267fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11277fdf9ef1SGreg Clayton         {
1128bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
11297fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
11307fdf9ef1SGreg Clayton         }
11317fdf9ef1SGreg Clayton         else
11327fdf9ef1SGreg Clayton         {
11335160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1134c9858e4dSGreg Clayton             if (log)
1135324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1136324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11377fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11387fdf9ef1SGreg Clayton         }
1139e91b7957SGreg Clayton     }
1140e91b7957SGreg Clayton     else
1141e91b7957SGreg Clayton     {
1142e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1143e91b7957SGreg Clayton     }
1144e91b7957SGreg Clayton     return bytes_read;
1145e91b7957SGreg Clayton }
1146e91b7957SGreg Clayton 
1147e91b7957SGreg Clayton uint64_t
1148e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1149e91b7957SGreg Clayton {
11507fdf9ef1SGreg Clayton     uint64_t value = 0;
1151acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1152acdbe816SGreg Clayton     if (process_sp)
1153e91b7957SGreg Clayton     {
11547fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11557fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11567fdf9ef1SGreg Clayton         {
1157bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
11587fdf9ef1SGreg Clayton             value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
11597fdf9ef1SGreg Clayton         }
11607fdf9ef1SGreg Clayton         else
11617fdf9ef1SGreg Clayton         {
11625160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1163c9858e4dSGreg Clayton             if (log)
1164324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1165324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11667fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11677fdf9ef1SGreg Clayton         }
1168e91b7957SGreg Clayton     }
1169e91b7957SGreg Clayton     else
1170e91b7957SGreg Clayton     {
1171e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1172e91b7957SGreg Clayton     }
11737fdf9ef1SGreg Clayton     return value;
1174e91b7957SGreg Clayton }
1175e91b7957SGreg Clayton 
1176e91b7957SGreg Clayton lldb::addr_t
1177e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1178e91b7957SGreg Clayton {
1179e91b7957SGreg Clayton     lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1180acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1181acdbe816SGreg Clayton     if (process_sp)
1182e91b7957SGreg Clayton     {
11837fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11847fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11857fdf9ef1SGreg Clayton         {
1186bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
11877fdf9ef1SGreg Clayton             ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
11887fdf9ef1SGreg Clayton         }
11897fdf9ef1SGreg Clayton         else
11907fdf9ef1SGreg Clayton         {
11915160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1192c9858e4dSGreg Clayton             if (log)
1193324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1194324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11957fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11967fdf9ef1SGreg Clayton         }
1197e91b7957SGreg Clayton     }
1198e91b7957SGreg Clayton     else
1199e91b7957SGreg Clayton     {
1200e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1201e91b7957SGreg Clayton     }
1202e91b7957SGreg Clayton     return ptr;
1203e91b7957SGreg Clayton }
1204e91b7957SGreg Clayton 
1205e91b7957SGreg Clayton size_t
120630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
120730fdc8d8SChris Lattner {
120830fdc8d8SChris Lattner     size_t bytes_written = 0;
120930fdc8d8SChris Lattner 
12105160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1211acdbe816SGreg Clayton 
1212acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1213acdbe816SGreg Clayton 
12144838131bSGreg Clayton     if (log)
1215d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1216324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1217324a1036SSaleem Abdulrasool                      static_cast<const void*>(src),
1218324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(src_len),
1219324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()));
12204838131bSGreg Clayton 
1221acdbe816SGreg Clayton     if (process_sp)
122230fdc8d8SChris Lattner     {
12237fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12247fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
12257fdf9ef1SGreg Clayton         {
1226bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
12277fdf9ef1SGreg Clayton             bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
12287fdf9ef1SGreg Clayton         }
12297fdf9ef1SGreg Clayton         else
12307fdf9ef1SGreg Clayton         {
1231c9858e4dSGreg Clayton             if (log)
1232324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1233324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
12347fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
12357fdf9ef1SGreg Clayton         }
123630fdc8d8SChris Lattner     }
123730fdc8d8SChris Lattner 
12384838131bSGreg Clayton     if (log)
12394838131bSGreg Clayton     {
12404838131bSGreg Clayton         SBStream sstr;
12414838131bSGreg Clayton         sb_error.GetDescription (sstr);
1242d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1243324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1244324a1036SSaleem Abdulrasool                      static_cast<const void*>(src),
1245324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(src_len),
1246324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData(),
1247324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_written));
12484838131bSGreg Clayton     }
12494838131bSGreg Clayton 
125030fdc8d8SChris Lattner     return bytes_written;
125130fdc8d8SChris Lattner }
125230fdc8d8SChris Lattner 
1253dde9cff3SCaroline Tice bool
1254dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
1255dde9cff3SCaroline Tice {
1256da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1257da7bc7d0SGreg Clayton 
1258acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1259acdbe816SGreg Clayton     if (process_sp)
1260dde9cff3SCaroline Tice     {
1261dde9cff3SCaroline Tice         char path[PATH_MAX];
1262dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
1263acdbe816SGreg Clayton         Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
12641d273166SGreg Clayton         const char *exe_name = NULL;
12651d273166SGreg Clayton         if (exe_module)
12661d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
12671d273166SGreg Clayton 
1268d01b2953SDaniel Malea         strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1269acdbe816SGreg Clayton                      process_sp->GetID(),
1270ceb6b139SCaroline Tice                      lldb_private::StateAsCString (GetState()),
12711d273166SGreg Clayton                      GetNumThreads(),
127205faeb71SGreg Clayton                      exe_name ? ", executable = " : "",
12731d273166SGreg Clayton                      exe_name ? exe_name : "");
1274dde9cff3SCaroline Tice     }
1275dde9cff3SCaroline Tice     else
1276da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1277dde9cff3SCaroline Tice 
1278dde9cff3SCaroline Tice     return true;
1279dde9cff3SCaroline Tice }
12808f343b09SGreg Clayton 
12818f343b09SGreg Clayton uint32_t
1282f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1283f9ef60d2SJohnny Chen {
12845160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1285f9ef60d2SJohnny Chen 
1286f9ef60d2SJohnny Chen     uint32_t num = 0;
1287f9ef60d2SJohnny Chen     ProcessSP process_sp(GetSP());
1288f9ef60d2SJohnny Chen     if (process_sp)
1289f9ef60d2SJohnny Chen     {
1290bb19a13cSSaleem Abdulrasool         std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
1291f9ef60d2SJohnny Chen         sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1292f9ef60d2SJohnny Chen         if (log)
1293f9ef60d2SJohnny Chen             log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1294324a1036SSaleem Abdulrasool                          static_cast<void*>(process_sp.get()), num);
1295f9ef60d2SJohnny Chen     }
1296f9ef60d2SJohnny Chen     else
1297f9ef60d2SJohnny Chen     {
1298f9ef60d2SJohnny Chen         sb_error.SetErrorString ("SBProcess is invalid");
1299f9ef60d2SJohnny Chen     }
1300f9ef60d2SJohnny Chen     return num;
1301f9ef60d2SJohnny Chen }
1302f9ef60d2SJohnny Chen 
1303f9ef60d2SJohnny Chen uint32_t
13044fbd67acSTamas Berghammer SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error)
13054fbd67acSTamas Berghammer {
13064fbd67acSTamas Berghammer     return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
13074fbd67acSTamas Berghammer }
13084fbd67acSTamas Berghammer 
13094fbd67acSTamas Berghammer uint32_t
13104fbd67acSTamas Berghammer SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec,
13114fbd67acSTamas Berghammer                       const lldb::SBFileSpec &sb_remote_image_spec,
13124fbd67acSTamas Berghammer                       lldb::SBError &sb_error)
13138f343b09SGreg Clayton {
1314acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1315acdbe816SGreg Clayton     if (process_sp)
1316af67cecdSGreg Clayton     {
13177fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13187fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
13197fdf9ef1SGreg Clayton         {
1320bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
13213cb132a0STamas Berghammer             PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
13224fbd67acSTamas Berghammer             return platform_sp->LoadImage (process_sp.get(),
13234fbd67acSTamas Berghammer                                            *sb_local_image_spec,
13244fbd67acSTamas Berghammer                                            *sb_remote_image_spec,
13254fbd67acSTamas Berghammer                                            sb_error.ref());
1326af67cecdSGreg Clayton         }
13277fdf9ef1SGreg Clayton         else
13287fdf9ef1SGreg Clayton         {
13295160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1330c9858e4dSGreg Clayton             if (log)
1331324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1332324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
13337fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
13347fdf9ef1SGreg Clayton         }
13357fdf9ef1SGreg Clayton     }
13368f343b09SGreg Clayton     return LLDB_INVALID_IMAGE_TOKEN;
13378f343b09SGreg Clayton }
13388f343b09SGreg Clayton 
13398f343b09SGreg Clayton lldb::SBError
13408f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token)
13418f343b09SGreg Clayton {
13428f343b09SGreg Clayton     lldb::SBError sb_error;
1343acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1344acdbe816SGreg Clayton     if (process_sp)
1345af67cecdSGreg Clayton     {
13467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13477fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
13487fdf9ef1SGreg Clayton         {
1349bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
13503cb132a0STamas Berghammer             PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
13513cb132a0STamas Berghammer             sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token));
1352af67cecdSGreg Clayton         }
13538f343b09SGreg Clayton         else
13547fdf9ef1SGreg Clayton         {
13555160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1356c9858e4dSGreg Clayton             if (log)
1357324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1358324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
13597fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
13607fdf9ef1SGreg Clayton         }
13617fdf9ef1SGreg Clayton     }
13627fdf9ef1SGreg Clayton     else
13638f343b09SGreg Clayton         sb_error.SetErrorString("invalid process");
13648f343b09SGreg Clayton     return sb_error;
13658f343b09SGreg Clayton }
13668c71337aSJason Molenda 
1367a332978bSJason Molenda lldb::SBError
1368a332978bSJason Molenda SBProcess::SendEventData (const char *event_data)
1369a332978bSJason Molenda {
1370a332978bSJason Molenda     lldb::SBError sb_error;
1371a332978bSJason Molenda     ProcessSP process_sp(GetSP());
1372a332978bSJason Molenda     if (process_sp)
1373a332978bSJason Molenda     {
1374a332978bSJason Molenda         Process::StopLocker stop_locker;
1375a332978bSJason Molenda         if (stop_locker.TryLock(&process_sp->GetRunLock()))
1376a332978bSJason Molenda         {
1377bb19a13cSSaleem Abdulrasool             std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
1378a332978bSJason Molenda             sb_error.SetError (process_sp->SendEventData (event_data));
1379a332978bSJason Molenda         }
1380a332978bSJason Molenda         else
1381a332978bSJason Molenda         {
1382a332978bSJason Molenda             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1383a332978bSJason Molenda             if (log)
1384324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1385324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
1386a332978bSJason Molenda             sb_error.SetErrorString("process is running");
1387a332978bSJason Molenda         }
1388a332978bSJason Molenda     }
1389a332978bSJason Molenda     else
1390a332978bSJason Molenda         sb_error.SetErrorString("invalid process");
1391a332978bSJason Molenda     return sb_error;
1392a332978bSJason Molenda }
1393a332978bSJason Molenda 
13948c71337aSJason Molenda uint32_t
139595d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes ()
13968c71337aSJason Molenda {
13978c71337aSJason Molenda     ProcessSP process_sp(GetSP());
13988c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
13998c71337aSJason Molenda     {
14008c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
140195d005c7SJason Molenda         return runtime->GetExtendedBacktraceTypes().size();
14028c71337aSJason Molenda     }
14038c71337aSJason Molenda     return 0;
14048c71337aSJason Molenda }
14058c71337aSJason Molenda 
14068c71337aSJason Molenda const char *
140795d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
14088c71337aSJason Molenda {
14098c71337aSJason Molenda     ProcessSP process_sp(GetSP());
14108c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
14118c71337aSJason Molenda     {
14128c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
1413008c45f1SJason Molenda         const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
14148c71337aSJason Molenda         if (idx < names.size())
14158c71337aSJason Molenda         {
14168c71337aSJason Molenda             return names[idx].AsCString();
14178c71337aSJason Molenda         }
14188c71337aSJason Molenda         else
14198c71337aSJason Molenda         {
14208c71337aSJason Molenda             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14218c71337aSJason Molenda             if (log)
1422324a1036SSaleem Abdulrasool                 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1423324a1036SSaleem Abdulrasool                             static_cast<void*>(process_sp.get()));
14248c71337aSJason Molenda         }
14258c71337aSJason Molenda     }
14268c71337aSJason Molenda     return NULL;
14278c71337aSJason Molenda }
1428a51ea382SKuba Brecka 
1429a51ea382SKuba Brecka SBThreadCollection
1430a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr)
1431a51ea382SKuba Brecka {
1432a51ea382SKuba Brecka     ProcessSP process_sp(GetSP());
1433a51ea382SKuba Brecka     SBThreadCollection threads;
1434a51ea382SKuba Brecka     if (process_sp)
1435a51ea382SKuba Brecka     {
1436a51ea382SKuba Brecka         threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1437a51ea382SKuba Brecka     }
1438a51ea382SKuba Brecka     return threads;
1439a51ea382SKuba Brecka }
144063927548SKuba Brecka 
144163927548SKuba Brecka bool
144263927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
144363927548SKuba Brecka {
144463927548SKuba Brecka     ProcessSP process_sp(GetSP());
144563927548SKuba Brecka     if (! process_sp)
144663927548SKuba Brecka         return false;
144763927548SKuba Brecka 
144863927548SKuba Brecka     InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
144963927548SKuba Brecka 
145063927548SKuba Brecka     if (! runtime_sp.get())
145163927548SKuba Brecka         return false;
145263927548SKuba Brecka 
145363927548SKuba Brecka     return runtime_sp->IsActive();
145463927548SKuba Brecka }
1455f7d1893fSAdrian McCarthy 
1456f7d1893fSAdrian McCarthy lldb::SBError
1457f7d1893fSAdrian McCarthy SBProcess::SaveCore(const char *file_name)
1458f7d1893fSAdrian McCarthy {
1459f7d1893fSAdrian McCarthy     lldb::SBError error;
1460f7d1893fSAdrian McCarthy     ProcessSP process_sp(GetSP());
1461f7d1893fSAdrian McCarthy     if (!process_sp)
1462f7d1893fSAdrian McCarthy     {
1463f7d1893fSAdrian McCarthy         error.SetErrorString("SBProcess is invalid");
1464f7d1893fSAdrian McCarthy         return error;
1465f7d1893fSAdrian McCarthy     }
1466f7d1893fSAdrian McCarthy 
1467bb19a13cSSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
1468f7d1893fSAdrian McCarthy 
1469f7d1893fSAdrian McCarthy     if (process_sp->GetState() != eStateStopped)
1470f7d1893fSAdrian McCarthy     {
1471f7d1893fSAdrian McCarthy         error.SetErrorString("the process is not stopped");
1472f7d1893fSAdrian McCarthy         return error;
1473f7d1893fSAdrian McCarthy     }
1474f7d1893fSAdrian McCarthy 
1475f7d1893fSAdrian McCarthy     FileSpec core_file(file_name, false);
1476f7d1893fSAdrian McCarthy     error.ref() = PluginManager::SaveCore(process_sp, core_file);
1477f7d1893fSAdrian McCarthy     return error;
1478f7d1893fSAdrian McCarthy }
1479