diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/API/SBProcess.cpp')
| -rw-r--r-- | contrib/llvm/tools/lldb/source/API/SBProcess.cpp | 2664 | 
1 files changed, 1225 insertions, 1439 deletions
diff --git a/contrib/llvm/tools/lldb/source/API/SBProcess.cpp b/contrib/llvm/tools/lldb/source/API/SBProcess.cpp index 50211bfde329..59dd56933278 100644 --- a/contrib/llvm/tools/lldb/source/API/SBProcess.cpp +++ b/contrib/llvm/tools/lldb/source/API/SBProcess.cpp @@ -15,7 +15,6 @@  #include "lldb/lldb-defines.h"  #include "lldb/lldb-types.h" -#include "lldb/Interpreter/Args.h"  #include "lldb/Core/Debugger.h"  #include "lldb/Core/Log.h"  #include "lldb/Core/Module.h" @@ -23,6 +22,7 @@  #include "lldb/Core/State.h"  #include "lldb/Core/Stream.h"  #include "lldb/Core/StreamFile.h" +#include "lldb/Interpreter/Args.h"  #include "lldb/Target/MemoryRegionInfo.h"  #include "lldb/Target/Process.h"  #include "lldb/Target/RegisterContext.h" @@ -39,1514 +39,1300 @@  #include "lldb/API/SBFileSpec.h"  #include "lldb/API/SBMemoryRegionInfo.h"  #include "lldb/API/SBMemoryRegionInfoList.h" -#include "lldb/API/SBThread.h" -#include "lldb/API/SBThreadCollection.h"  #include "lldb/API/SBStream.h"  #include "lldb/API/SBStringList.h" +#include "lldb/API/SBStructuredData.h" +#include "lldb/API/SBThread.h" +#include "lldb/API/SBThreadCollection.h"  #include "lldb/API/SBUnixSignals.h"  using namespace lldb;  using namespace lldb_private; - -SBProcess::SBProcess () : -    m_opaque_wp() -{ -} - +SBProcess::SBProcess() : m_opaque_wp() {}  //----------------------------------------------------------------------  // SBProcess constructor  //---------------------------------------------------------------------- -SBProcess::SBProcess (const SBProcess& rhs) : -    m_opaque_wp (rhs.m_opaque_wp) -{ -} - +SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {} -SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : -    m_opaque_wp (process_sp) -{ -} +SBProcess::SBProcess(const lldb::ProcessSP &process_sp) +    : m_opaque_wp(process_sp) {} -const SBProcess& -SBProcess::operator = (const SBProcess& rhs) -{ -    if (this != &rhs) -        m_opaque_wp = rhs.m_opaque_wp; -    return *this; +const SBProcess &SBProcess::operator=(const SBProcess &rhs) { +  if (this != &rhs) +    m_opaque_wp = rhs.m_opaque_wp; +  return *this;  }  //----------------------------------------------------------------------  // Destructor  //---------------------------------------------------------------------- -SBProcess::~SBProcess() -{ -} - -const char * -SBProcess::GetBroadcasterClassName () -{ -    return Process::GetStaticBroadcasterClass().AsCString(); -} - -const char * -SBProcess::GetPluginName () -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        return process_sp->GetPluginName().GetCString(); -    } -    return "<Unknown>"; -} - -const char * -SBProcess::GetShortPluginName () -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        return process_sp->GetPluginName().GetCString(); -    } -    return "<Unknown>"; -} - - -lldb::ProcessSP -SBProcess::GetSP() const -{ -    return m_opaque_wp.lock(); -} - -void -SBProcess::SetSP (const ProcessSP &process_sp) -{ -    m_opaque_wp = process_sp; -} - -void -SBProcess::Clear () -{ -    m_opaque_wp.reset(); -} - - -bool -SBProcess::IsValid() const -{ -    ProcessSP process_sp(m_opaque_wp.lock()); -    return ((bool) process_sp && process_sp->IsValid()); -} - -bool -SBProcess::RemoteLaunch (char const **argv, -                         char const **envp, -                         const char *stdin_path, -                         const char *stdout_path, -                         const char *stderr_path, -                         const char *working_directory, -                         uint32_t launch_flags, -                         bool stop_at_entry, -                         lldb::SBError& error) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        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))...", -                     static_cast<void*>(m_opaque_wp.lock().get()), -                     static_cast<void*>(argv), static_cast<void*>(envp), -                     stdin_path ? stdin_path : "NULL", -                     stdout_path ? stdout_path : "NULL", -                     stderr_path ? stderr_path : "NULL", -                     working_directory ? working_directory : "NULL", -                     launch_flags, stop_at_entry, -                     static_cast<void*>(error.get())); - -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        if (process_sp->GetState() == eStateConnected) -        { -            if (stop_at_entry) -                launch_flags |= eLaunchFlagStopAtEntry; -            ProcessLaunchInfo launch_info(FileSpec{stdin_path, false}, -                                          FileSpec{stdout_path, false}, -                                          FileSpec{stderr_path, false}, -                                          FileSpec{working_directory, false}, -                                          launch_flags); -            Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); -            if (exe_module) -                launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); -            if (argv) -                launch_info.GetArguments().AppendArguments (argv); -            if (envp) -                launch_info.GetEnvironmentEntries ().SetArguments (envp); -            error.SetError (process_sp->Launch (launch_info)); -        } -        else -        { -            error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); -        } -    } -    else -    { -        error.SetErrorString ("unable to attach pid"); -    } - -    if (log) { -        SBStream sstr; -        error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(error.get()), sstr.GetData()); -    } - -    return error.Success(); -} - -bool -SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        if (process_sp->GetState() == eStateConnected) -        { -            ProcessAttachInfo attach_info; -            attach_info.SetProcessID (pid); -            error.SetError (process_sp->Attach (attach_info)); -        } -        else -        { -            error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); -        } -    } -    else -    { -        error.SetErrorString ("unable to attach pid"); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) { -        SBStream sstr; -        error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), pid, -                     static_cast<void*>(error.get()), sstr.GetData()); -    } - -    return error.Success(); -} - - -uint32_t -SBProcess::GetNumThreads () -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    uint32_t num_threads = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; - -        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        num_threads = process_sp->GetThreadList().GetSize(can_update); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetNumThreads () => %d", -                     static_cast<void*>(process_sp.get()), num_threads); - -    return num_threads; -} - -SBThread -SBProcess::GetSelectedThread () const -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBThread sb_thread; -    ThreadSP thread_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        thread_sp = process_sp->GetThreadList().GetSelectedThread(); -        sb_thread.SetThread (thread_sp); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(thread_sp.get())); - -    return sb_thread; -} - -SBThread -SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBThread sb_thread; -    ThreadSP thread_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        thread_sp = process_sp->CreateOSPluginThread(tid, context); -        sb_thread.SetThread (thread_sp); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", -                     static_cast<void*>(process_sp.get()), tid, context, -                     static_cast<void*>(thread_sp.get())); - -    return sb_thread; -} - -SBTarget -SBProcess::GetTarget() const -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBTarget sb_target; -    TargetSP target_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        target_sp = process_sp->GetTarget().shared_from_this(); -        sb_target.SetSP (target_sp); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(target_sp.get())); - -    return sb_target; -} - - -size_t -SBProcess::PutSTDIN (const char *src, size_t src_len) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    size_t ret_val = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Error error; -        ret_val =  process_sp->PutSTDIN (src, src_len, error); -    } - -    if (log) -        log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, -                     static_cast<void*>(process_sp.get()), src, -                     static_cast<uint64_t>(src_len), -                     static_cast<uint64_t>(ret_val)); - -    return ret_val; -} - -size_t -SBProcess::GetSTDOUT (char *dst, size_t dst_len) const -{ -    size_t bytes_read = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Error error; -        bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, -                     static_cast<void*>(process_sp.get()), -                     static_cast<int>(bytes_read), dst, -                     static_cast<uint64_t>(dst_len), -                     static_cast<uint64_t>(bytes_read)); - -    return bytes_read; -} - -size_t -SBProcess::GetSTDERR (char *dst, size_t dst_len) const -{ -    size_t bytes_read = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Error error; -        bytes_read = process_sp->GetSTDERR (dst, dst_len, error); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, -                     static_cast<void*>(process_sp.get()), -                     static_cast<int>(bytes_read), dst, -                     static_cast<uint64_t>(dst_len), -                     static_cast<uint64_t>(bytes_read)); - -    return bytes_read; -} - -size_t -SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const -{ -    size_t bytes_read = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Error error; -        bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, -                     static_cast<void*>(process_sp.get()), -                     static_cast<int>(bytes_read), dst, -                     static_cast<uint64_t>(dst_len), -                     static_cast<uint64_t>(bytes_read)); - -    return bytes_read; -} - -void -SBProcess::ReportEventState (const SBEvent &event, FILE *out) const -{ -    if (out == NULL) -        return; - -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        const StateType event_state = SBProcess::GetStateFromEvent (event); -        char message[1024]; -        int message_len = ::snprintf (message, -                                      sizeof (message), -                                      "Process %" PRIu64 " %s\n", -                                      process_sp->GetID(), -                                      SBDebugger::StateAsCString (event_state)); - -        if (message_len > 0) -            ::fwrite (message, 1, message_len, out); -    } -} - -void -SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        const StateType event_state = SBProcess::GetStateFromEvent (event); -        char message[1024]; -        ::snprintf (message, -                    sizeof (message), -                    "Process %" PRIu64 " %s\n", -                    process_sp->GetID(), -                    SBDebugger::StateAsCString (event_state)); - -        result.AppendMessage (message); -    } -} - -bool -SBProcess::SetSelectedThread (const SBThread &thread) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); -    } -    return false; -} - -bool -SBProcess::SetSelectedThreadByID (lldb::tid_t tid) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    bool ret_val = false; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", -                     static_cast<void*>(process_sp.get()), tid, -                     (ret_val ? "true" : "false")); - -    return ret_val; -} - -bool -SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    bool ret_val = false; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", -                     static_cast<void*>(process_sp.get()), index_id, -                     (ret_val ? "true" : "false")); - -    return ret_val; -} - -SBThread -SBProcess::GetThreadAtIndex (size_t index) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBThread sb_thread; -    ThreadSP thread_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); -        sb_thread.SetThread (thread_sp); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", -                     static_cast<void*>(process_sp.get()), -                     static_cast<uint32_t>(index), -                     static_cast<void*>(thread_sp.get())); - -    return sb_thread; -} - -uint32_t -SBProcess::GetNumQueues () -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    uint32_t num_queues = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            num_queues = process_sp->GetQueueList().GetSize(); -        } -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetNumQueues () => %d", -                     static_cast<void*>(process_sp.get()), num_queues); - -    return num_queues; -} - -SBQueue -SBProcess::GetQueueAtIndex (size_t index) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBQueue sb_queue; -    QueueSP queue_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); -            sb_queue.SetQueue (queue_sp); -        } -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", -                     static_cast<void*>(process_sp.get()), -                     static_cast<uint32_t>(index), -                     static_cast<void*>(queue_sp.get())); - -    return sb_queue; -} - - -uint32_t -SBProcess::GetStopID(bool include_expression_stops) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        if (include_expression_stops) -            return process_sp->GetStopID(); -        else -            return process_sp->GetLastNaturalStopID(); -    } -    return 0; -} - -SBEvent -SBProcess::GetStopEventForStopID(uint32_t stop_id) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBEvent sb_event; -    EventSP event_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        event_sp = process_sp->GetStopEventForStopID(stop_id); -        sb_event.reset(event_sp); -    } - -    if (log) -        log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", -                     static_cast<void*>(process_sp.get()), -                     stop_id, -                     static_cast<void*>(event_sp.get())); - -    return sb_event; -} - -StateType -SBProcess::GetState () -{ - -    StateType ret_val = eStateInvalid; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        ret_val = process_sp->GetState(); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetState () => %s", -                     static_cast<void*>(process_sp.get()), -                     lldb_private::StateAsCString (ret_val)); - -    return ret_val; -} - - -int -SBProcess::GetExitStatus () -{ -    int exit_status = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        exit_status = process_sp->GetExitStatus (); -    } -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", -                     static_cast<void*>(process_sp.get()), exit_status, -                     exit_status); - -    return exit_status; -} - -const char * -SBProcess::GetExitDescription () -{ -    const char *exit_desc = NULL; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        exit_desc = process_sp->GetExitDescription (); -    } -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetExitDescription () => %s", -                     static_cast<void*>(process_sp.get()), exit_desc); -    return exit_desc; -} - -lldb::pid_t -SBProcess::GetProcessID () -{ -    lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -        ret_val = process_sp->GetID(); - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, -                     static_cast<void*>(process_sp.get()), ret_val); - -    return ret_val; -} - -uint32_t -SBProcess::GetUniqueID() -{ -    uint32_t ret_val = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -        ret_val = process_sp->GetUniqueID(); -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, -                     static_cast<void*>(process_sp.get()), ret_val); -    return ret_val; -} - -ByteOrder -SBProcess::GetByteOrder () const -{ -    ByteOrder byteOrder = eByteOrderInvalid; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -        byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetByteOrder () => %d", -                     static_cast<void*>(process_sp.get()), byteOrder); - -    return byteOrder; -} - -uint32_t -SBProcess::GetAddressByteSize () const -{ -    uint32_t size = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -        size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", -                     static_cast<void*>(process_sp.get()), size); - -    return size; -} - -SBError -SBProcess::Continue () -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    SBError sb_error; -    ProcessSP process_sp(GetSP()); - -    if (log) -        log->Printf ("SBProcess(%p)::Continue ()...", -                     static_cast<void*>(process_sp.get())); - -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); - -        if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) -            sb_error.ref() = process_sp->Resume (); -        else -            sb_error.ref() = process_sp->ResumeSynchronous (NULL); +SBProcess::~SBProcess() {} + +const char *SBProcess::GetBroadcasterClassName() { +  return Process::GetStaticBroadcasterClass().AsCString(); +} + +const char *SBProcess::GetPluginName() { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    return process_sp->GetPluginName().GetCString(); +  } +  return "<Unknown>"; +} + +const char *SBProcess::GetShortPluginName() { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    return process_sp->GetPluginName().GetCString(); +  } +  return "<Unknown>"; +} + +lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } + +void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } + +void SBProcess::Clear() { m_opaque_wp.reset(); } + +bool SBProcess::IsValid() const { +  ProcessSP process_sp(m_opaque_wp.lock()); +  return ((bool)process_sp && process_sp->IsValid()); +} + +bool SBProcess::RemoteLaunch(char const **argv, char const **envp, +                             const char *stdin_path, const char *stdout_path, +                             const char *stderr_path, +                             const char *working_directory, +                             uint32_t launch_flags, bool stop_at_entry, +                             lldb::SBError &error) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    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))...", +                static_cast<void *>(m_opaque_wp.lock().get()), +                static_cast<void *>(argv), static_cast<void *>(envp), +                stdin_path ? stdin_path : "NULL", +                stdout_path ? stdout_path : "NULL", +                stderr_path ? stderr_path : "NULL", +                working_directory ? working_directory : "NULL", launch_flags, +                stop_at_entry, static_cast<void *>(error.get())); + +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    if (process_sp->GetState() == eStateConnected) { +      if (stop_at_entry) +        launch_flags |= eLaunchFlagStopAtEntry; +      ProcessLaunchInfo launch_info( +          FileSpec{stdin_path, false}, FileSpec{stdout_path, false}, +          FileSpec{stderr_path, false}, FileSpec{working_directory, false}, +          launch_flags); +      Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); +      if (exe_module) +        launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); +      if (argv) +        launch_info.GetArguments().AppendArguments(argv); +      if (envp) +        launch_info.GetEnvironmentEntries().SetArguments(envp); +      error.SetError(process_sp->Launch(launch_info)); +    } else { +      error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); +    } +  } else { +    error.SetErrorString("unable to attach pid"); +  } + +  if (log) { +    SBStream sstr; +    error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(error.get()), sstr.GetData()); +  } + +  return error.Success(); +} + +bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, +                                            lldb::SBError &error) { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    if (process_sp->GetState() == eStateConnected) { +      ProcessAttachInfo attach_info; +      attach_info.SetProcessID(pid); +      error.SetError(process_sp->Attach(attach_info)); +    } else { +      error.SetErrorString( +          "must be in eStateConnected to call RemoteAttachToProcessWithID"); +    } +  } else { +    error.SetErrorString("unable to attach pid"); +  } + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) { +    SBStream sstr; +    error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 +                ") => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), pid, +                static_cast<void *>(error.get()), sstr.GetData()); +  } + +  return error.Success(); +} + +uint32_t SBProcess::GetNumThreads() { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  uint32_t num_threads = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; + +    const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    num_threads = process_sp->GetThreadList().GetSize(can_update); +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetNumThreads () => %d", +                static_cast<void *>(process_sp.get()), num_threads); + +  return num_threads; +} + +SBThread SBProcess::GetSelectedThread() const { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBThread sb_thread; +  ThreadSP thread_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    thread_sp = process_sp->GetThreadList().GetSelectedThread(); +    sb_thread.SetThread(thread_sp); +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(thread_sp.get())); + +  return sb_thread; +} + +SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, +                                         lldb::addr_t context) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBThread sb_thread; +  ThreadSP thread_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    thread_sp = process_sp->CreateOSPluginThread(tid, context); +    sb_thread.SetThread(thread_sp); +  } + +  if (log) +    log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 +                ", context=0x%" PRIx64 ") => SBThread(%p)", +                static_cast<void *>(process_sp.get()), tid, context, +                static_cast<void *>(thread_sp.get())); + +  return sb_thread; +} + +SBTarget SBProcess::GetTarget() const { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBTarget sb_target; +  TargetSP target_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    target_sp = process_sp->GetTarget().shared_from_this(); +    sb_target.SetSP(target_sp); +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(target_sp.get())); + +  return sb_target; +} + +size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  size_t ret_val = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Error error; +    ret_val = process_sp->PutSTDIN(src, src_len, error); +  } + +  if (log) +    log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 +                ") => %" PRIu64, +                static_cast<void *>(process_sp.get()), src, +                static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); + +  return ret_val; +} + +size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { +  size_t bytes_read = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Error error; +    bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); +  } + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf( +        "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 +        ") => %" PRIu64, +        static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), +        dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); + +  return bytes_read; +} + +size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { +  size_t bytes_read = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Error error; +    bytes_read = process_sp->GetSTDERR(dst, dst_len, error); +  } + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf( +        "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 +        ") => %" PRIu64, +        static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), +        dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); + +  return bytes_read; +} + +size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { +  size_t bytes_read = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Error error; +    bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); +  } + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf( +        "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 +        ") => %" PRIu64, +        static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), +        dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); + +  return bytes_read; +} + +void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { +  if (out == NULL) +    return; + +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    const StateType event_state = SBProcess::GetStateFromEvent(event); +    char message[1024]; +    int message_len = ::snprintf( +        message, sizeof(message), "Process %" PRIu64 " %s\n", +        process_sp->GetID(), SBDebugger::StateAsCString(event_state)); + +    if (message_len > 0) +      ::fwrite(message, 1, message_len, out); +  } +} + +void SBProcess::AppendEventStateReport(const SBEvent &event, +                                       SBCommandReturnObject &result) { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    const StateType event_state = SBProcess::GetStateFromEvent(event); +    char message[1024]; +    ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", +               process_sp->GetID(), SBDebugger::StateAsCString(event_state)); + +    result.AppendMessage(message); +  } +} + +bool SBProcess::SetSelectedThread(const SBThread &thread) { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    return process_sp->GetThreadList().SetSelectedThreadByID( +        thread.GetThreadID()); +  } +  return false; +} + +bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  bool ret_val = false; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); +  } + +  if (log) +    log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 +                ") => %s", +                static_cast<void *>(process_sp.get()), tid, +                (ret_val ? "true" : "false")); + +  return ret_val; +} + +bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  bool ret_val = false; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); +  } + +  if (log) +    log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", +                static_cast<void *>(process_sp.get()), index_id, +                (ret_val ? "true" : "false")); + +  return ret_val; +} + +SBThread SBProcess::GetThreadAtIndex(size_t index) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBThread sb_thread; +  ThreadSP thread_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); +    sb_thread.SetThread(thread_sp); +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", +                static_cast<void *>(process_sp.get()), +                static_cast<uint32_t>(index), +                static_cast<void *>(thread_sp.get())); + +  return sb_thread; +} + +uint32_t SBProcess::GetNumQueues() { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  uint32_t num_queues = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      num_queues = process_sp->GetQueueList().GetSize(); +    } +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetNumQueues () => %d", +                static_cast<void *>(process_sp.get()), num_queues); + +  return num_queues; +} + +SBQueue SBProcess::GetQueueAtIndex(size_t index) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBQueue sb_queue; +  QueueSP queue_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); +      sb_queue.SetQueue(queue_sp);      } +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", +                static_cast<void *>(process_sp.get()), +                static_cast<uint32_t>(index), +                static_cast<void *>(queue_sp.get())); + +  return sb_queue; +} + +uint32_t SBProcess::GetStopID(bool include_expression_stops) { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    if (include_expression_stops) +      return process_sp->GetStopID();      else -        sb_error.SetErrorString ("SBProcess is invalid"); - -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(sb_error.get()), sstr.GetData()); -    } +      return process_sp->GetLastNaturalStopID(); +  } +  return 0; +} + +SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBEvent sb_event; +  EventSP event_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    event_sp = process_sp->GetStopEventForStopID(stop_id); +    sb_event.reset(event_sp); +  } + +  if (log) +    log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 +                ") => SBEvent(%p)", +                static_cast<void *>(process_sp.get()), stop_id, +                static_cast<void *>(event_sp.get())); + +  return sb_event; +} + +StateType SBProcess::GetState() { + +  StateType ret_val = eStateInvalid; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    ret_val = process_sp->GetState(); +  } + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetState () => %s", +                static_cast<void *>(process_sp.get()), +                lldb_private::StateAsCString(ret_val)); + +  return ret_val; +} + +int SBProcess::GetExitStatus() { +  int exit_status = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    exit_status = process_sp->GetExitStatus(); +  } +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", +                static_cast<void *>(process_sp.get()), exit_status, +                exit_status); + +  return exit_status; +} + +const char *SBProcess::GetExitDescription() { +  const char *exit_desc = NULL; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    exit_desc = process_sp->GetExitDescription(); +  } +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetExitDescription () => %s", +                static_cast<void *>(process_sp.get()), exit_desc); +  return exit_desc; +} + +lldb::pid_t SBProcess::GetProcessID() { +  lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; +  ProcessSP process_sp(GetSP()); +  if (process_sp) +    ret_val = process_sp->GetID(); + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, +                static_cast<void *>(process_sp.get()), ret_val); + +  return ret_val; +} + +uint32_t SBProcess::GetUniqueID() { +  uint32_t ret_val = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) +    ret_val = process_sp->GetUniqueID(); +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, +                static_cast<void *>(process_sp.get()), ret_val); +  return ret_val; +} + +ByteOrder SBProcess::GetByteOrder() const { +  ByteOrder byteOrder = eByteOrderInvalid; +  ProcessSP process_sp(GetSP()); +  if (process_sp) +    byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetByteOrder () => %d", +                static_cast<void *>(process_sp.get()), byteOrder); + +  return byteOrder; +} -    return sb_error; -} +uint32_t SBProcess::GetAddressByteSize() const { +  uint32_t size = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) +    size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", +                static_cast<void *>(process_sp.get()), size); + +  return size; +} + +SBError SBProcess::Continue() { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  SBError sb_error; +  ProcessSP process_sp(GetSP()); + +  if (log) +    log->Printf("SBProcess(%p)::Continue ()...", +                static_cast<void *>(process_sp.get())); -SBError -SBProcess::Destroy () -{ -    SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError(process_sp->Destroy(false)); -    } +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); + +    if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) +      sb_error.ref() = process_sp->Resume();      else -        sb_error.SetErrorString ("SBProcess is invalid"); +      sb_error.ref() = process_sp->ResumeSynchronous(NULL); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); + +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(sb_error.get()), sstr.GetData()); +  } + +  return sb_error; +} + +SBError SBProcess::Destroy() { +  SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->Destroy(false)); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(sb_error.get()), sstr.GetData()); +  } + +  return sb_error; +} + +SBError SBProcess::Stop() { +  SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->Halt()); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(sb_error.get()), sstr.GetData()); +  } + +  return sb_error; +} + +SBError SBProcess::Kill() { +  SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->Destroy(true)); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(sb_error.get()), sstr.GetData()); +  } + +  return sb_error; +} + +SBError SBProcess::Detach() { +  // FIXME: This should come from a process default. +  bool keep_stopped = false; +  return Detach(keep_stopped); +} + +SBError SBProcess::Detach(bool keep_stopped) { +  SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->Detach(keep_stopped)); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); + +  return sb_error; +} + +SBError SBProcess::Signal(int signo) { +  SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->Signal(signo)); +  } else +    sb_error.SetErrorString("SBProcess is invalid"); +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", +                static_cast<void *>(process_sp.get()), signo, +                static_cast<void *>(sb_error.get()), sstr.GetData()); +  } +  return sb_error; +} + +SBUnixSignals SBProcess::GetUnixSignals() { +  if (auto process_sp = GetSP()) +    return SBUnixSignals{process_sp}; + +  return {}; +} + +void SBProcess::SendAsyncInterrupt() { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    process_sp->SendAsyncInterrupt(); +  } +} + +SBThread SBProcess::GetThreadByID(tid_t tid) { +  SBThread sb_thread; +  ThreadSP thread_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); +    sb_thread.SetThread(thread_sp); +  } -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(sb_error.get()), sstr.GetData()); -    } +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 +                ") => SBThread (%p)", +                static_cast<void *>(process_sp.get()), tid, +                static_cast<void *>(thread_sp.get())); -    return sb_error; +  return sb_thread;  } +SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { +  SBThread sb_thread; +  ThreadSP thread_sp; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    thread_sp = +        process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); +    sb_thread.SetThread(thread_sp); +  } -SBError -SBProcess::Stop () -{ -    SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError (process_sp->Halt()); -    } -    else -        sb_error.SetErrorString ("SBProcess is invalid"); +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +  if (log) +    log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", +                static_cast<void *>(process_sp.get()), index_id, +                static_cast<void *>(thread_sp.get())); -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(sb_error.get()), sstr.GetData()); -    } - -    return sb_error; +  return sb_thread;  } -SBError -SBProcess::Kill () -{ -    SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError (process_sp->Destroy(true)); -    } -    else -        sb_error.SetErrorString ("SBProcess is invalid"); +StateType SBProcess::GetStateFromEvent(const SBEvent &event) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(sb_error.get()), sstr.GetData()); -    } +  StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); -    return sb_error; -} +  if (log) +    log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", +                static_cast<void *>(event.get()), +                lldb_private::StateAsCString(ret_val)); -SBError -SBProcess::Detach () -{ -    // FIXME: This should come from a process default. -    bool keep_stopped = false; -    return Detach (keep_stopped); +  return ret_val;  } -SBError -SBProcess::Detach (bool keep_stopped) -{ -    SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError (process_sp->Detach(keep_stopped)); -    } -    else -        sb_error.SetErrorString ("SBProcess is invalid");     +bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); -    return sb_error; -} +  bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); -SBError -SBProcess::Signal (int signo) -{ -    SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError (process_sp->Signal (signo)); -    } -    else -        sb_error.SetErrorString ("SBProcess is invalid"); -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", -                     static_cast<void*>(process_sp.get()), signo, -                     static_cast<void*>(sb_error.get()), sstr.GetData()); -    } -    return sb_error; -} +  if (log) +    log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, +                static_cast<void *>(event.get()), ret_val); -SBUnixSignals -SBProcess::GetUnixSignals() -{ -    if (auto process_sp = GetSP()) -        return SBUnixSignals{process_sp}; - -    return {}; +  return ret_val;  } -void -SBProcess::SendAsyncInterrupt () -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        process_sp->SendAsyncInterrupt (); -    } -} - -SBThread -SBProcess::GetThreadByID (tid_t tid) -{ -    SBThread sb_thread; -    ThreadSP thread_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); -        sb_thread.SetThread (thread_sp); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", -                     static_cast<void*>(process_sp.get()), tid, -                     static_cast<void*>(thread_sp.get())); - -    return sb_thread; -} - -SBThread -SBProcess::GetThreadByIndexID (uint32_t index_id) -{ -    SBThread sb_thread; -    ThreadSP thread_sp; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); -        sb_thread.SetThread (thread_sp); -    } - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -    if (log) -        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", -                     static_cast<void*>(process_sp.get()), index_id, -                     static_cast<void*>(thread_sp.get())); - -    return sb_thread; -} - -StateType -SBProcess::GetStateFromEvent (const SBEvent &event) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); - -    if (log) -        log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", -                     static_cast<void*>(event.get()), -                     lldb_private::StateAsCString (ret_val)); - -    return ret_val; -} - -bool -SBProcess::GetRestartedFromEvent (const SBEvent &event) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get()); - -    if (log) -        log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, -                     static_cast<void*>(event.get()), ret_val); - -    return ret_val; -} - -size_t -SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) -{ -    return Process::ProcessEventData::GetNumRestartedReasons(event.get()); -} - -const char * -SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) -{ -    return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); -} - -SBProcess -SBProcess::GetProcessFromEvent (const SBEvent &event) -{ -    SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); -    return process; -} - -bool -SBProcess::GetInterruptedFromEvent (const SBEvent &event) -{ -    return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); -} - -bool -SBProcess::EventIsProcessEvent (const SBEvent &event) -{ -    return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass(); -} - -SBBroadcaster -SBProcess::GetBroadcaster () const -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    ProcessSP process_sp(GetSP()); - -    SBBroadcaster broadcaster(process_sp.get(), false); - -    if (log) -        log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", -                     static_cast<void*>(process_sp.get()), -                     static_cast<void*>(broadcaster.get())); - -    return broadcaster; +size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { +  return Process::ProcessEventData::GetNumRestartedReasons(event.get());  }  const char * -SBProcess::GetBroadcasterClass () -{ -    return Process::GetStaticBroadcasterClass().AsCString(); -} - -size_t -SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    size_t bytes_read = 0; - -    ProcessSP process_sp(GetSP()); - -    if (log) -        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", -                     static_cast<void*>(process_sp.get()), addr, -                     static_cast<void*>(dst), static_cast<uint64_t>(dst_len), -                     static_cast<void*>(sb_error.get())); - -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); -        } -        else -        { -            if (log) -                log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } - -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, -                     static_cast<void*>(process_sp.get()), addr, -                     static_cast<void*>(dst), static_cast<uint64_t>(dst_len), -                     static_cast<void*>(sb_error.get()), sstr.GetData(), -                     static_cast<uint64_t>(bytes_read)); -    } - -    return bytes_read; -} - -size_t -SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) -{ -    size_t bytes_read = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return bytes_read; -} - -uint64_t -SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) -{ -    uint64_t value = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return value; -} - -lldb::addr_t -SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) -{ -    lldb::addr_t ptr = LLDB_INVALID_ADDRESS; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return ptr; +SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, +                                              size_t idx) { +  return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);  } -size_t -SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) -{ -    size_t bytes_written = 0; - -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); +SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { +  ProcessSP process_sp = +      Process::ProcessEventData::GetProcessFromEvent(event.get()); +  if (!process_sp) { +    // StructuredData events also know the process they come from. +    // Try that. +    process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); +  } -    ProcessSP process_sp(GetSP()); - -    if (log) -        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", -                     static_cast<void*>(process_sp.get()), addr, -                     static_cast<const void*>(src), -                     static_cast<uint64_t>(src_len), -                     static_cast<void*>(sb_error.get())); - -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); -        } -        else -        { -            if (log) -                log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } - -    if (log) -    { -        SBStream sstr; -        sb_error.GetDescription (sstr); -        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, -                     static_cast<void*>(process_sp.get()), addr, -                     static_cast<const void*>(src), -                     static_cast<uint64_t>(src_len), -                     static_cast<void*>(sb_error.get()), sstr.GetData(), -                     static_cast<uint64_t>(bytes_written)); -    } - -    return bytes_written; -} - -bool -SBProcess::GetDescription (SBStream &description) -{ -    Stream &strm = description.ref(); - -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        char path[PATH_MAX]; -        GetTarget().GetExecutable().GetPath (path, sizeof(path)); -        Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); -        const char *exe_name = NULL; -        if (exe_module) -            exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); - -        strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", -                     process_sp->GetID(), -                     lldb_private::StateAsCString (GetState()),  -                     GetNumThreads(), -                     exe_name ? ", executable = " : "", -                     exe_name ? exe_name : ""); -    } -    else -        strm.PutCString ("No value"); - -    return true; +  return SBProcess(process_sp);  } -uint32_t -SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const -{ -    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); - -    uint32_t num = 0; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -        sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); -        if (log) -            log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", -                         static_cast<void*>(process_sp.get()), num); -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return num; +bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { +  return Process::ProcessEventData::GetInterruptedFromEvent(event.get());  } -uint32_t -SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error) -{ -    return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); +lldb::SBStructuredData +SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { +  return SBStructuredData(event.GetSP());  } -uint32_t -SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec, -                      const lldb::SBFileSpec &sb_remote_image_spec, -                      lldb::SBError &sb_error) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); -            return platform_sp->LoadImage (process_sp.get(), -                                           *sb_local_image_spec, -                                           *sb_remote_image_spec, -                                           sb_error.ref()); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    return LLDB_INVALID_IMAGE_TOKEN; +bool SBProcess::EventIsProcessEvent(const SBEvent &event) { +  return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && +         !EventIsStructuredDataEvent(event);  } -lldb::SBError -SBProcess::UnloadImage (uint32_t image_token) -{ -    lldb::SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); -            sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token)); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -        sb_error.SetErrorString("invalid process"); -    return sb_error; -} - -lldb::SBError -SBProcess::SendEventData (const char *event_data) -{ -    lldb::SBError sb_error; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            sb_error.SetError (process_sp->SendEventData (event_data)); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -        sb_error.SetErrorString("invalid process"); -    return sb_error; +bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { +  EventSP event_sp = event.GetSP(); +  EventData *event_data = event_sp ? event_sp->GetData() : nullptr; +  return event_data && (event_data->GetFlavor() == +                        EventDataStructuredData::GetFlavorString()); +} + +SBBroadcaster SBProcess::GetBroadcaster() const { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  ProcessSP process_sp(GetSP()); + +  SBBroadcaster broadcaster(process_sp.get(), false); + +  if (log) +    log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", +                static_cast<void *>(process_sp.get()), +                static_cast<void *>(broadcaster.get())); + +  return broadcaster; +} + +const char *SBProcess::GetBroadcasterClass() { +  return Process::GetStaticBroadcasterClass().AsCString(); +} + +size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, +                             SBError &sb_error) { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  size_t bytes_read = 0; + +  ProcessSP process_sp(GetSP()); + +  if (log) +    log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 +                ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", +                static_cast<void *>(process_sp.get()), addr, +                static_cast<void *>(dst), static_cast<uint64_t>(dst_len), +                static_cast<void *>(sb_error.get())); + +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); +    } else { +      if (log) +        log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } + +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 +                ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, +                static_cast<void *>(process_sp.get()), addr, +                static_cast<void *>(dst), static_cast<uint64_t>(dst_len), +                static_cast<void *>(sb_error.get()), sstr.GetData(), +                static_cast<uint64_t>(bytes_read)); +  } + +  return bytes_read; +} + +size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, +                                        lldb::SBError &sb_error) { +  size_t bytes_read = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, +                                                     sb_error.ref()); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " +                    "is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return bytes_read; +} + +uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, +                                           lldb::SBError &sb_error) { +  uint64_t value = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, +                                                        sb_error.ref()); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " +                    "is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return value; +} + +lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, +                                              lldb::SBError &sb_error) { +  lldb::addr_t ptr = LLDB_INVALID_ADDRESS; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " +                    "is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return ptr; +} + +size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, +                              SBError &sb_error) { +  size_t bytes_written = 0; + +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  ProcessSP process_sp(GetSP()); + +  if (log) +    log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 +                ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", +                static_cast<void *>(process_sp.get()), addr, +                static_cast<const void *>(src), static_cast<uint64_t>(src_len), +                static_cast<void *>(sb_error.get())); + +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      bytes_written = +          process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); +    } else { +      if (log) +        log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } + +  if (log) { +    SBStream sstr; +    sb_error.GetDescription(sstr); +    log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 +                ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, +                static_cast<void *>(process_sp.get()), addr, +                static_cast<const void *>(src), static_cast<uint64_t>(src_len), +                static_cast<void *>(sb_error.get()), sstr.GetData(), +                static_cast<uint64_t>(bytes_written)); +  } + +  return bytes_written; +} + +bool SBProcess::GetDescription(SBStream &description) { +  Stream &strm = description.ref(); + +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    char path[PATH_MAX]; +    GetTarget().GetExecutable().GetPath(path, sizeof(path)); +    Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); +    const char *exe_name = NULL; +    if (exe_module) +      exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); + +    strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", +                process_sp->GetID(), lldb_private::StateAsCString(GetState()), +                GetNumThreads(), exe_name ? ", executable = " : "", +                exe_name ? exe_name : ""); +  } else +    strm.PutCString("No value"); + +  return true;  }  uint32_t -SBProcess::GetNumExtendedBacktraceTypes () -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp && process_sp->GetSystemRuntime()) -    { -        SystemRuntime *runtime = process_sp->GetSystemRuntime(); -        return runtime->GetExtendedBacktraceTypes().size(); -    } -    return 0; -} +SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { +  Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + +  uint32_t num = 0; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    std::lock_guard<std::recursive_mutex> guard( +        process_sp->GetTarget().GetAPIMutex()); +    sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); +    if (log) +      log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", +                  static_cast<void *>(process_sp.get()), num); +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return num; +} + +uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, +                              lldb::SBError &sb_error) { +  return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); +} + +uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, +                              const lldb::SBFileSpec &sb_remote_image_spec, +                              lldb::SBError &sb_error) { +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); +      return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, +                                    *sb_remote_image_spec, sb_error.ref()); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::LoadImage() => error: process is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } +  return LLDB_INVALID_IMAGE_TOKEN; +} + +lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { +  lldb::SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); +      sb_error.SetError( +          platform_sp->UnloadImage(process_sp.get(), image_token)); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", +                    static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else +    sb_error.SetErrorString("invalid process"); +  return sb_error; +} + +lldb::SBError SBProcess::SendEventData(const char *event_data) { +  lldb::SBError sb_error; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      sb_error.SetError(process_sp->SendEventData(event_data)); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf( +            "SBProcess(%p)::SendEventData() => error: process is running", +            static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else +    sb_error.SetErrorString("invalid process"); +  return sb_error; +} + +uint32_t SBProcess::GetNumExtendedBacktraceTypes() { +  ProcessSP process_sp(GetSP()); +  if (process_sp && process_sp->GetSystemRuntime()) { +    SystemRuntime *runtime = process_sp->GetSystemRuntime(); +    return runtime->GetExtendedBacktraceTypes().size(); +  } +  return 0; +} + +const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { +  ProcessSP process_sp(GetSP()); +  if (process_sp && process_sp->GetSystemRuntime()) { +    SystemRuntime *runtime = process_sp->GetSystemRuntime(); +    const std::vector<ConstString> &names = +        runtime->GetExtendedBacktraceTypes(); +    if (idx < names.size()) { +      return names[idx].AsCString(); +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " +                    "error: requested extended backtrace name out of bounds", +                    static_cast<void *>(process_sp.get())); +    } +  } +  return NULL; +} + +SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { +  ProcessSP process_sp(GetSP()); +  SBThreadCollection threads; +  if (process_sp) { +    threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); +  } +  return threads; +} + +bool SBProcess::IsInstrumentationRuntimePresent( +    InstrumentationRuntimeType type) { +  ProcessSP process_sp(GetSP()); +  if (!process_sp) +    return false; -const char * -SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) -{ -    ProcessSP process_sp(GetSP()); -    if (process_sp && process_sp->GetSystemRuntime()) -    { -        SystemRuntime *runtime = process_sp->GetSystemRuntime(); -        const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); -        if (idx < names.size()) -        { -            return names[idx].AsCString(); -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", -                            static_cast<void*>(process_sp.get())); -        } -    } -    return NULL; -} +  InstrumentationRuntimeSP runtime_sp = +      process_sp->GetInstrumentationRuntime(type); -SBThreadCollection -SBProcess::GetHistoryThreads (addr_t addr) -{ -    ProcessSP process_sp(GetSP()); -    SBThreadCollection threads; -    if (process_sp) -    { -        threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); -    } -    return threads; -} +  if (!runtime_sp.get()) +    return false; -bool -SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) -{ -    ProcessSP process_sp(GetSP()); -    if (! process_sp) -        return false; -     -    InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); -     -    if (! runtime_sp.get()) -        return false; -     -    return runtime_sp->IsActive(); +  return runtime_sp->IsActive();  } -lldb::SBError -SBProcess::SaveCore(const char *file_name) -{ -    lldb::SBError error; -    ProcessSP process_sp(GetSP()); -    if (!process_sp) -    { -        error.SetErrorString("SBProcess is invalid"); -        return error; -    } - -    std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); +lldb::SBError SBProcess::SaveCore(const char *file_name) { +  lldb::SBError error; +  ProcessSP process_sp(GetSP()); +  if (!process_sp) { +    error.SetErrorString("SBProcess is invalid"); +    return error; +  } -    if (process_sp->GetState() != eStateStopped) -    { -        error.SetErrorString("the process is not stopped"); -        return error; -    } +  std::lock_guard<std::recursive_mutex> guard( +      process_sp->GetTarget().GetAPIMutex()); -    FileSpec core_file(file_name, false); -    error.ref() = PluginManager::SaveCore(process_sp, core_file); +  if (process_sp->GetState() != eStateStopped) { +    error.SetErrorString("the process is not stopped");      return error; +  } + +  FileSpec core_file(file_name, false); +  error.ref() = PluginManager::SaveCore(process_sp, core_file); +  return error;  }  lldb::SBError -SBProcess::GetMemoryRegionInfo (lldb::addr_t load_addr, SBMemoryRegionInfo &sb_region_info) -{ -    lldb::SBError sb_error; -    ProcessSP process_sp(GetSP()); -    MemoryRegionInfoSP region_info_sp = std::make_shared<lldb_private::MemoryRegionInfo>(); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            sb_error.ref() = process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); -            if( sb_error.Success() ) { -                sb_region_info.ref() = *region_info_sp; -            } -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); -        } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return sb_error; -} - -lldb::SBMemoryRegionInfoList -SBProcess::GetMemoryRegions() -{ -    lldb::SBError sb_error; -    lldb::SBMemoryRegionInfoList sb_region_list; -    ProcessSP process_sp(GetSP()); -    if (process_sp) -    { -        Process::StopLocker stop_locker; -        if (stop_locker.TryLock(&process_sp->GetRunLock())) -        { -            std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); -            std::vector<MemoryRegionInfoSP> region_list; -            sb_error.ref() = process_sp->GetMemoryRegions(region_list); -            if( sb_error.Success() ) { -                std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); -                for( std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); it != end; it++ ) { -                    SBMemoryRegionInfo sb_region_info(it->get()); -                    sb_region_list.Append(sb_region_info); -                } -            } -        } -        else -        { -            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); -            if (log) -                log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", -                             static_cast<void*>(process_sp.get())); -            sb_error.SetErrorString("process is running"); +SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, +                               SBMemoryRegionInfo &sb_region_info) { +  lldb::SBError sb_error; +  ProcessSP process_sp(GetSP()); +  MemoryRegionInfoSP region_info_sp = +      std::make_shared<lldb_private::MemoryRegionInfo>(); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      sb_error.ref() = +          process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); +      if (sb_error.Success()) { +        sb_region_info.ref() = *region_info_sp; +      } +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf( +            "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", +            static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return sb_error; +} + +lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { +  lldb::SBError sb_error; +  lldb::SBMemoryRegionInfoList sb_region_list; +  ProcessSP process_sp(GetSP()); +  if (process_sp) { +    Process::StopLocker stop_locker; +    if (stop_locker.TryLock(&process_sp->GetRunLock())) { +      std::lock_guard<std::recursive_mutex> guard( +          process_sp->GetTarget().GetAPIMutex()); +      std::vector<MemoryRegionInfoSP> region_list; +      sb_error.ref() = process_sp->GetMemoryRegions(region_list); +      if (sb_error.Success()) { +        std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); +        for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); +             it != end; it++) { +          SBMemoryRegionInfo sb_region_info(it->get()); +          sb_region_list.Append(sb_region_info);          } -    } -    else -    { -        sb_error.SetErrorString ("SBProcess is invalid"); -    } -    return sb_region_list; +      } +    } else { +      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); +      if (log) +        log->Printf( +            "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", +            static_cast<void *>(process_sp.get())); +      sb_error.SetErrorString("process is running"); +    } +  } else { +    sb_error.SetErrorString("SBProcess is invalid"); +  } +  return sb_region_list;  }  | 
