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 
1093a64300SDaniel Malea #include "lldb/lldb-python.h"
1193a64300SDaniel Malea 
124c5de699SEli Friedman #include "lldb/API/SBProcess.h"
1330fdc8d8SChris Lattner 
14bdae3787SVirgile Bello // C Includes
15bdae3787SVirgile Bello #include <inttypes.h>
16bdae3787SVirgile Bello 
1730fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
1830fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1930fdc8d8SChris Lattner 
2040af72e1SJim Ingham #include "lldb/Interpreter/Args.h"
215d5028b5SGreg Clayton #include "lldb/Core/Debugger.h"
22ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
231f746071SGreg Clayton #include "lldb/Core/Module.h"
2430fdc8d8SChris Lattner #include "lldb/Core/State.h"
2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2730fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2830fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
298c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h"
306611103cSGreg Clayton #include "lldb/Target/Target.h"
316611103cSGreg Clayton #include "lldb/Target/Thread.h"
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner // Project includes
3430fdc8d8SChris Lattner 
354c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h"
364c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h"
370e615684SGreg Clayton #include "lldb/API/SBDebugger.h"
384c5de699SEli Friedman #include "lldb/API/SBEvent.h"
390e615684SGreg Clayton #include "lldb/API/SBFileSpec.h"
404c5de699SEli Friedman #include "lldb/API/SBThread.h"
41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
424c5de699SEli Friedman #include "lldb/API/SBStringList.h"
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner using namespace lldb;
4530fdc8d8SChris Lattner using namespace lldb_private;
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner SBProcess::SBProcess () :
494e0fe8abSGreg Clayton     m_opaque_wp()
5030fdc8d8SChris Lattner {
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner //----------------------------------------------------------------------
5530fdc8d8SChris Lattner // SBProcess constructor
5630fdc8d8SChris Lattner //----------------------------------------------------------------------
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
594e0fe8abSGreg Clayton     m_opaque_wp (rhs.m_opaque_wp)
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
654e0fe8abSGreg Clayton     m_opaque_wp (process_sp)
6630fdc8d8SChris Lattner {
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
69efabb123SGreg Clayton const SBProcess&
70efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs)
71efabb123SGreg Clayton {
72efabb123SGreg Clayton     if (this != &rhs)
734e0fe8abSGreg Clayton         m_opaque_wp = rhs.m_opaque_wp;
74efabb123SGreg Clayton     return *this;
75efabb123SGreg Clayton }
76efabb123SGreg Clayton 
7730fdc8d8SChris Lattner //----------------------------------------------------------------------
7830fdc8d8SChris Lattner // Destructor
7930fdc8d8SChris Lattner //----------------------------------------------------------------------
8030fdc8d8SChris Lattner SBProcess::~SBProcess()
8130fdc8d8SChris Lattner {
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
844bddaeb5SJim Ingham const char *
854bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName ()
864bddaeb5SJim Ingham {
874bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
884bddaeb5SJim Ingham }
894bddaeb5SJim Ingham 
90d7b30ef9SJim Ingham const char *
91d7b30ef9SJim Ingham SBProcess::GetPluginName ()
92d7b30ef9SJim Ingham {
93d7b30ef9SJim Ingham     ProcessSP process_sp(GetSP());
94d7b30ef9SJim Ingham     if (process_sp)
95d7b30ef9SJim Ingham     {
9657abc5d6SGreg Clayton         return process_sp->GetPluginName().GetCString();
97d7b30ef9SJim Ingham     }
98d7b30ef9SJim Ingham     return "<Unknown>";
99d7b30ef9SJim Ingham }
100d7b30ef9SJim Ingham 
101d7b30ef9SJim Ingham const char *
102d7b30ef9SJim Ingham SBProcess::GetShortPluginName ()
103d7b30ef9SJim Ingham {
104d7b30ef9SJim Ingham     ProcessSP process_sp(GetSP());
105d7b30ef9SJim Ingham     if (process_sp)
106d7b30ef9SJim Ingham     {
10757abc5d6SGreg Clayton         return process_sp->GetPluginName().GetCString();
108d7b30ef9SJim Ingham     }
109d7b30ef9SJim Ingham     return "<Unknown>";
110d7b30ef9SJim Ingham }
111d7b30ef9SJim Ingham 
112d7b30ef9SJim Ingham 
113b9556accSGreg Clayton lldb::ProcessSP
114b9556accSGreg Clayton SBProcess::GetSP() const
115b9556accSGreg Clayton {
1164e0fe8abSGreg Clayton     return m_opaque_wp.lock();
117b9556accSGreg Clayton }
118b9556accSGreg Clayton 
11930fdc8d8SChris Lattner void
120b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp)
12130fdc8d8SChris Lattner {
1224e0fe8abSGreg Clayton     m_opaque_wp = process_sp;
12330fdc8d8SChris Lattner }
12430fdc8d8SChris Lattner 
12530fdc8d8SChris Lattner void
12630fdc8d8SChris Lattner SBProcess::Clear ()
12730fdc8d8SChris Lattner {
1284e0fe8abSGreg Clayton     m_opaque_wp.reset();
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner 
13230fdc8d8SChris Lattner bool
13330fdc8d8SChris Lattner SBProcess::IsValid() const
13430fdc8d8SChris Lattner {
1354fc6cb9cSJim Ingham     ProcessSP process_sp(m_opaque_wp.lock());
1364fc6cb9cSJim Ingham     return ((bool) process_sp && process_sp->IsValid());
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
1399631aae2SJames McIlree bool
1409631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv,
1419631aae2SJames McIlree                          char const **envp,
1429631aae2SJames McIlree                          const char *stdin_path,
1439631aae2SJames McIlree                          const char *stdout_path,
1449631aae2SJames McIlree                          const char *stderr_path,
1459631aae2SJames McIlree                          const char *working_directory,
1469631aae2SJames McIlree                          uint32_t launch_flags,
1479631aae2SJames McIlree                          bool stop_at_entry,
1489631aae2SJames McIlree                          lldb::SBError& error)
1499631aae2SJames McIlree {
1505160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1519631aae2SJames McIlree     if (log) {
1529631aae2SJames 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))...",
1534e0fe8abSGreg Clayton                      m_opaque_wp.lock().get(),
1549631aae2SJames McIlree                      argv,
1559631aae2SJames McIlree                      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",
1609631aae2SJames McIlree                      launch_flags,
1619631aae2SJames McIlree                      stop_at_entry,
1629631aae2SJames McIlree                      error.get());
1639631aae2SJames McIlree     }
1649631aae2SJames McIlree 
165acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
166acdbe816SGreg Clayton     if (process_sp)
1679631aae2SJames McIlree     {
168acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
169acdbe816SGreg Clayton         if (process_sp->GetState() == eStateConnected)
1709631aae2SJames McIlree         {
171982c9762SGreg Clayton             if (stop_at_entry)
172982c9762SGreg Clayton                 launch_flags |= eLaunchFlagStopAtEntry;
173982c9762SGreg Clayton             ProcessLaunchInfo launch_info (stdin_path,
174982c9762SGreg Clayton                                            stdout_path,
175982c9762SGreg Clayton                                            stderr_path,
176982c9762SGreg Clayton                                            working_directory,
177982c9762SGreg Clayton                                            launch_flags);
178acdbe816SGreg Clayton             Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
179982c9762SGreg Clayton             if (exe_module)
18014715c68SGreg Clayton                 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
181982c9762SGreg Clayton             if (argv)
182982c9762SGreg Clayton                 launch_info.GetArguments().AppendArguments (argv);
183982c9762SGreg Clayton             if (envp)
184982c9762SGreg Clayton                 launch_info.GetEnvironmentEntries ().SetArguments (envp);
185acdbe816SGreg Clayton             error.SetError (process_sp->Launch (launch_info));
1869631aae2SJames McIlree         }
1879631aae2SJames McIlree         else
1889631aae2SJames McIlree         {
1899631aae2SJames McIlree             error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
1909631aae2SJames McIlree         }
1919631aae2SJames McIlree     }
1929631aae2SJames McIlree     else
1939631aae2SJames McIlree     {
1949631aae2SJames McIlree         error.SetErrorString ("unable to attach pid");
1959631aae2SJames McIlree     }
1969631aae2SJames McIlree 
1979631aae2SJames McIlree     if (log) {
1989631aae2SJames McIlree         SBStream sstr;
1999631aae2SJames McIlree         error.GetDescription (sstr);
200acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), 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     {
212acdbe816SGreg Clayton         Mutex::Locker api_locker (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);
233d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
2349631aae2SJames McIlree     }
2359631aae2SJames McIlree 
2369631aae2SJames McIlree     return error.Success();
2379631aae2SJames McIlree }
2389631aae2SJames McIlree 
23930fdc8d8SChris Lattner 
24030fdc8d8SChris Lattner uint32_t
24130fdc8d8SChris Lattner SBProcess::GetNumThreads ()
24230fdc8d8SChris Lattner {
2435160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
244ceb6b139SCaroline Tice 
245ceb6b139SCaroline Tice     uint32_t num_threads = 0;
246acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
247acdbe816SGreg Clayton     if (process_sp)
24830fdc8d8SChris Lattner     {
2497fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2507fdf9ef1SGreg Clayton 
2517fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
252acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
253acdbe816SGreg Clayton         num_threads = process_sp->GetThreadList().GetSize(can_update);
25430fdc8d8SChris Lattner     }
255ceb6b139SCaroline Tice 
256ceb6b139SCaroline Tice     if (log)
257acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
258ceb6b139SCaroline Tice 
259ceb6b139SCaroline Tice     return num_threads;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner SBThread
2632976d00aSJim Ingham SBProcess::GetSelectedThread () const
26430fdc8d8SChris Lattner {
2655160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
266ceb6b139SCaroline Tice 
26730fdc8d8SChris Lattner     SBThread sb_thread;
26817a6ad05SGreg Clayton     ThreadSP thread_sp;
269acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
270acdbe816SGreg Clayton     if (process_sp)
271af67cecdSGreg Clayton     {
272acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
273acdbe816SGreg Clayton         thread_sp = process_sp->GetThreadList().GetSelectedThread();
27417a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
275af67cecdSGreg Clayton     }
276ceb6b139SCaroline Tice 
277ceb6b139SCaroline Tice     if (log)
278ceb6b139SCaroline Tice     {
279acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
280ceb6b139SCaroline Tice     }
281ceb6b139SCaroline Tice 
28230fdc8d8SChris Lattner     return sb_thread;
28330fdc8d8SChris Lattner }
28430fdc8d8SChris Lattner 
285a4d8747dSGreg Clayton SBThread
286a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
287a4d8747dSGreg Clayton {
2885160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
289a4d8747dSGreg Clayton 
290a4d8747dSGreg Clayton     SBThread sb_thread;
291a4d8747dSGreg Clayton     ThreadSP thread_sp;
292a4d8747dSGreg Clayton     ProcessSP process_sp(GetSP());
293a4d8747dSGreg Clayton     if (process_sp)
294a4d8747dSGreg Clayton     {
295a4d8747dSGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
296a4d8747dSGreg Clayton         thread_sp = process_sp->CreateOSPluginThread(tid, context);
297a4d8747dSGreg Clayton         sb_thread.SetThread (thread_sp);
298a4d8747dSGreg Clayton     }
299a4d8747dSGreg Clayton 
300a4d8747dSGreg Clayton     if (log)
301a4d8747dSGreg Clayton         log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get());
302a4d8747dSGreg Clayton 
303a4d8747dSGreg Clayton     return sb_thread;
304a4d8747dSGreg Clayton }
305a4d8747dSGreg Clayton 
30630fdc8d8SChris Lattner SBTarget
30730fdc8d8SChris Lattner SBProcess::GetTarget() const
30830fdc8d8SChris Lattner {
3095160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
310ceb6b139SCaroline Tice 
31130fdc8d8SChris Lattner     SBTarget sb_target;
312b9556accSGreg Clayton     TargetSP target_sp;
313acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
314acdbe816SGreg Clayton     if (process_sp)
315b9556accSGreg Clayton     {
316acdbe816SGreg Clayton         target_sp = process_sp->GetTarget().shared_from_this();
317b9556accSGreg Clayton         sb_target.SetSP (target_sp);
318b9556accSGreg Clayton     }
319ceb6b139SCaroline Tice 
320ceb6b139SCaroline Tice     if (log)
321acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
322ceb6b139SCaroline Tice 
32330fdc8d8SChris Lattner     return sb_target;
32430fdc8d8SChris Lattner }
32530fdc8d8SChris Lattner 
32630fdc8d8SChris Lattner 
32730fdc8d8SChris Lattner size_t
32830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
32930fdc8d8SChris Lattner {
3305160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
331ceb6b139SCaroline Tice 
332ceb6b139SCaroline Tice     size_t ret_val = 0;
333acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
334acdbe816SGreg Clayton     if (process_sp)
33530fdc8d8SChris Lattner     {
33630fdc8d8SChris Lattner         Error error;
337acdbe816SGreg Clayton         ret_val =  process_sp->PutSTDIN (src, src_len, error);
33830fdc8d8SChris Lattner     }
339ceb6b139SCaroline Tice 
340ceb6b139SCaroline Tice     if (log)
341779f9213SSylvestre Ledru         log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %zu",
342acdbe816SGreg Clayton                      process_sp.get(),
34393aa84e8SGreg Clayton                      src,
34493aa84e8SGreg Clayton                      (uint32_t) src_len,
34593aa84e8SGreg Clayton                      ret_val);
346ceb6b139SCaroline Tice 
347ceb6b139SCaroline Tice     return ret_val;
34830fdc8d8SChris Lattner }
34930fdc8d8SChris Lattner 
35030fdc8d8SChris Lattner size_t
35130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
35230fdc8d8SChris Lattner {
353cfd1acedSGreg Clayton     size_t bytes_read = 0;
354acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
355acdbe816SGreg Clayton     if (process_sp)
35630fdc8d8SChris Lattner     {
35730fdc8d8SChris Lattner         Error error;
358acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
35930fdc8d8SChris Lattner     }
360ceb6b139SCaroline Tice 
3615160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
362ceb6b139SCaroline Tice     if (log)
363d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
36443e0af06SGreg Clayton                      process_sp.get(),
36543e0af06SGreg Clayton                      (int) bytes_read,
36643e0af06SGreg Clayton                      dst,
36743e0af06SGreg Clayton                      (uint64_t)dst_len,
36843e0af06SGreg Clayton                      (uint64_t)bytes_read);
369ceb6b139SCaroline Tice 
370cfd1acedSGreg Clayton     return bytes_read;
37130fdc8d8SChris Lattner }
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner size_t
37430fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
37530fdc8d8SChris Lattner {
376cfd1acedSGreg Clayton     size_t bytes_read = 0;
377acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
378acdbe816SGreg Clayton     if (process_sp)
37930fdc8d8SChris Lattner     {
38030fdc8d8SChris Lattner         Error error;
381acdbe816SGreg Clayton         bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
38230fdc8d8SChris Lattner     }
383ceb6b139SCaroline Tice 
3845160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
385ceb6b139SCaroline Tice     if (log)
386d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
38743e0af06SGreg Clayton                      process_sp.get(),
38843e0af06SGreg Clayton                      (int) bytes_read,
38943e0af06SGreg Clayton                      dst,
39043e0af06SGreg Clayton                      (uint64_t)dst_len,
39143e0af06SGreg Clayton                      (uint64_t)bytes_read);
392ceb6b139SCaroline Tice 
393cfd1acedSGreg Clayton     return bytes_read;
39430fdc8d8SChris Lattner }
39530fdc8d8SChris Lattner 
396ab3b8b22SHan Ming Ong size_t
397ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
398ab3b8b22SHan Ming Ong {
399ab3b8b22SHan Ming Ong     size_t bytes_read = 0;
400ab3b8b22SHan Ming Ong     ProcessSP process_sp(GetSP());
401ab3b8b22SHan Ming Ong     if (process_sp)
402ab3b8b22SHan Ming Ong     {
403ab3b8b22SHan Ming Ong         Error error;
404ab3b8b22SHan Ming Ong         bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
405ab3b8b22SHan Ming Ong     }
406ab3b8b22SHan Ming Ong 
4075160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
408ab3b8b22SHan Ming Ong     if (log)
409d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
410ab3b8b22SHan Ming Ong                      process_sp.get(),
411ab3b8b22SHan Ming Ong                      (int) bytes_read,
412ab3b8b22SHan Ming Ong                      dst,
413ab3b8b22SHan Ming Ong                      (uint64_t)dst_len,
414ab3b8b22SHan Ming Ong                      (uint64_t)bytes_read);
415ab3b8b22SHan Ming Ong 
416ab3b8b22SHan Ming Ong     return bytes_read;
417ab3b8b22SHan Ming Ong }
418ab3b8b22SHan Ming Ong 
41930fdc8d8SChris Lattner void
4202976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
42130fdc8d8SChris Lattner {
42230fdc8d8SChris Lattner     if (out == NULL)
42330fdc8d8SChris Lattner         return;
42430fdc8d8SChris Lattner 
425acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
426acdbe816SGreg Clayton     if (process_sp)
42730fdc8d8SChris Lattner     {
42830fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
42930fdc8d8SChris Lattner         char message[1024];
43030fdc8d8SChris Lattner         int message_len = ::snprintf (message,
43130fdc8d8SChris Lattner                                       sizeof (message),
432d01b2953SDaniel Malea                                       "Process %" PRIu64 " %s\n",
433acdbe816SGreg Clayton                                       process_sp->GetID(),
43430fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner         if (message_len > 0)
43730fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
43830fdc8d8SChris Lattner     }
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner void
4422976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
44330fdc8d8SChris Lattner {
444acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
445acdbe816SGreg Clayton     if (process_sp)
44630fdc8d8SChris Lattner     {
44730fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
44830fdc8d8SChris Lattner         char message[1024];
44930fdc8d8SChris Lattner         ::snprintf (message,
45030fdc8d8SChris Lattner                     sizeof (message),
451d01b2953SDaniel Malea                     "Process %" PRIu64 " %s\n",
452acdbe816SGreg Clayton                     process_sp->GetID(),
45330fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner         result.AppendMessage (message);
45630fdc8d8SChris Lattner     }
45730fdc8d8SChris Lattner }
45830fdc8d8SChris Lattner 
45930fdc8d8SChris Lattner bool
4602976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread)
46130fdc8d8SChris Lattner {
462acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
463acdbe816SGreg Clayton     if (process_sp)
464af67cecdSGreg Clayton     {
465acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
466acdbe816SGreg Clayton         return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
467af67cecdSGreg Clayton     }
46830fdc8d8SChris Lattner     return false;
46930fdc8d8SChris Lattner }
47030fdc8d8SChris Lattner 
47130fdc8d8SChris Lattner bool
472ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
473ea561dcfSGreg Clayton {
4745160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
475ceb6b139SCaroline Tice 
476ceb6b139SCaroline Tice     bool ret_val = false;
477acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
478acdbe816SGreg Clayton     if (process_sp)
479af67cecdSGreg Clayton     {
480acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
481acdbe816SGreg Clayton         ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
482af67cecdSGreg Clayton     }
483ceb6b139SCaroline Tice 
484ceb6b139SCaroline Tice     if (log)
485d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
486acdbe816SGreg Clayton                      process_sp.get(), tid, (ret_val ? "true" : "false"));
487ceb6b139SCaroline Tice 
488ceb6b139SCaroline Tice     return ret_val;
48930fdc8d8SChris Lattner }
49030fdc8d8SChris Lattner 
49118b46896SJim Ingham bool
49218b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
49318b46896SJim Ingham {
4945160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
49518b46896SJim Ingham 
49618b46896SJim Ingham     bool ret_val = false;
49718b46896SJim Ingham     ProcessSP process_sp(GetSP());
49818b46896SJim Ingham     if (process_sp)
49918b46896SJim Ingham     {
50018b46896SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
50118b46896SJim Ingham         ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
50218b46896SJim Ingham     }
50318b46896SJim Ingham 
50418b46896SJim Ingham     if (log)
50518b46896SJim Ingham         log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
50618b46896SJim Ingham                      process_sp.get(), index_id, (ret_val ? "true" : "false"));
50718b46896SJim Ingham 
50818b46896SJim Ingham     return ret_val;
50918b46896SJim Ingham }
51018b46896SJim Ingham 
51130fdc8d8SChris Lattner SBThread
51230fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
51330fdc8d8SChris Lattner {
5145160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
515ceb6b139SCaroline Tice 
51617a6ad05SGreg Clayton     SBThread sb_thread;
51717a6ad05SGreg Clayton     ThreadSP thread_sp;
518acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
519acdbe816SGreg Clayton     if (process_sp)
520af67cecdSGreg Clayton     {
5217fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5227fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
523acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5247fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
52517a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
526af67cecdSGreg Clayton     }
527ceb6b139SCaroline Tice 
528ceb6b139SCaroline Tice     if (log)
529ceb6b139SCaroline Tice     {
53093aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
531acdbe816SGreg Clayton                      process_sp.get(), (uint32_t) index, thread_sp.get());
532ceb6b139SCaroline Tice     }
533ceb6b139SCaroline Tice 
53417a6ad05SGreg Clayton     return sb_thread;
53530fdc8d8SChris Lattner }
53630fdc8d8SChris Lattner 
537bf2956a2SJim Ingham uint32_t
538*5e8dce4dSJason Molenda SBProcess::GetNumQueues ()
539*5e8dce4dSJason Molenda {
540*5e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
541*5e8dce4dSJason Molenda 
542*5e8dce4dSJason Molenda     uint32_t num_queues = 0;
543*5e8dce4dSJason Molenda     ProcessSP process_sp(GetSP());
544*5e8dce4dSJason Molenda     if (process_sp)
545*5e8dce4dSJason Molenda     {
546*5e8dce4dSJason Molenda         Process::StopLocker stop_locker;
547*5e8dce4dSJason Molenda 
548*5e8dce4dSJason Molenda         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
549*5e8dce4dSJason Molenda         num_queues = process_sp->GetQueueList().GetSize();
550*5e8dce4dSJason Molenda     }
551*5e8dce4dSJason Molenda 
552*5e8dce4dSJason Molenda     if (log)
553*5e8dce4dSJason Molenda         log->Printf ("SBProcess(%p)::GetNumQueues () => %d", process_sp.get(), num_queues);
554*5e8dce4dSJason Molenda 
555*5e8dce4dSJason Molenda     return num_queues;
556*5e8dce4dSJason Molenda }
557*5e8dce4dSJason Molenda 
558*5e8dce4dSJason Molenda SBQueue
559*5e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index)
560*5e8dce4dSJason Molenda {
561*5e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
562*5e8dce4dSJason Molenda 
563*5e8dce4dSJason Molenda     SBQueue sb_queue;
564*5e8dce4dSJason Molenda     QueueSP queue_sp;
565*5e8dce4dSJason Molenda     ProcessSP process_sp(GetSP());
566*5e8dce4dSJason Molenda     if (process_sp)
567*5e8dce4dSJason Molenda     {
568*5e8dce4dSJason Molenda         Process::StopLocker stop_locker;
569*5e8dce4dSJason Molenda         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
570*5e8dce4dSJason Molenda         queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
571*5e8dce4dSJason Molenda         sb_queue.SetQueue (queue_sp);
572*5e8dce4dSJason Molenda     }
573*5e8dce4dSJason Molenda 
574*5e8dce4dSJason Molenda     if (log)
575*5e8dce4dSJason Molenda     {
576*5e8dce4dSJason Molenda         log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
577*5e8dce4dSJason Molenda                      process_sp.get(), (uint32_t) index, queue_sp.get());
578*5e8dce4dSJason Molenda     }
579*5e8dce4dSJason Molenda 
580*5e8dce4dSJason Molenda     return sb_queue;
581*5e8dce4dSJason Molenda }
582*5e8dce4dSJason Molenda 
583*5e8dce4dSJason Molenda 
584*5e8dce4dSJason Molenda uint32_t
585bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops)
586bf2956a2SJim Ingham {
587bf2956a2SJim Ingham     ProcessSP process_sp(GetSP());
588bf2956a2SJim Ingham     if (process_sp)
589bf2956a2SJim Ingham     {
590bf2956a2SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
591bf2956a2SJim Ingham         if (include_expression_stops)
592bf2956a2SJim Ingham             return process_sp->GetStopID();
593bf2956a2SJim Ingham         else
594bf2956a2SJim Ingham             return process_sp->GetLastNaturalStopID();
595bf2956a2SJim Ingham     }
596bf2956a2SJim Ingham     return 0;
597bf2956a2SJim Ingham }
598bf2956a2SJim Ingham 
59930fdc8d8SChris Lattner StateType
60030fdc8d8SChris Lattner SBProcess::GetState ()
60130fdc8d8SChris Lattner {
602ceb6b139SCaroline Tice 
603ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
604acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
605acdbe816SGreg Clayton     if (process_sp)
606af67cecdSGreg Clayton     {
607acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
608acdbe816SGreg Clayton         ret_val = process_sp->GetState();
609af67cecdSGreg Clayton     }
610ceb6b139SCaroline Tice 
6115160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
612ceb6b139SCaroline Tice     if (log)
613cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
614acdbe816SGreg Clayton                      process_sp.get(),
615750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
616ceb6b139SCaroline Tice 
617ceb6b139SCaroline Tice     return ret_val;
61830fdc8d8SChris Lattner }
61930fdc8d8SChris Lattner 
62030fdc8d8SChris Lattner 
62130fdc8d8SChris Lattner int
62230fdc8d8SChris Lattner SBProcess::GetExitStatus ()
62330fdc8d8SChris Lattner {
6244838131bSGreg Clayton     int exit_status = 0;
625acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
626acdbe816SGreg Clayton     if (process_sp)
627af67cecdSGreg Clayton     {
628acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
629acdbe816SGreg Clayton         exit_status = process_sp->GetExitStatus ();
630af67cecdSGreg Clayton     }
6315160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6324838131bSGreg Clayton     if (log)
6334838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
634acdbe816SGreg Clayton                      process_sp.get(), exit_status, exit_status);
6354838131bSGreg Clayton 
6364838131bSGreg Clayton     return exit_status;
63730fdc8d8SChris Lattner }
63830fdc8d8SChris Lattner 
63930fdc8d8SChris Lattner const char *
64030fdc8d8SChris Lattner SBProcess::GetExitDescription ()
64130fdc8d8SChris Lattner {
6424838131bSGreg Clayton     const char *exit_desc = NULL;
643acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
644acdbe816SGreg Clayton     if (process_sp)
645af67cecdSGreg Clayton     {
646acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
647acdbe816SGreg Clayton         exit_desc = process_sp->GetExitDescription ();
648af67cecdSGreg Clayton     }
6495160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6504838131bSGreg Clayton     if (log)
6514838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
652acdbe816SGreg Clayton                      process_sp.get(), exit_desc);
6534838131bSGreg Clayton     return exit_desc;
65430fdc8d8SChris Lattner }
65530fdc8d8SChris Lattner 
65630fdc8d8SChris Lattner lldb::pid_t
65730fdc8d8SChris Lattner SBProcess::GetProcessID ()
65830fdc8d8SChris Lattner {
659ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
660acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
661acdbe816SGreg Clayton     if (process_sp)
662acdbe816SGreg Clayton         ret_val = process_sp->GetID();
663ceb6b139SCaroline Tice 
6645160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
665ceb6b139SCaroline Tice     if (log)
666d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
667ceb6b139SCaroline Tice 
668ceb6b139SCaroline Tice     return ret_val;
66930fdc8d8SChris Lattner }
67030fdc8d8SChris Lattner 
671949e8221SGreg Clayton uint32_t
672949e8221SGreg Clayton SBProcess::GetUniqueID()
673949e8221SGreg Clayton {
674949e8221SGreg Clayton     uint32_t ret_val = 0;
675949e8221SGreg Clayton     ProcessSP process_sp(GetSP());
676949e8221SGreg Clayton     if (process_sp)
677949e8221SGreg Clayton         ret_val = process_sp->GetUniqueID();
6785160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
679949e8221SGreg Clayton     if (log)
680949e8221SGreg Clayton         log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
681949e8221SGreg Clayton     return ret_val;
682949e8221SGreg Clayton }
683949e8221SGreg Clayton 
684cf386e24SJohnny Chen ByteOrder
685cf386e24SJohnny Chen SBProcess::GetByteOrder () const
686cf386e24SJohnny Chen {
687cf386e24SJohnny Chen     ByteOrder byteOrder = eByteOrderInvalid;
688acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
689acdbe816SGreg Clayton     if (process_sp)
690acdbe816SGreg Clayton         byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
691cf386e24SJohnny Chen 
6925160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
693cf386e24SJohnny Chen     if (log)
694acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
695cf386e24SJohnny Chen 
696cf386e24SJohnny Chen     return byteOrder;
697cf386e24SJohnny Chen }
698cf386e24SJohnny Chen 
69930fdc8d8SChris Lattner uint32_t
70030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
70130fdc8d8SChris Lattner {
702ceb6b139SCaroline Tice     uint32_t size = 0;
703acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
704acdbe816SGreg Clayton     if (process_sp)
705acdbe816SGreg Clayton         size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
706ceb6b139SCaroline Tice 
7075160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
708ceb6b139SCaroline Tice     if (log)
709acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
710ceb6b139SCaroline Tice 
711ceb6b139SCaroline Tice     return size;
71230fdc8d8SChris Lattner }
71330fdc8d8SChris Lattner 
71430fdc8d8SChris Lattner SBError
71530fdc8d8SChris Lattner SBProcess::Continue ()
71630fdc8d8SChris Lattner {
7175160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
718ceb6b139SCaroline Tice 
71930fdc8d8SChris Lattner     SBError sb_error;
720acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
7210c74e78dSGreg Clayton 
722acdbe816SGreg Clayton     if (log)
723acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
724acdbe816SGreg Clayton 
725acdbe816SGreg Clayton     if (process_sp)
726acdbe816SGreg Clayton     {
727acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
728acdbe816SGreg Clayton 
729acdbe816SGreg Clayton         Error error (process_sp->Resume());
7305d5028b5SGreg Clayton         if (error.Success())
7315d5028b5SGreg Clayton         {
732acdbe816SGreg Clayton             if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
7334838131bSGreg Clayton             {
7344838131bSGreg Clayton                 if (log)
735acdbe816SGreg Clayton                     log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
736acdbe816SGreg Clayton                 process_sp->WaitForProcessToStop (NULL);
7375d5028b5SGreg Clayton             }
7384838131bSGreg Clayton         }
7395d5028b5SGreg Clayton         sb_error.SetError(error);
7405d5028b5SGreg Clayton     }
74130fdc8d8SChris Lattner     else
74230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
74330fdc8d8SChris Lattner 
744ceb6b139SCaroline Tice     if (log)
745ceb6b139SCaroline Tice     {
746ceb6b139SCaroline Tice         SBStream sstr;
747ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
748acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
749ceb6b139SCaroline Tice     }
750ceb6b139SCaroline Tice 
75130fdc8d8SChris Lattner     return sb_error;
75230fdc8d8SChris Lattner }
75330fdc8d8SChris Lattner 
75430fdc8d8SChris Lattner 
75530fdc8d8SChris Lattner SBError
75630fdc8d8SChris Lattner SBProcess::Destroy ()
75730fdc8d8SChris Lattner {
75830fdc8d8SChris Lattner     SBError sb_error;
759acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
760acdbe816SGreg Clayton     if (process_sp)
7616779606aSGreg Clayton     {
762acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
763acdbe816SGreg Clayton         sb_error.SetError(process_sp->Destroy());
7646779606aSGreg Clayton     }
76530fdc8d8SChris Lattner     else
76630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
76730fdc8d8SChris Lattner 
7685160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7694838131bSGreg Clayton     if (log)
7704838131bSGreg Clayton     {
7714838131bSGreg Clayton         SBStream sstr;
7724838131bSGreg Clayton         sb_error.GetDescription (sstr);
7736779606aSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
774acdbe816SGreg Clayton                      process_sp.get(),
7756779606aSGreg Clayton                      sb_error.get(),
7766779606aSGreg Clayton                      sstr.GetData());
7774838131bSGreg Clayton     }
7784838131bSGreg Clayton 
77930fdc8d8SChris Lattner     return sb_error;
78030fdc8d8SChris Lattner }
78130fdc8d8SChris Lattner 
78230fdc8d8SChris Lattner 
78330fdc8d8SChris Lattner SBError
78430fdc8d8SChris Lattner SBProcess::Stop ()
78530fdc8d8SChris Lattner {
78630fdc8d8SChris Lattner     SBError sb_error;
787acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
788acdbe816SGreg Clayton     if (process_sp)
789af67cecdSGreg Clayton     {
790acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
791acdbe816SGreg Clayton         sb_error.SetError (process_sp->Halt());
792af67cecdSGreg Clayton     }
79330fdc8d8SChris Lattner     else
79430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
795ceb6b139SCaroline Tice 
7965160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
797ceb6b139SCaroline Tice     if (log)
798ceb6b139SCaroline Tice     {
799ceb6b139SCaroline Tice         SBStream sstr;
800ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
80193aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
802acdbe816SGreg Clayton                      process_sp.get(),
80393aa84e8SGreg Clayton                      sb_error.get(),
804750cd175SCaroline Tice                      sstr.GetData());
805ceb6b139SCaroline Tice     }
806ceb6b139SCaroline Tice 
80730fdc8d8SChris Lattner     return sb_error;
80830fdc8d8SChris Lattner }
80930fdc8d8SChris Lattner 
81030fdc8d8SChris Lattner SBError
81130fdc8d8SChris Lattner SBProcess::Kill ()
81230fdc8d8SChris Lattner {
81330fdc8d8SChris Lattner     SBError sb_error;
814acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
815acdbe816SGreg Clayton     if (process_sp)
816af67cecdSGreg Clayton     {
817acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
818acdbe816SGreg Clayton         sb_error.SetError (process_sp->Destroy());
819af67cecdSGreg Clayton     }
82030fdc8d8SChris Lattner     else
82130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
822ceb6b139SCaroline Tice 
8235160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
824ceb6b139SCaroline Tice     if (log)
825ceb6b139SCaroline Tice     {
826ceb6b139SCaroline Tice         SBStream sstr;
827ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
82893aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
829acdbe816SGreg Clayton                      process_sp.get(),
83093aa84e8SGreg Clayton                      sb_error.get(),
831750cd175SCaroline Tice                      sstr.GetData());
832ceb6b139SCaroline Tice     }
833ceb6b139SCaroline Tice 
83430fdc8d8SChris Lattner     return sb_error;
83530fdc8d8SChris Lattner }
83630fdc8d8SChris Lattner 
83730fdc8d8SChris Lattner SBError
83830fdc8d8SChris Lattner SBProcess::Detach ()
83930fdc8d8SChris Lattner {
840acff8950SJim Ingham     // FIXME: This should come from a process default.
841acff8950SJim Ingham     bool keep_stopped = false;
842acff8950SJim Ingham     return Detach (keep_stopped);
843acff8950SJim Ingham }
844acff8950SJim Ingham 
845acff8950SJim Ingham SBError
846acff8950SJim Ingham SBProcess::Detach (bool keep_stopped)
847acff8950SJim Ingham {
84830fdc8d8SChris Lattner     SBError sb_error;
849acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
850acdbe816SGreg Clayton     if (process_sp)
851af67cecdSGreg Clayton     {
852acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
853acff8950SJim Ingham         sb_error.SetError (process_sp->Detach(keep_stopped));
854af67cecdSGreg Clayton     }
85530fdc8d8SChris Lattner     else
85630fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
85730fdc8d8SChris Lattner 
85830fdc8d8SChris Lattner     return sb_error;
85930fdc8d8SChris Lattner }
86030fdc8d8SChris Lattner 
86130fdc8d8SChris Lattner SBError
8624838131bSGreg Clayton SBProcess::Signal (int signo)
86330fdc8d8SChris Lattner {
86430fdc8d8SChris Lattner     SBError sb_error;
865acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
866acdbe816SGreg Clayton     if (process_sp)
867af67cecdSGreg Clayton     {
868acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
869acdbe816SGreg Clayton         sb_error.SetError (process_sp->Signal (signo));
870af67cecdSGreg Clayton     }
87130fdc8d8SChris Lattner     else
87230fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
8735160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8744838131bSGreg Clayton     if (log)
8754838131bSGreg Clayton     {
8764838131bSGreg Clayton         SBStream sstr;
8774838131bSGreg Clayton         sb_error.GetDescription (sstr);
8784838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
879acdbe816SGreg Clayton                      process_sp.get(),
8804838131bSGreg Clayton                      signo,
8814838131bSGreg Clayton                      sb_error.get(),
8824838131bSGreg Clayton                      sstr.GetData());
8834838131bSGreg Clayton     }
88430fdc8d8SChris Lattner     return sb_error;
88530fdc8d8SChris Lattner }
88630fdc8d8SChris Lattner 
887cfc0935eSJim Ingham void
888cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt ()
889cfc0935eSJim Ingham {
890cfc0935eSJim Ingham     ProcessSP process_sp(GetSP());
891cfc0935eSJim Ingham     if (process_sp)
892cfc0935eSJim Ingham     {
893cfc0935eSJim Ingham         process_sp->SendAsyncInterrupt ();
894cfc0935eSJim Ingham     }
895cfc0935eSJim Ingham }
896cfc0935eSJim Ingham 
89730fdc8d8SChris Lattner SBThread
8984838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
89930fdc8d8SChris Lattner {
9004838131bSGreg Clayton     SBThread sb_thread;
90117a6ad05SGreg Clayton     ThreadSP thread_sp;
902acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
903acdbe816SGreg Clayton     if (process_sp)
904af67cecdSGreg Clayton     {
905acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
9067fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9077fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
9087fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
90917a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
910af67cecdSGreg Clayton     }
9114838131bSGreg Clayton 
9125160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9134838131bSGreg Clayton     if (log)
9144838131bSGreg Clayton     {
915d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
916acdbe816SGreg Clayton                      process_sp.get(),
9174838131bSGreg Clayton                      tid,
91817a6ad05SGreg Clayton                      thread_sp.get());
9194838131bSGreg Clayton     }
9204838131bSGreg Clayton 
9214838131bSGreg Clayton     return sb_thread;
92230fdc8d8SChris Lattner }
92330fdc8d8SChris Lattner 
92418b46896SJim Ingham SBThread
92518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id)
92618b46896SJim Ingham {
92718b46896SJim Ingham     SBThread sb_thread;
92818b46896SJim Ingham     ThreadSP thread_sp;
92918b46896SJim Ingham     ProcessSP process_sp(GetSP());
93018b46896SJim Ingham     if (process_sp)
93118b46896SJim Ingham     {
93218b46896SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
93318b46896SJim Ingham         Process::StopLocker stop_locker;
93418b46896SJim Ingham         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
93518b46896SJim Ingham         thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
93618b46896SJim Ingham         sb_thread.SetThread (thread_sp);
93718b46896SJim Ingham     }
93818b46896SJim Ingham 
9395160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
94018b46896SJim Ingham     if (log)
94118b46896SJim Ingham     {
94218b46896SJim Ingham         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
94318b46896SJim Ingham                      process_sp.get(),
94418b46896SJim Ingham                      index_id,
94518b46896SJim Ingham                      thread_sp.get());
94618b46896SJim Ingham     }
94718b46896SJim Ingham 
94818b46896SJim Ingham     return sb_thread;
94918b46896SJim Ingham }
95018b46896SJim Ingham 
95130fdc8d8SChris Lattner StateType
95230fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
95330fdc8d8SChris Lattner {
9545160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
955ceb6b139SCaroline Tice 
956ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
957ceb6b139SCaroline Tice 
958ceb6b139SCaroline Tice     if (log)
959cfd1acedSGreg Clayton         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
960750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
961ceb6b139SCaroline Tice 
962ceb6b139SCaroline Tice     return ret_val;
96330fdc8d8SChris Lattner }
96430fdc8d8SChris Lattner 
96530fdc8d8SChris Lattner bool
96630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
96730fdc8d8SChris Lattner {
9686611103cSGreg Clayton     return Process::ProcessEventData::GetRestartedFromEvent (event.get());
96930fdc8d8SChris Lattner }
97030fdc8d8SChris Lattner 
9710161b49cSJim Ingham size_t
9720161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
9730161b49cSJim Ingham {
9740161b49cSJim Ingham     return Process::ProcessEventData::GetNumRestartedReasons(event.get());
9750161b49cSJim Ingham }
9760161b49cSJim Ingham 
9770161b49cSJim Ingham const char *
9780161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
9790161b49cSJim Ingham {
9800161b49cSJim Ingham     return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
9810161b49cSJim Ingham }
9820161b49cSJim Ingham 
98330fdc8d8SChris Lattner SBProcess
98430fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
98530fdc8d8SChris Lattner {
9866611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
98730fdc8d8SChris Lattner     return process;
98830fdc8d8SChris Lattner }
98930fdc8d8SChris Lattner 
990e6bc6cb9SJim Ingham bool
991e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event)
992e6bc6cb9SJim Ingham {
9934bddaeb5SJim Ingham     return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
994e6bc6cb9SJim Ingham }
99530fdc8d8SChris Lattner 
99630fdc8d8SChris Lattner SBBroadcaster
99730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
99830fdc8d8SChris Lattner {
9995160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1000ceb6b139SCaroline Tice 
1001acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1002acdbe816SGreg Clayton 
1003acdbe816SGreg Clayton     SBBroadcaster broadcaster(process_sp.get(), false);
1004ceb6b139SCaroline Tice 
1005ceb6b139SCaroline Tice     if (log)
1006acdbe816SGreg Clayton         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  process_sp.get(),
1007750cd175SCaroline Tice                      broadcaster.get());
1008ceb6b139SCaroline Tice 
100930fdc8d8SChris Lattner     return broadcaster;
101030fdc8d8SChris Lattner }
101130fdc8d8SChris Lattner 
10124bddaeb5SJim Ingham const char *
10134bddaeb5SJim Ingham SBProcess::GetBroadcasterClass ()
10144bddaeb5SJim Ingham {
10154bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
10164bddaeb5SJim Ingham }
10174bddaeb5SJim Ingham 
101830fdc8d8SChris Lattner size_t
101930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
102030fdc8d8SChris Lattner {
10215160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1022ceb6b139SCaroline Tice 
102330fdc8d8SChris Lattner     size_t bytes_read = 0;
102430fdc8d8SChris Lattner 
1025acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1026acdbe816SGreg Clayton 
10274838131bSGreg Clayton     if (log)
10284838131bSGreg Clayton     {
1029d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
1030acdbe816SGreg Clayton                      process_sp.get(),
10314838131bSGreg Clayton                      addr,
10324838131bSGreg Clayton                      dst,
103343e0af06SGreg Clayton                      (uint64_t)dst_len,
10344838131bSGreg Clayton                      sb_error.get());
10354838131bSGreg Clayton     }
10364838131bSGreg Clayton 
1037acdbe816SGreg Clayton     if (process_sp)
103830fdc8d8SChris Lattner     {
10397fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10407fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
10417fdf9ef1SGreg Clayton         {
1042acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
10437fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
10447fdf9ef1SGreg Clayton         }
10457fdf9ef1SGreg Clayton         else
10467fdf9ef1SGreg Clayton         {
1047c9858e4dSGreg Clayton             if (log)
1048c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
10497fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
10507fdf9ef1SGreg Clayton         }
105130fdc8d8SChris Lattner     }
105230fdc8d8SChris Lattner     else
105330fdc8d8SChris Lattner     {
105430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
105530fdc8d8SChris Lattner     }
105630fdc8d8SChris Lattner 
1057ceb6b139SCaroline Tice     if (log)
105893aa84e8SGreg Clayton     {
105993aa84e8SGreg Clayton         SBStream sstr;
106093aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
1061d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1062acdbe816SGreg Clayton                      process_sp.get(),
106393aa84e8SGreg Clayton                      addr,
106493aa84e8SGreg Clayton                      dst,
106543e0af06SGreg Clayton                      (uint64_t)dst_len,
106693aa84e8SGreg Clayton                      sb_error.get(),
106793aa84e8SGreg Clayton                      sstr.GetData(),
106843e0af06SGreg Clayton                      (uint64_t)bytes_read);
106993aa84e8SGreg Clayton     }
1070ceb6b139SCaroline Tice 
107130fdc8d8SChris Lattner     return bytes_read;
107230fdc8d8SChris Lattner }
107330fdc8d8SChris Lattner 
107430fdc8d8SChris Lattner size_t
1075e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1076e91b7957SGreg Clayton {
1077e91b7957SGreg Clayton     size_t bytes_read = 0;
1078acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1079acdbe816SGreg Clayton     if (process_sp)
1080e91b7957SGreg Clayton     {
10817fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10827fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
10837fdf9ef1SGreg Clayton         {
1084acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
10857fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
10867fdf9ef1SGreg Clayton         }
10877fdf9ef1SGreg Clayton         else
10887fdf9ef1SGreg Clayton         {
10895160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1090c9858e4dSGreg Clayton             if (log)
1091c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
10927fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
10937fdf9ef1SGreg Clayton         }
1094e91b7957SGreg Clayton     }
1095e91b7957SGreg Clayton     else
1096e91b7957SGreg Clayton     {
1097e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1098e91b7957SGreg Clayton     }
1099e91b7957SGreg Clayton     return bytes_read;
1100e91b7957SGreg Clayton }
1101e91b7957SGreg Clayton 
1102e91b7957SGreg Clayton uint64_t
1103e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1104e91b7957SGreg Clayton {
11057fdf9ef1SGreg Clayton     uint64_t value = 0;
1106acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1107acdbe816SGreg Clayton     if (process_sp)
1108e91b7957SGreg Clayton     {
11097fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11107fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11117fdf9ef1SGreg Clayton         {
1112acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11137fdf9ef1SGreg Clayton             value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
11147fdf9ef1SGreg Clayton         }
11157fdf9ef1SGreg Clayton         else
11167fdf9ef1SGreg Clayton         {
11175160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1118c9858e4dSGreg Clayton             if (log)
1119c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
11207fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11217fdf9ef1SGreg Clayton         }
1122e91b7957SGreg Clayton     }
1123e91b7957SGreg Clayton     else
1124e91b7957SGreg Clayton     {
1125e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1126e91b7957SGreg Clayton     }
11277fdf9ef1SGreg Clayton     return value;
1128e91b7957SGreg Clayton }
1129e91b7957SGreg Clayton 
1130e91b7957SGreg Clayton lldb::addr_t
1131e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1132e91b7957SGreg Clayton {
1133e91b7957SGreg Clayton     lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1134acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1135acdbe816SGreg Clayton     if (process_sp)
1136e91b7957SGreg Clayton     {
11377fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11387fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11397fdf9ef1SGreg Clayton         {
1140acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11417fdf9ef1SGreg Clayton             ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
11427fdf9ef1SGreg Clayton         }
11437fdf9ef1SGreg Clayton         else
11447fdf9ef1SGreg Clayton         {
11455160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1146c9858e4dSGreg Clayton             if (log)
1147c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
11487fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11497fdf9ef1SGreg Clayton         }
1150e91b7957SGreg Clayton     }
1151e91b7957SGreg Clayton     else
1152e91b7957SGreg Clayton     {
1153e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1154e91b7957SGreg Clayton     }
1155e91b7957SGreg Clayton     return ptr;
1156e91b7957SGreg Clayton }
1157e91b7957SGreg Clayton 
1158e91b7957SGreg Clayton size_t
115930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
116030fdc8d8SChris Lattner {
116130fdc8d8SChris Lattner     size_t bytes_written = 0;
116230fdc8d8SChris Lattner 
11635160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1164acdbe816SGreg Clayton 
1165acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1166acdbe816SGreg Clayton 
11674838131bSGreg Clayton     if (log)
11684838131bSGreg Clayton     {
1169d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1170acdbe816SGreg Clayton                      process_sp.get(),
11714838131bSGreg Clayton                      addr,
11724838131bSGreg Clayton                      src,
117343e0af06SGreg Clayton                      (uint64_t)src_len,
11744838131bSGreg Clayton                      sb_error.get());
11754838131bSGreg Clayton     }
11764838131bSGreg Clayton 
1177acdbe816SGreg Clayton     if (process_sp)
117830fdc8d8SChris Lattner     {
11797fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11807fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11817fdf9ef1SGreg Clayton         {
1182acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11837fdf9ef1SGreg Clayton             bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
11847fdf9ef1SGreg Clayton         }
11857fdf9ef1SGreg Clayton         else
11867fdf9ef1SGreg Clayton         {
1187c9858e4dSGreg Clayton             if (log)
1188c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
11897fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11907fdf9ef1SGreg Clayton         }
119130fdc8d8SChris Lattner     }
119230fdc8d8SChris Lattner 
11934838131bSGreg Clayton     if (log)
11944838131bSGreg Clayton     {
11954838131bSGreg Clayton         SBStream sstr;
11964838131bSGreg Clayton         sb_error.GetDescription (sstr);
1197d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1198acdbe816SGreg Clayton                      process_sp.get(),
11994838131bSGreg Clayton                      addr,
12004838131bSGreg Clayton                      src,
120143e0af06SGreg Clayton                      (uint64_t)src_len,
12024838131bSGreg Clayton                      sb_error.get(),
12034838131bSGreg Clayton                      sstr.GetData(),
120443e0af06SGreg Clayton                      (uint64_t)bytes_written);
12054838131bSGreg Clayton     }
12064838131bSGreg Clayton 
120730fdc8d8SChris Lattner     return bytes_written;
120830fdc8d8SChris Lattner }
120930fdc8d8SChris Lattner 
1210dde9cff3SCaroline Tice bool
1211dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
1212dde9cff3SCaroline Tice {
1213da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1214da7bc7d0SGreg Clayton 
1215acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1216acdbe816SGreg Clayton     if (process_sp)
1217dde9cff3SCaroline Tice     {
1218dde9cff3SCaroline Tice         char path[PATH_MAX];
1219dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
1220acdbe816SGreg Clayton         Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
12211d273166SGreg Clayton         const char *exe_name = NULL;
12221d273166SGreg Clayton         if (exe_module)
12231d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
12241d273166SGreg Clayton 
1225d01b2953SDaniel Malea         strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1226acdbe816SGreg Clayton                      process_sp->GetID(),
1227ceb6b139SCaroline Tice                      lldb_private::StateAsCString (GetState()),
12281d273166SGreg Clayton                      GetNumThreads(),
122905faeb71SGreg Clayton                      exe_name ? ", executable = " : "",
12301d273166SGreg Clayton                      exe_name ? exe_name : "");
1231dde9cff3SCaroline Tice     }
1232dde9cff3SCaroline Tice     else
1233da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1234dde9cff3SCaroline Tice 
1235dde9cff3SCaroline Tice     return true;
1236dde9cff3SCaroline Tice }
12378f343b09SGreg Clayton 
12388f343b09SGreg Clayton uint32_t
1239f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1240f9ef60d2SJohnny Chen {
12415160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1242f9ef60d2SJohnny Chen 
1243f9ef60d2SJohnny Chen     uint32_t num = 0;
1244f9ef60d2SJohnny Chen     ProcessSP process_sp(GetSP());
1245f9ef60d2SJohnny Chen     if (process_sp)
1246f9ef60d2SJohnny Chen     {
1247f9ef60d2SJohnny Chen         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1248f9ef60d2SJohnny Chen         sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1249f9ef60d2SJohnny Chen         if (log)
1250f9ef60d2SJohnny Chen             log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1251f9ef60d2SJohnny Chen                          process_sp.get(), num);
1252f9ef60d2SJohnny Chen     }
1253f9ef60d2SJohnny Chen     else
1254f9ef60d2SJohnny Chen     {
1255f9ef60d2SJohnny Chen         sb_error.SetErrorString ("SBProcess is invalid");
1256f9ef60d2SJohnny Chen     }
1257f9ef60d2SJohnny Chen     return num;
1258f9ef60d2SJohnny Chen }
1259f9ef60d2SJohnny Chen 
1260f9ef60d2SJohnny Chen uint32_t
12618f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
12628f343b09SGreg Clayton {
1263acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1264acdbe816SGreg Clayton     if (process_sp)
1265af67cecdSGreg Clayton     {
12667fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12677fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
12687fdf9ef1SGreg Clayton         {
1269acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1270acdbe816SGreg Clayton             return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1271af67cecdSGreg Clayton         }
12727fdf9ef1SGreg Clayton         else
12737fdf9ef1SGreg Clayton         {
12745160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1275c9858e4dSGreg Clayton             if (log)
1276c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
12777fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
12787fdf9ef1SGreg Clayton         }
12797fdf9ef1SGreg Clayton     }
12808f343b09SGreg Clayton     return LLDB_INVALID_IMAGE_TOKEN;
12818f343b09SGreg Clayton }
12828f343b09SGreg Clayton 
12838f343b09SGreg Clayton lldb::SBError
12848f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token)
12858f343b09SGreg Clayton {
12868f343b09SGreg Clayton     lldb::SBError sb_error;
1287acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1288acdbe816SGreg Clayton     if (process_sp)
1289af67cecdSGreg Clayton     {
12907fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12917fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
12927fdf9ef1SGreg Clayton         {
1293acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1294acdbe816SGreg Clayton             sb_error.SetError (process_sp->UnloadImage (image_token));
1295af67cecdSGreg Clayton         }
12968f343b09SGreg Clayton         else
12977fdf9ef1SGreg Clayton         {
12985160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1299c9858e4dSGreg Clayton             if (log)
1300c9858e4dSGreg Clayton                 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
13017fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
13027fdf9ef1SGreg Clayton         }
13037fdf9ef1SGreg Clayton     }
13047fdf9ef1SGreg Clayton     else
13058f343b09SGreg Clayton         sb_error.SetErrorString("invalid process");
13068f343b09SGreg Clayton     return sb_error;
13078f343b09SGreg Clayton }
13088c71337aSJason Molenda 
13098c71337aSJason Molenda uint32_t
131095d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes ()
13118c71337aSJason Molenda {
13128c71337aSJason Molenda     ProcessSP process_sp(GetSP());
13138c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
13148c71337aSJason Molenda     {
13158c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
131695d005c7SJason Molenda         return runtime->GetExtendedBacktraceTypes().size();
13178c71337aSJason Molenda     }
13188c71337aSJason Molenda     return 0;
13198c71337aSJason Molenda }
13208c71337aSJason Molenda 
13218c71337aSJason Molenda const char *
132295d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
13238c71337aSJason Molenda {
13248c71337aSJason Molenda     ProcessSP process_sp(GetSP());
13258c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
13268c71337aSJason Molenda     {
13278c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
1328008c45f1SJason Molenda         const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
13298c71337aSJason Molenda         if (idx < names.size())
13308c71337aSJason Molenda         {
13318c71337aSJason Molenda             return names[idx].AsCString();
13328c71337aSJason Molenda         }
13338c71337aSJason Molenda         else
13348c71337aSJason Molenda         {
13358c71337aSJason Molenda             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13368c71337aSJason Molenda             if (log)
133795d005c7SJason Molenda                 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", process_sp.get());
13388c71337aSJason Molenda         }
13398c71337aSJason Molenda     }
13408c71337aSJason Molenda     return NULL;
13418c71337aSJason Molenda }
1342