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     {
166acdbe816SGreg Clayton         Mutex::Locker api_locker (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     {
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);
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());
254acdbe816SGreg Clayton         Mutex::Locker api_locker (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     {
275acdbe816SGreg Clayton         Mutex::Locker api_locker (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     {
298a4d8747dSGreg Clayton         Mutex::Locker api_locker (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     {
468acdbe816SGreg Clayton         Mutex::Locker api_locker (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     {
483acdbe816SGreg Clayton         Mutex::Locker api_locker (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     {
50418b46896SJim Ingham         Mutex::Locker api_locker (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());
528acdbe816SGreg Clayton         Mutex::Locker api_locker (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;
5525e8dce4dSJason Molenda 
5535e8dce4dSJason Molenda         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5545e8dce4dSJason Molenda         num_queues = process_sp->GetQueueList().GetSize();
5555e8dce4dSJason Molenda     }
5565e8dce4dSJason Molenda 
5575e8dce4dSJason Molenda     if (log)
558324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetNumQueues () => %d",
559324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), num_queues);
5605e8dce4dSJason Molenda 
5615e8dce4dSJason Molenda     return num_queues;
5625e8dce4dSJason Molenda }
5635e8dce4dSJason Molenda 
5645e8dce4dSJason Molenda SBQueue
5655e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index)
5665e8dce4dSJason Molenda {
5675e8dce4dSJason Molenda     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5685e8dce4dSJason Molenda 
5695e8dce4dSJason Molenda     SBQueue sb_queue;
5705e8dce4dSJason Molenda     QueueSP queue_sp;
5715e8dce4dSJason Molenda     ProcessSP process_sp(GetSP());
5725e8dce4dSJason Molenda     if (process_sp)
5735e8dce4dSJason Molenda     {
5745e8dce4dSJason Molenda         Process::StopLocker stop_locker;
5755e8dce4dSJason Molenda         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5765e8dce4dSJason Molenda         queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
5775e8dce4dSJason Molenda         sb_queue.SetQueue (queue_sp);
5785e8dce4dSJason Molenda     }
5795e8dce4dSJason Molenda 
5805e8dce4dSJason Molenda     if (log)
5815e8dce4dSJason Molenda         log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
582324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
583324a1036SSaleem Abdulrasool                      static_cast<uint32_t>(index),
584324a1036SSaleem Abdulrasool                      static_cast<void*>(queue_sp.get()));
5855e8dce4dSJason Molenda 
5865e8dce4dSJason Molenda     return sb_queue;
5875e8dce4dSJason Molenda }
5885e8dce4dSJason Molenda 
5895e8dce4dSJason Molenda 
5905e8dce4dSJason Molenda uint32_t
591bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops)
592bf2956a2SJim Ingham {
593bf2956a2SJim Ingham     ProcessSP process_sp(GetSP());
594bf2956a2SJim Ingham     if (process_sp)
595bf2956a2SJim Ingham     {
596bf2956a2SJim Ingham         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
597bf2956a2SJim Ingham         if (include_expression_stops)
598bf2956a2SJim Ingham             return process_sp->GetStopID();
599bf2956a2SJim Ingham         else
600bf2956a2SJim Ingham             return process_sp->GetLastNaturalStopID();
601bf2956a2SJim Ingham     }
602bf2956a2SJim Ingham     return 0;
603bf2956a2SJim Ingham }
604bf2956a2SJim Ingham 
60538810f43SIlia K SBEvent
60638810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id)
60738810f43SIlia K {
60838810f43SIlia K     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
60938810f43SIlia K 
61038810f43SIlia K     SBEvent sb_event;
61138810f43SIlia K     EventSP event_sp;
61238810f43SIlia K     ProcessSP process_sp(GetSP());
61338810f43SIlia K     if (process_sp)
61438810f43SIlia K     {
61538810f43SIlia K         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
61638810f43SIlia K         event_sp = process_sp->GetStopEventForStopID(stop_id);
61738810f43SIlia K         sb_event.reset(event_sp);
61838810f43SIlia K     }
61938810f43SIlia K 
62038810f43SIlia K     if (log)
62138810f43SIlia K         log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)",
62238810f43SIlia K                      static_cast<void*>(process_sp.get()),
62338810f43SIlia K                      stop_id,
62438810f43SIlia K                      static_cast<void*>(event_sp.get()));
62538810f43SIlia K 
62638810f43SIlia K     return sb_event;
62738810f43SIlia K }
62838810f43SIlia K 
62930fdc8d8SChris Lattner StateType
63030fdc8d8SChris Lattner SBProcess::GetState ()
63130fdc8d8SChris Lattner {
632ceb6b139SCaroline Tice 
633ceb6b139SCaroline Tice     StateType ret_val = eStateInvalid;
634acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
635acdbe816SGreg Clayton     if (process_sp)
636af67cecdSGreg Clayton     {
637acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
638acdbe816SGreg Clayton         ret_val = process_sp->GetState();
639af67cecdSGreg Clayton     }
640ceb6b139SCaroline Tice 
6415160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
642ceb6b139SCaroline Tice     if (log)
643cfd1acedSGreg Clayton         log->Printf ("SBProcess(%p)::GetState () => %s",
644324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
645750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
646ceb6b139SCaroline Tice 
647ceb6b139SCaroline Tice     return ret_val;
64830fdc8d8SChris Lattner }
64930fdc8d8SChris Lattner 
65030fdc8d8SChris Lattner 
65130fdc8d8SChris Lattner int
65230fdc8d8SChris Lattner SBProcess::GetExitStatus ()
65330fdc8d8SChris Lattner {
6544838131bSGreg Clayton     int exit_status = 0;
655acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
656acdbe816SGreg Clayton     if (process_sp)
657af67cecdSGreg Clayton     {
658acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
659acdbe816SGreg Clayton         exit_status = process_sp->GetExitStatus ();
660af67cecdSGreg Clayton     }
6615160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6624838131bSGreg Clayton     if (log)
6634838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
664324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), exit_status,
665324a1036SSaleem Abdulrasool                      exit_status);
6664838131bSGreg Clayton 
6674838131bSGreg Clayton     return exit_status;
66830fdc8d8SChris Lattner }
66930fdc8d8SChris Lattner 
67030fdc8d8SChris Lattner const char *
67130fdc8d8SChris Lattner SBProcess::GetExitDescription ()
67230fdc8d8SChris Lattner {
6734838131bSGreg Clayton     const char *exit_desc = NULL;
674acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
675acdbe816SGreg Clayton     if (process_sp)
676af67cecdSGreg Clayton     {
677acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
678acdbe816SGreg Clayton         exit_desc = process_sp->GetExitDescription ();
679af67cecdSGreg Clayton     }
6805160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6814838131bSGreg Clayton     if (log)
6824838131bSGreg Clayton         log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
683324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), exit_desc);
6844838131bSGreg Clayton     return exit_desc;
68530fdc8d8SChris Lattner }
68630fdc8d8SChris Lattner 
68730fdc8d8SChris Lattner lldb::pid_t
68830fdc8d8SChris Lattner SBProcess::GetProcessID ()
68930fdc8d8SChris Lattner {
690ceb6b139SCaroline Tice     lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
691acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
692acdbe816SGreg Clayton     if (process_sp)
693acdbe816SGreg Clayton         ret_val = process_sp->GetID();
694ceb6b139SCaroline Tice 
6955160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
696ceb6b139SCaroline Tice     if (log)
697324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
698324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), ret_val);
699ceb6b139SCaroline Tice 
700ceb6b139SCaroline Tice     return ret_val;
70130fdc8d8SChris Lattner }
70230fdc8d8SChris Lattner 
703949e8221SGreg Clayton uint32_t
704949e8221SGreg Clayton SBProcess::GetUniqueID()
705949e8221SGreg Clayton {
706949e8221SGreg Clayton     uint32_t ret_val = 0;
707949e8221SGreg Clayton     ProcessSP process_sp(GetSP());
708949e8221SGreg Clayton     if (process_sp)
709949e8221SGreg Clayton         ret_val = process_sp->GetUniqueID();
7105160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
711949e8221SGreg Clayton     if (log)
712324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
713324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), ret_val);
714949e8221SGreg Clayton     return ret_val;
715949e8221SGreg Clayton }
716949e8221SGreg Clayton 
717cf386e24SJohnny Chen ByteOrder
718cf386e24SJohnny Chen SBProcess::GetByteOrder () const
719cf386e24SJohnny Chen {
720cf386e24SJohnny Chen     ByteOrder byteOrder = eByteOrderInvalid;
721acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
722acdbe816SGreg Clayton     if (process_sp)
723acdbe816SGreg Clayton         byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
724cf386e24SJohnny Chen 
7255160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
726cf386e24SJohnny Chen     if (log)
727324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
728324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), byteOrder);
729cf386e24SJohnny Chen 
730cf386e24SJohnny Chen     return byteOrder;
731cf386e24SJohnny Chen }
732cf386e24SJohnny Chen 
73330fdc8d8SChris Lattner uint32_t
73430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
73530fdc8d8SChris Lattner {
736ceb6b139SCaroline Tice     uint32_t size = 0;
737acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
738acdbe816SGreg Clayton     if (process_sp)
739acdbe816SGreg Clayton         size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
740ceb6b139SCaroline Tice 
7415160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
742ceb6b139SCaroline Tice     if (log)
743324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
744324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), size);
745ceb6b139SCaroline Tice 
746ceb6b139SCaroline Tice     return size;
74730fdc8d8SChris Lattner }
74830fdc8d8SChris Lattner 
74930fdc8d8SChris Lattner SBError
75030fdc8d8SChris Lattner SBProcess::Continue ()
75130fdc8d8SChris Lattner {
7525160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
753ceb6b139SCaroline Tice 
75430fdc8d8SChris Lattner     SBError sb_error;
755acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
7560c74e78dSGreg Clayton 
757acdbe816SGreg Clayton     if (log)
758324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::Continue ()...",
759324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()));
760acdbe816SGreg Clayton 
761acdbe816SGreg Clayton     if (process_sp)
762acdbe816SGreg Clayton     {
763acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
764acdbe816SGreg Clayton 
765dc6224e0SGreg Clayton         if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ())
766dc6224e0SGreg Clayton             sb_error.ref() = process_sp->Resume ();
767dc6224e0SGreg Clayton         else
768dc6224e0SGreg Clayton             sb_error.ref() = process_sp->ResumeSynchronous (NULL);
7695d5028b5SGreg Clayton     }
77030fdc8d8SChris Lattner     else
77130fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
77230fdc8d8SChris Lattner 
773ceb6b139SCaroline Tice     if (log)
774ceb6b139SCaroline Tice     {
775ceb6b139SCaroline Tice         SBStream sstr;
776ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
777324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
778324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
779324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
780ceb6b139SCaroline Tice     }
781ceb6b139SCaroline Tice 
78230fdc8d8SChris Lattner     return sb_error;
78330fdc8d8SChris Lattner }
78430fdc8d8SChris Lattner 
78530fdc8d8SChris Lattner 
78630fdc8d8SChris Lattner SBError
78730fdc8d8SChris Lattner SBProcess::Destroy ()
78830fdc8d8SChris Lattner {
78930fdc8d8SChris Lattner     SBError sb_error;
790acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
791acdbe816SGreg Clayton     if (process_sp)
7926779606aSGreg Clayton     {
793acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
794ede3193bSJason Molenda         sb_error.SetError(process_sp->Destroy(false));
7956779606aSGreg Clayton     }
79630fdc8d8SChris Lattner     else
79730fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
79830fdc8d8SChris Lattner 
7995160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8004838131bSGreg Clayton     if (log)
8014838131bSGreg Clayton     {
8024838131bSGreg Clayton         SBStream sstr;
8034838131bSGreg Clayton         sb_error.GetDescription (sstr);
8046779606aSGreg Clayton         log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
805324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
806324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
8074838131bSGreg Clayton     }
8084838131bSGreg Clayton 
80930fdc8d8SChris Lattner     return sb_error;
81030fdc8d8SChris Lattner }
81130fdc8d8SChris Lattner 
81230fdc8d8SChris Lattner 
81330fdc8d8SChris Lattner SBError
81430fdc8d8SChris Lattner SBProcess::Stop ()
81530fdc8d8SChris Lattner {
81630fdc8d8SChris Lattner     SBError sb_error;
817acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
818acdbe816SGreg Clayton     if (process_sp)
819af67cecdSGreg Clayton     {
820acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
821acdbe816SGreg Clayton         sb_error.SetError (process_sp->Halt());
822af67cecdSGreg Clayton     }
82330fdc8d8SChris Lattner     else
82430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
825ceb6b139SCaroline Tice 
8265160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
827ceb6b139SCaroline Tice     if (log)
828ceb6b139SCaroline Tice     {
829ceb6b139SCaroline Tice         SBStream sstr;
830ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
83193aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
832324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
833324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
834ceb6b139SCaroline Tice     }
835ceb6b139SCaroline Tice 
83630fdc8d8SChris Lattner     return sb_error;
83730fdc8d8SChris Lattner }
83830fdc8d8SChris Lattner 
83930fdc8d8SChris Lattner SBError
84030fdc8d8SChris Lattner SBProcess::Kill ()
84130fdc8d8SChris Lattner {
84230fdc8d8SChris Lattner     SBError sb_error;
843acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
844acdbe816SGreg Clayton     if (process_sp)
845af67cecdSGreg Clayton     {
846acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
847ede3193bSJason Molenda         sb_error.SetError (process_sp->Destroy(true));
848af67cecdSGreg Clayton     }
84930fdc8d8SChris Lattner     else
85030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
851ceb6b139SCaroline Tice 
8525160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
853ceb6b139SCaroline Tice     if (log)
854ceb6b139SCaroline Tice     {
855ceb6b139SCaroline Tice         SBStream sstr;
856ceb6b139SCaroline Tice         sb_error.GetDescription (sstr);
85793aa84e8SGreg Clayton         log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
858324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
859324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
860ceb6b139SCaroline Tice     }
861ceb6b139SCaroline Tice 
86230fdc8d8SChris Lattner     return sb_error;
86330fdc8d8SChris Lattner }
86430fdc8d8SChris Lattner 
86530fdc8d8SChris Lattner SBError
86630fdc8d8SChris Lattner SBProcess::Detach ()
86730fdc8d8SChris Lattner {
868acff8950SJim Ingham     // FIXME: This should come from a process default.
869acff8950SJim Ingham     bool keep_stopped = false;
870acff8950SJim Ingham     return Detach (keep_stopped);
871acff8950SJim Ingham }
872acff8950SJim Ingham 
873acff8950SJim Ingham SBError
874acff8950SJim Ingham SBProcess::Detach (bool keep_stopped)
875acff8950SJim Ingham {
87630fdc8d8SChris Lattner     SBError sb_error;
877acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
878acdbe816SGreg Clayton     if (process_sp)
879af67cecdSGreg Clayton     {
880acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
881acff8950SJim Ingham         sb_error.SetError (process_sp->Detach(keep_stopped));
882af67cecdSGreg Clayton     }
88330fdc8d8SChris Lattner     else
88430fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
88530fdc8d8SChris Lattner 
88630fdc8d8SChris Lattner     return sb_error;
88730fdc8d8SChris Lattner }
88830fdc8d8SChris Lattner 
88930fdc8d8SChris Lattner SBError
8904838131bSGreg Clayton SBProcess::Signal (int signo)
89130fdc8d8SChris Lattner {
89230fdc8d8SChris Lattner     SBError sb_error;
893acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
894acdbe816SGreg Clayton     if (process_sp)
895af67cecdSGreg Clayton     {
896acdbe816SGreg Clayton         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
897acdbe816SGreg Clayton         sb_error.SetError (process_sp->Signal (signo));
898af67cecdSGreg Clayton     }
89930fdc8d8SChris Lattner     else
90030fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
9015160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9024838131bSGreg Clayton     if (log)
9034838131bSGreg Clayton     {
9044838131bSGreg Clayton         SBStream sstr;
9054838131bSGreg Clayton         sb_error.GetDescription (sstr);
9064838131bSGreg Clayton         log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
907324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), signo,
908324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData());
9094838131bSGreg Clayton     }
91030fdc8d8SChris Lattner     return sb_error;
91130fdc8d8SChris Lattner }
91230fdc8d8SChris Lattner 
913802dc402STodd Fiala SBUnixSignals
914802dc402STodd Fiala SBProcess::GetUnixSignals()
915802dc402STodd Fiala {
91698d0a4b3SChaoren Lin     if (auto process_sp = GetSP())
91798d0a4b3SChaoren Lin         return SBUnixSignals{process_sp};
918802dc402STodd Fiala 
91998d0a4b3SChaoren Lin     return {};
920802dc402STodd Fiala }
921802dc402STodd Fiala 
922cfc0935eSJim Ingham void
923cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt ()
924cfc0935eSJim Ingham {
925cfc0935eSJim Ingham     ProcessSP process_sp(GetSP());
926cfc0935eSJim Ingham     if (process_sp)
927cfc0935eSJim Ingham     {
928cfc0935eSJim Ingham         process_sp->SendAsyncInterrupt ();
929cfc0935eSJim Ingham     }
930cfc0935eSJim Ingham }
931cfc0935eSJim Ingham 
93230fdc8d8SChris Lattner SBThread
9334838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid)
93430fdc8d8SChris Lattner {
9354838131bSGreg Clayton     SBThread sb_thread;
93617a6ad05SGreg Clayton     ThreadSP thread_sp;
937acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
938acdbe816SGreg Clayton     if (process_sp)
939af67cecdSGreg Clayton     {
9407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9417fdf9ef1SGreg Clayton         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
9425bf72c46SHafiz Abid Qadeer         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
9437fdf9ef1SGreg Clayton         thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
94417a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
945af67cecdSGreg Clayton     }
9464838131bSGreg Clayton 
9475160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9484838131bSGreg Clayton     if (log)
949d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
950324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), tid,
951324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
9524838131bSGreg Clayton 
9534838131bSGreg Clayton     return sb_thread;
95430fdc8d8SChris Lattner }
95530fdc8d8SChris Lattner 
95618b46896SJim Ingham SBThread
95718b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id)
95818b46896SJim Ingham {
95918b46896SJim Ingham     SBThread sb_thread;
96018b46896SJim Ingham     ThreadSP thread_sp;
96118b46896SJim Ingham     ProcessSP process_sp(GetSP());
96218b46896SJim Ingham     if (process_sp)
96318b46896SJim Ingham     {
96418b46896SJim Ingham         Process::StopLocker stop_locker;
96518b46896SJim Ingham         const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
9665bf72c46SHafiz Abid Qadeer         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
96718b46896SJim Ingham         thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
96818b46896SJim Ingham         sb_thread.SetThread (thread_sp);
96918b46896SJim Ingham     }
97018b46896SJim Ingham 
9715160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
97218b46896SJim Ingham     if (log)
97318b46896SJim Ingham         log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
974324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), index_id,
975324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()));
97618b46896SJim Ingham 
97718b46896SJim Ingham     return sb_thread;
97818b46896SJim Ingham }
97918b46896SJim Ingham 
98030fdc8d8SChris Lattner StateType
98130fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
98230fdc8d8SChris Lattner {
9835160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
984ceb6b139SCaroline Tice 
985ceb6b139SCaroline Tice     StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
986ceb6b139SCaroline Tice 
987ceb6b139SCaroline Tice     if (log)
988324a1036SSaleem Abdulrasool         log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
989324a1036SSaleem Abdulrasool                      static_cast<void*>(event.get()),
990750cd175SCaroline Tice                      lldb_private::StateAsCString (ret_val));
991ceb6b139SCaroline Tice 
992ceb6b139SCaroline Tice     return ret_val;
99330fdc8d8SChris Lattner }
99430fdc8d8SChris Lattner 
99530fdc8d8SChris Lattner bool
99630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
99730fdc8d8SChris Lattner {
998*ea2cc5e0SPavel Labath     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
999*ea2cc5e0SPavel Labath 
1000*ea2cc5e0SPavel Labath     bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get());
1001*ea2cc5e0SPavel Labath 
1002*ea2cc5e0SPavel Labath     if (log)
1003*ea2cc5e0SPavel Labath         log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, event.get(), ret_val);
1004*ea2cc5e0SPavel Labath 
1005*ea2cc5e0SPavel Labath     return ret_val;
100630fdc8d8SChris Lattner }
100730fdc8d8SChris Lattner 
10080161b49cSJim Ingham size_t
10090161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
10100161b49cSJim Ingham {
10110161b49cSJim Ingham     return Process::ProcessEventData::GetNumRestartedReasons(event.get());
10120161b49cSJim Ingham }
10130161b49cSJim Ingham 
10140161b49cSJim Ingham const char *
10150161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
10160161b49cSJim Ingham {
10170161b49cSJim Ingham     return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
10180161b49cSJim Ingham }
10190161b49cSJim Ingham 
102030fdc8d8SChris Lattner SBProcess
102130fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
102230fdc8d8SChris Lattner {
10236611103cSGreg Clayton     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
102430fdc8d8SChris Lattner     return process;
102530fdc8d8SChris Lattner }
102630fdc8d8SChris Lattner 
1027e6bc6cb9SJim Ingham bool
102806d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event)
102906d2855fSIlia K {
103006d2855fSIlia K     return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
103106d2855fSIlia K }
103206d2855fSIlia K 
103306d2855fSIlia K bool
1034e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event)
1035e6bc6cb9SJim Ingham {
1036f9e5dc16SIlia K     return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
1037e6bc6cb9SJim Ingham }
103830fdc8d8SChris Lattner 
103930fdc8d8SChris Lattner SBBroadcaster
104030fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
104130fdc8d8SChris Lattner {
10425160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1043ceb6b139SCaroline Tice 
1044acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1045acdbe816SGreg Clayton 
1046acdbe816SGreg Clayton     SBBroadcaster broadcaster(process_sp.get(), false);
1047ceb6b139SCaroline Tice 
1048ceb6b139SCaroline Tice     if (log)
1049324a1036SSaleem Abdulrasool         log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1050324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()),
1051324a1036SSaleem Abdulrasool                      static_cast<void*>(broadcaster.get()));
1052ceb6b139SCaroline Tice 
105330fdc8d8SChris Lattner     return broadcaster;
105430fdc8d8SChris Lattner }
105530fdc8d8SChris Lattner 
10564bddaeb5SJim Ingham const char *
10574bddaeb5SJim Ingham SBProcess::GetBroadcasterClass ()
10584bddaeb5SJim Ingham {
10594bddaeb5SJim Ingham     return Process::GetStaticBroadcasterClass().AsCString();
10604bddaeb5SJim Ingham }
10614bddaeb5SJim Ingham 
106230fdc8d8SChris Lattner size_t
106330fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
106430fdc8d8SChris Lattner {
10655160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1066ceb6b139SCaroline Tice 
106730fdc8d8SChris Lattner     size_t bytes_read = 0;
106830fdc8d8SChris Lattner 
1069acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1070acdbe816SGreg Clayton 
10714838131bSGreg Clayton     if (log)
1072d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
1073324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1074324a1036SSaleem Abdulrasool                      static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1075324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()));
10764838131bSGreg Clayton 
1077acdbe816SGreg Clayton     if (process_sp)
107830fdc8d8SChris Lattner     {
10797fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10807fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
10817fdf9ef1SGreg Clayton         {
1082acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
10837fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
10847fdf9ef1SGreg Clayton         }
10857fdf9ef1SGreg Clayton         else
10867fdf9ef1SGreg Clayton         {
1087c9858e4dSGreg Clayton             if (log)
1088324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1089324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
10907fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
10917fdf9ef1SGreg Clayton         }
109230fdc8d8SChris Lattner     }
109330fdc8d8SChris Lattner     else
109430fdc8d8SChris Lattner     {
109530fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
109630fdc8d8SChris Lattner     }
109730fdc8d8SChris Lattner 
1098ceb6b139SCaroline Tice     if (log)
109993aa84e8SGreg Clayton     {
110093aa84e8SGreg Clayton         SBStream sstr;
110193aa84e8SGreg Clayton         sb_error.GetDescription (sstr);
1102d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1103324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1104324a1036SSaleem Abdulrasool                      static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1105324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData(),
1106324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_read));
110793aa84e8SGreg Clayton     }
1108ceb6b139SCaroline Tice 
110930fdc8d8SChris Lattner     return bytes_read;
111030fdc8d8SChris Lattner }
111130fdc8d8SChris Lattner 
111230fdc8d8SChris Lattner size_t
1113e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1114e91b7957SGreg Clayton {
1115e91b7957SGreg Clayton     size_t bytes_read = 0;
1116acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1117acdbe816SGreg Clayton     if (process_sp)
1118e91b7957SGreg Clayton     {
11197fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11207fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11217fdf9ef1SGreg Clayton         {
1122acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11237fdf9ef1SGreg Clayton             bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
11247fdf9ef1SGreg Clayton         }
11257fdf9ef1SGreg Clayton         else
11267fdf9ef1SGreg Clayton         {
11275160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1128c9858e4dSGreg Clayton             if (log)
1129324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1130324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11317fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11327fdf9ef1SGreg Clayton         }
1133e91b7957SGreg Clayton     }
1134e91b7957SGreg Clayton     else
1135e91b7957SGreg Clayton     {
1136e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1137e91b7957SGreg Clayton     }
1138e91b7957SGreg Clayton     return bytes_read;
1139e91b7957SGreg Clayton }
1140e91b7957SGreg Clayton 
1141e91b7957SGreg Clayton uint64_t
1142e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1143e91b7957SGreg Clayton {
11447fdf9ef1SGreg Clayton     uint64_t value = 0;
1145acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1146acdbe816SGreg Clayton     if (process_sp)
1147e91b7957SGreg Clayton     {
11487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11497fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11507fdf9ef1SGreg Clayton         {
1151acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11527fdf9ef1SGreg Clayton             value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
11537fdf9ef1SGreg Clayton         }
11547fdf9ef1SGreg Clayton         else
11557fdf9ef1SGreg Clayton         {
11565160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1157c9858e4dSGreg Clayton             if (log)
1158324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1159324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11607fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11617fdf9ef1SGreg Clayton         }
1162e91b7957SGreg Clayton     }
1163e91b7957SGreg Clayton     else
1164e91b7957SGreg Clayton     {
1165e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1166e91b7957SGreg Clayton     }
11677fdf9ef1SGreg Clayton     return value;
1168e91b7957SGreg Clayton }
1169e91b7957SGreg Clayton 
1170e91b7957SGreg Clayton lldb::addr_t
1171e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1172e91b7957SGreg Clayton {
1173e91b7957SGreg Clayton     lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
1174acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1175acdbe816SGreg Clayton     if (process_sp)
1176e91b7957SGreg Clayton     {
11777fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11787fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
11797fdf9ef1SGreg Clayton         {
1180acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
11817fdf9ef1SGreg Clayton             ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
11827fdf9ef1SGreg Clayton         }
11837fdf9ef1SGreg Clayton         else
11847fdf9ef1SGreg Clayton         {
11855160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1186c9858e4dSGreg Clayton             if (log)
1187324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1188324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
11897fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
11907fdf9ef1SGreg Clayton         }
1191e91b7957SGreg Clayton     }
1192e91b7957SGreg Clayton     else
1193e91b7957SGreg Clayton     {
1194e91b7957SGreg Clayton         sb_error.SetErrorString ("SBProcess is invalid");
1195e91b7957SGreg Clayton     }
1196e91b7957SGreg Clayton     return ptr;
1197e91b7957SGreg Clayton }
1198e91b7957SGreg Clayton 
1199e91b7957SGreg Clayton size_t
120030fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
120130fdc8d8SChris Lattner {
120230fdc8d8SChris Lattner     size_t bytes_written = 0;
120330fdc8d8SChris Lattner 
12045160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1205acdbe816SGreg Clayton 
1206acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1207acdbe816SGreg Clayton 
12084838131bSGreg Clayton     if (log)
1209d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
1210324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1211324a1036SSaleem Abdulrasool                      static_cast<const void*>(src),
1212324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(src_len),
1213324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()));
12144838131bSGreg Clayton 
1215acdbe816SGreg Clayton     if (process_sp)
121630fdc8d8SChris Lattner     {
12177fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12187fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
12197fdf9ef1SGreg Clayton         {
1220acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
12217fdf9ef1SGreg Clayton             bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
12227fdf9ef1SGreg Clayton         }
12237fdf9ef1SGreg Clayton         else
12247fdf9ef1SGreg Clayton         {
1225c9858e4dSGreg Clayton             if (log)
1226324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1227324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
12287fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
12297fdf9ef1SGreg Clayton         }
123030fdc8d8SChris Lattner     }
123130fdc8d8SChris Lattner 
12324838131bSGreg Clayton     if (log)
12334838131bSGreg Clayton     {
12344838131bSGreg Clayton         SBStream sstr;
12354838131bSGreg Clayton         sb_error.GetDescription (sstr);
1236d01b2953SDaniel Malea         log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
1237324a1036SSaleem Abdulrasool                      static_cast<void*>(process_sp.get()), addr,
1238324a1036SSaleem Abdulrasool                      static_cast<const void*>(src),
1239324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(src_len),
1240324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_error.get()), sstr.GetData(),
1241324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(bytes_written));
12424838131bSGreg Clayton     }
12434838131bSGreg Clayton 
124430fdc8d8SChris Lattner     return bytes_written;
124530fdc8d8SChris Lattner }
124630fdc8d8SChris Lattner 
1247dde9cff3SCaroline Tice bool
1248dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description)
1249dde9cff3SCaroline Tice {
1250da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1251da7bc7d0SGreg Clayton 
1252acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1253acdbe816SGreg Clayton     if (process_sp)
1254dde9cff3SCaroline Tice     {
1255dde9cff3SCaroline Tice         char path[PATH_MAX];
1256dde9cff3SCaroline Tice         GetTarget().GetExecutable().GetPath (path, sizeof(path));
1257acdbe816SGreg Clayton         Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
12581d273166SGreg Clayton         const char *exe_name = NULL;
12591d273166SGreg Clayton         if (exe_module)
12601d273166SGreg Clayton             exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
12611d273166SGreg Clayton 
1262d01b2953SDaniel Malea         strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1263acdbe816SGreg Clayton                      process_sp->GetID(),
1264ceb6b139SCaroline Tice                      lldb_private::StateAsCString (GetState()),
12651d273166SGreg Clayton                      GetNumThreads(),
126605faeb71SGreg Clayton                      exe_name ? ", executable = " : "",
12671d273166SGreg Clayton                      exe_name ? exe_name : "");
1268dde9cff3SCaroline Tice     }
1269dde9cff3SCaroline Tice     else
1270da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1271dde9cff3SCaroline Tice 
1272dde9cff3SCaroline Tice     return true;
1273dde9cff3SCaroline Tice }
12748f343b09SGreg Clayton 
12758f343b09SGreg Clayton uint32_t
1276f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1277f9ef60d2SJohnny Chen {
12785160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1279f9ef60d2SJohnny Chen 
1280f9ef60d2SJohnny Chen     uint32_t num = 0;
1281f9ef60d2SJohnny Chen     ProcessSP process_sp(GetSP());
1282f9ef60d2SJohnny Chen     if (process_sp)
1283f9ef60d2SJohnny Chen     {
1284f9ef60d2SJohnny Chen         Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1285f9ef60d2SJohnny Chen         sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1286f9ef60d2SJohnny Chen         if (log)
1287f9ef60d2SJohnny Chen             log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1288324a1036SSaleem Abdulrasool                          static_cast<void*>(process_sp.get()), num);
1289f9ef60d2SJohnny Chen     }
1290f9ef60d2SJohnny Chen     else
1291f9ef60d2SJohnny Chen     {
1292f9ef60d2SJohnny Chen         sb_error.SetErrorString ("SBProcess is invalid");
1293f9ef60d2SJohnny Chen     }
1294f9ef60d2SJohnny Chen     return num;
1295f9ef60d2SJohnny Chen }
1296f9ef60d2SJohnny Chen 
1297f9ef60d2SJohnny Chen uint32_t
12984fbd67acSTamas Berghammer SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error)
12994fbd67acSTamas Berghammer {
13004fbd67acSTamas Berghammer     return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
13014fbd67acSTamas Berghammer }
13024fbd67acSTamas Berghammer 
13034fbd67acSTamas Berghammer uint32_t
13044fbd67acSTamas Berghammer SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec,
13054fbd67acSTamas Berghammer                       const lldb::SBFileSpec &sb_remote_image_spec,
13064fbd67acSTamas Berghammer                       lldb::SBError &sb_error)
13078f343b09SGreg Clayton {
1308acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1309acdbe816SGreg Clayton     if (process_sp)
1310af67cecdSGreg Clayton     {
13117fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13127fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
13137fdf9ef1SGreg Clayton         {
1314acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
13153cb132a0STamas Berghammer             PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
13164fbd67acSTamas Berghammer             return platform_sp->LoadImage (process_sp.get(),
13174fbd67acSTamas Berghammer                                            *sb_local_image_spec,
13184fbd67acSTamas Berghammer                                            *sb_remote_image_spec,
13194fbd67acSTamas Berghammer                                            sb_error.ref());
1320af67cecdSGreg Clayton         }
13217fdf9ef1SGreg Clayton         else
13227fdf9ef1SGreg Clayton         {
13235160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1324c9858e4dSGreg Clayton             if (log)
1325324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1326324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
13277fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
13287fdf9ef1SGreg Clayton         }
13297fdf9ef1SGreg Clayton     }
13308f343b09SGreg Clayton     return LLDB_INVALID_IMAGE_TOKEN;
13318f343b09SGreg Clayton }
13328f343b09SGreg Clayton 
13338f343b09SGreg Clayton lldb::SBError
13348f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token)
13358f343b09SGreg Clayton {
13368f343b09SGreg Clayton     lldb::SBError sb_error;
1337acdbe816SGreg Clayton     ProcessSP process_sp(GetSP());
1338acdbe816SGreg Clayton     if (process_sp)
1339af67cecdSGreg Clayton     {
13407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13417fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&process_sp->GetRunLock()))
13427fdf9ef1SGreg Clayton         {
1343acdbe816SGreg Clayton             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
13443cb132a0STamas Berghammer             PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
13453cb132a0STamas Berghammer             sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token));
1346af67cecdSGreg Clayton         }
13478f343b09SGreg Clayton         else
13487fdf9ef1SGreg Clayton         {
13495160ce5cSGreg Clayton             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1350c9858e4dSGreg Clayton             if (log)
1351324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1352324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
13537fdf9ef1SGreg Clayton             sb_error.SetErrorString("process is running");
13547fdf9ef1SGreg Clayton         }
13557fdf9ef1SGreg Clayton     }
13567fdf9ef1SGreg Clayton     else
13578f343b09SGreg Clayton         sb_error.SetErrorString("invalid process");
13588f343b09SGreg Clayton     return sb_error;
13598f343b09SGreg Clayton }
13608c71337aSJason Molenda 
1361a332978bSJason Molenda lldb::SBError
1362a332978bSJason Molenda SBProcess::SendEventData (const char *event_data)
1363a332978bSJason Molenda {
1364a332978bSJason Molenda     lldb::SBError sb_error;
1365a332978bSJason Molenda     ProcessSP process_sp(GetSP());
1366a332978bSJason Molenda     if (process_sp)
1367a332978bSJason Molenda     {
1368a332978bSJason Molenda         Process::StopLocker stop_locker;
1369a332978bSJason Molenda         if (stop_locker.TryLock(&process_sp->GetRunLock()))
1370a332978bSJason Molenda         {
1371a332978bSJason Molenda             Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1372a332978bSJason Molenda             sb_error.SetError (process_sp->SendEventData (event_data));
1373a332978bSJason Molenda         }
1374a332978bSJason Molenda         else
1375a332978bSJason Molenda         {
1376a332978bSJason Molenda             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1377a332978bSJason Molenda             if (log)
1378324a1036SSaleem Abdulrasool                 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1379324a1036SSaleem Abdulrasool                              static_cast<void*>(process_sp.get()));
1380a332978bSJason Molenda             sb_error.SetErrorString("process is running");
1381a332978bSJason Molenda         }
1382a332978bSJason Molenda     }
1383a332978bSJason Molenda     else
1384a332978bSJason Molenda         sb_error.SetErrorString("invalid process");
1385a332978bSJason Molenda     return sb_error;
1386a332978bSJason Molenda }
1387a332978bSJason Molenda 
13888c71337aSJason Molenda uint32_t
138995d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes ()
13908c71337aSJason Molenda {
13918c71337aSJason Molenda     ProcessSP process_sp(GetSP());
13928c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
13938c71337aSJason Molenda     {
13948c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
139595d005c7SJason Molenda         return runtime->GetExtendedBacktraceTypes().size();
13968c71337aSJason Molenda     }
13978c71337aSJason Molenda     return 0;
13988c71337aSJason Molenda }
13998c71337aSJason Molenda 
14008c71337aSJason Molenda const char *
140195d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
14028c71337aSJason Molenda {
14038c71337aSJason Molenda     ProcessSP process_sp(GetSP());
14048c71337aSJason Molenda     if (process_sp && process_sp->GetSystemRuntime())
14058c71337aSJason Molenda     {
14068c71337aSJason Molenda         SystemRuntime *runtime = process_sp->GetSystemRuntime();
1407008c45f1SJason Molenda         const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
14088c71337aSJason Molenda         if (idx < names.size())
14098c71337aSJason Molenda         {
14108c71337aSJason Molenda             return names[idx].AsCString();
14118c71337aSJason Molenda         }
14128c71337aSJason Molenda         else
14138c71337aSJason Molenda         {
14148c71337aSJason Molenda             Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14158c71337aSJason Molenda             if (log)
1416324a1036SSaleem Abdulrasool                 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1417324a1036SSaleem Abdulrasool                             static_cast<void*>(process_sp.get()));
14188c71337aSJason Molenda         }
14198c71337aSJason Molenda     }
14208c71337aSJason Molenda     return NULL;
14218c71337aSJason Molenda }
1422a51ea382SKuba Brecka 
1423a51ea382SKuba Brecka SBThreadCollection
1424a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr)
1425a51ea382SKuba Brecka {
1426a51ea382SKuba Brecka     ProcessSP process_sp(GetSP());
1427a51ea382SKuba Brecka     SBThreadCollection threads;
1428a51ea382SKuba Brecka     if (process_sp)
1429a51ea382SKuba Brecka     {
1430a51ea382SKuba Brecka         threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1431a51ea382SKuba Brecka     }
1432a51ea382SKuba Brecka     return threads;
1433a51ea382SKuba Brecka }
143463927548SKuba Brecka 
143563927548SKuba Brecka bool
143663927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
143763927548SKuba Brecka {
143863927548SKuba Brecka     ProcessSP process_sp(GetSP());
143963927548SKuba Brecka     if (! process_sp)
144063927548SKuba Brecka         return false;
144163927548SKuba Brecka 
144263927548SKuba Brecka     InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
144363927548SKuba Brecka 
144463927548SKuba Brecka     if (! runtime_sp.get())
144563927548SKuba Brecka         return false;
144663927548SKuba Brecka 
144763927548SKuba Brecka     return runtime_sp->IsActive();
144863927548SKuba Brecka }
1449f7d1893fSAdrian McCarthy 
1450f7d1893fSAdrian McCarthy lldb::SBError
1451f7d1893fSAdrian McCarthy SBProcess::SaveCore(const char *file_name)
1452f7d1893fSAdrian McCarthy {
1453f7d1893fSAdrian McCarthy     lldb::SBError error;
1454f7d1893fSAdrian McCarthy     ProcessSP process_sp(GetSP());
1455f7d1893fSAdrian McCarthy     if (!process_sp)
1456f7d1893fSAdrian McCarthy     {
1457f7d1893fSAdrian McCarthy         error.SetErrorString("SBProcess is invalid");
1458f7d1893fSAdrian McCarthy         return error;
1459f7d1893fSAdrian McCarthy     }
1460f7d1893fSAdrian McCarthy 
1461f7d1893fSAdrian McCarthy     Mutex::Locker api_locker(process_sp->GetTarget().GetAPIMutex());
1462f7d1893fSAdrian McCarthy 
1463f7d1893fSAdrian McCarthy     if (process_sp->GetState() != eStateStopped)
1464f7d1893fSAdrian McCarthy     {
1465f7d1893fSAdrian McCarthy         error.SetErrorString("the process is not stopped");
1466f7d1893fSAdrian McCarthy         return error;
1467f7d1893fSAdrian McCarthy     }
1468f7d1893fSAdrian McCarthy 
1469f7d1893fSAdrian McCarthy     FileSpec core_file(file_name, false);
1470f7d1893fSAdrian McCarthy     error.ref() = PluginManager::SaveCore(process_sp, core_file);
1471f7d1893fSAdrian McCarthy     return error;
1472f7d1893fSAdrian McCarthy }
1473