124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
127a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBProcess.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-defines.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-types.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1784cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
181a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton#include "lldb/Core/Debugger.h"
197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice#include "lldb/Core/Log.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2663094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Target/Target.h"
2763094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Target/Thread.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBBroadcaster.h"
327a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBCommandReturnObject.h"
330a8dcacde404c520f1131c641041dceb9f68b6faGreg Clayton#include "lldb/API/SBDebugger.h"
347a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBEvent.h"
350a8dcacde404c520f1131c641041dceb9f68b6faGreg Clayton#include "lldb/API/SBFileSpec.h"
367a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBThread.h"
3798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice#include "lldb/API/SBStream.h"
387a62c8b129b7e1b5e838b7616a794e01df01818bEli Friedman#include "lldb/API/SBStringList.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::SBProcess () :
45bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    m_opaque_wp()
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SBProcess constructor
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::SBProcess (const SBProcess& rhs) :
55bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    m_opaque_wp (rhs.m_opaque_wp)
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
61bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    m_opaque_wp (process_sp)
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65538eb82a89a68dbc57251915080bd5152b333978Greg Claytonconst SBProcess&
66538eb82a89a68dbc57251915080bd5152b333978Greg ClaytonSBProcess::operator = (const SBProcess& rhs)
67538eb82a89a68dbc57251915080bd5152b333978Greg Clayton{
68538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    if (this != &rhs)
69bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        m_opaque_wp = rhs.m_opaque_wp;
70538eb82a89a68dbc57251915080bd5152b333978Greg Clayton    return *this;
71538eb82a89a68dbc57251915080bd5152b333978Greg Clayton}
72538eb82a89a68dbc57251915080bd5152b333978Greg Clayton
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::~SBProcess()
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
805a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Inghamconst char *
815a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamSBProcess::GetBroadcasterClassName ()
825a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham{
835a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    return Process::GetStaticBroadcasterClass().AsCString();
845a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham}
855a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
86fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Inghamconst char *
87fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim InghamSBProcess::GetPluginName ()
88fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham{
89fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    ProcessSP process_sp(GetSP());
90fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    if (process_sp)
91fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    {
920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return process_sp->GetPluginName().GetCString();
93fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    }
94fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    return "<Unknown>";
95fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham}
96fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham
97fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Inghamconst char *
98fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim InghamSBProcess::GetShortPluginName ()
99fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham{
100fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    ProcessSP process_sp(GetSP());
101fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    if (process_sp)
102fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    {
1030e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return process_sp->GetPluginName().GetCString();
104fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    }
105fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham    return "<Unknown>";
106fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham}
107fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham
108fee26ee9a5db37e71f5d5aed279c634bbdab7c8cJim Ingham
109334d33a19fd28cf41cba74cc61cf149e7101a603Greg Claytonlldb::ProcessSP
110334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonSBProcess::GetSP() const
111334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton{
112bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    return m_opaque_wp.lock();
113334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton}
114334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
116334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonSBProcess::SetSP (const ProcessSP &process_sp)
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
118bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    m_opaque_wp = process_sp;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Clear ()
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
124bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton    m_opaque_wp.reset();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::IsValid() const
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    ProcessSP process_sp(m_opaque_wp.lock());
132d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham    return ((bool) process_sp && process_sp->IsValid());
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1353809340ce8954dbeaf24907ece29cd6b179143eaJames McIlreebool
1363809340ce8954dbeaf24907ece29cd6b179143eaJames McIlreeSBProcess::RemoteLaunch (char const **argv,
1373809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         char const **envp,
1383809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         const char *stdin_path,
1393809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         const char *stdout_path,
1403809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         const char *stderr_path,
1413809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         const char *working_directory,
1423809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         uint32_t launch_flags,
1433809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         bool stop_at_entry,
1443809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                         lldb::SBError& error)
1453809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree{
146952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1473809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    if (log) {
1483809340ce8954dbeaf24907ece29cd6b179143eaJames 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))...",
149bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton                     m_opaque_wp.lock().get(),
1503809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     argv,
1513809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     envp,
1523809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     stdin_path ? stdin_path : "NULL",
1533809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     stdout_path ? stdout_path : "NULL",
1543809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     stderr_path ? stderr_path : "NULL",
1553809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     working_directory ? working_directory : "NULL",
1563809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     launch_flags,
1573809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     stop_at_entry,
1583809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree                     error.get());
1593809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
1603809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
1610416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
1620416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
1633809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    {
1649f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1659f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        if (process_sp->GetState() == eStateConnected)
1663809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        {
1679f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (stop_at_entry)
1689f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                launch_flags |= eLaunchFlagStopAtEntry;
1699f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            ProcessLaunchInfo launch_info (stdin_path,
1709f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                                           stdout_path,
1719f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                                           stderr_path,
1729f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                                           working_directory,
1739f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                                           launch_flags);
1749f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
1759f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (exe_module)
176151416f6288315ef6d6061f60154db21798180a9Greg Clayton                launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
1779f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (argv)
1789f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                launch_info.GetArguments().AppendArguments (argv);
1799f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (envp)
1809f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                launch_info.GetEnvironmentEntries ().SetArguments (envp);
1819f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            error.SetError (process_sp->Launch (launch_info));
1823809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        }
1833809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        else
1843809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        {
1859f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
1863809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        }
1873809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
1883809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    else
1893809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    {
1903809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        error.SetErrorString ("unable to attach pid");
1913809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
1923809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
1933809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    if (log) {
1943809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        SBStream sstr;
1953809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        error.GetDescription (sstr);
1960416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
1973809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
1983809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
1993809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    return error.Success();
2003809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree}
2013809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
2023809340ce8954dbeaf24907ece29cd6b179143eaJames McIlreebool
2033809340ce8954dbeaf24907ece29cd6b179143eaJames McIlreeSBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
2043809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree{
2050416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
2060416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
2073809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    {
2089f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
2099f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton        if (process_sp->GetState() == eStateConnected)
2103809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        {
2119f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            ProcessAttachInfo attach_info;
2129f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            attach_info.SetProcessID (pid);
2139f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            error.SetError (process_sp->Attach (attach_info));
2143809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        }
2153809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        else
2163809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        {
2179f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
2183809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        }
2193809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
2203809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    else
2213809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    {
2223809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        error.SetErrorString ("unable to attach pid");
2233809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
2243809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
225952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2263809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    if (log) {
2273809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        SBStream sstr;
2283809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree        error.GetDescription (sstr);
2295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
2303809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    }
2313809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
2323809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree    return error.Success();
2333809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree}
2343809340ce8954dbeaf24907ece29cd6b179143eaJames McIlree
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetNumThreads ()
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
239952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2407826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2417826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    uint32_t num_threads = 0;
2420416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
2430416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
245a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
246a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton
247a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
2480416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
2490416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        num_threads = process_sp->GetThreadList().GetSize(can_update);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2517826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2527826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
2530416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
2547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return num_threads;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread
259c833295baeec641086f536e78050388af36784f8Jim InghamSBProcess::GetSelectedThread () const
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
261952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2627826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread sb_thread;
26490c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    ThreadSP thread_sp;
2650416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
2660416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
267bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
2680416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
2690416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        thread_sp = process_sp->GetThreadList().GetSelectedThread();
27090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton        sb_thread.SetThread (thread_sp);
271bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
2727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
2737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
2747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
2750416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
2767826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
2777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_thread;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28152ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonSBThread
28252ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonSBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
28352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{
284952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
28552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
28652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    SBThread sb_thread;
28752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    ThreadSP thread_sp;
28852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    ProcessSP process_sp(GetSP());
28952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (process_sp)
29052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    {
29152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
29252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        thread_sp = process_sp->CreateOSPluginThread(tid, context);
29352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        sb_thread.SetThread (thread_sp);
29452ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    }
29552ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
29652ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    if (log)
29752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton        log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get());
29852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
29952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton    return sb_thread;
30052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton}
30152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBTarget
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetTarget() const
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
305952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBTarget sb_target;
308334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    TargetSP target_sp;
3090416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
3100416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
311334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    {
3120416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        target_sp = process_sp->GetTarget().shared_from_this();
313334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton        sb_target.SetSP (target_sp);
314334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    }
3157826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
3170416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
3187826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_target;
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::PutSTDIN (const char *src, size_t src_len)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
326952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3277826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    size_t ret_val = 0;
3290416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
3300416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
3330416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        ret_val =  process_sp->PutSTDIN (src, src_len, error);
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3357826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3367826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
3377e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
3380416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
3393f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     src,
3403f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     (uint32_t) src_len,
3413f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     ret_val);
3427826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3437826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_val;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetSTDOUT (char *dst, size_t dst_len) const
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    size_t bytes_read = 0;
3500416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
3510416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
3540416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3567826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
357952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3587826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
3595f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
360851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     process_sp.get(),
361851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (int) bytes_read,
362851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     dst,
363851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)dst_len,
364851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)bytes_read);
3657826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
36649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return bytes_read;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetSTDERR (char *dst, size_t dst_len) const
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    size_t bytes_read = 0;
3730416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
3740416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
3770416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3797826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
380952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
3825f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
383851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     process_sp.get(),
384851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (int) bytes_read,
385851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     dst,
386851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)dst_len,
387851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)bytes_read);
3887826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
38949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    return bytes_read;
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
392fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ongsize_t
393fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming OngSBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
394fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong{
395fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    size_t bytes_read = 0;
396fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    ProcessSP process_sp(GetSP());
397fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    if (process_sp)
398fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    {
399fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong        Error error;
400fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong        bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
401fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    }
402fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong
403952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
404fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    if (log)
4055f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
406fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong                     process_sp.get(),
407fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong                     (int) bytes_read,
408fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong                     dst,
409fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong                     (uint64_t)dst_len,
410fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong                     (uint64_t)bytes_read);
411fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong
412fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong    return bytes_read;
413fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong}
414fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
416c833295baeec641086f536e78050388af36784f8Jim InghamSBProcess::ReportEventState (const SBEvent &event, FILE *out) const
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (out == NULL)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4210416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
4220416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StateType event_state = SBProcess::GetStateFromEvent (event);
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char message[1024];
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int message_len = ::snprintf (message,
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      sizeof (message),
4285f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                      "Process %" PRIu64 " %s\n",
4290416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                                      process_sp->GetID(),
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      SBDebugger::StateAsCString (event_state));
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (message_len > 0)
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ::fwrite (message, 1, message_len, out);
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
438c833295baeec641086f536e78050388af36784f8Jim InghamSBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4400416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
4410416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StateType event_state = SBProcess::GetStateFromEvent (event);
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char message[1024];
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ::snprintf (message,
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sizeof (message),
4475f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    "Process %" PRIu64 " %s\n",
4480416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                    process_sp->GetID(),
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SBDebugger::StateAsCString (event_state));
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage (message);
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
456c833295baeec641086f536e78050388af36784f8Jim InghamSBProcess::SetSelectedThread (const SBThread &thread)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4580416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
4590416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
460bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
4610416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
4620416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
463bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
46882560f25ae1b4a55c927df9ccf1bd1becc01b1c1Greg ClaytonSBProcess::SetSelectedThreadByID (lldb::tid_t tid)
46982560f25ae1b4a55c927df9ccf1bd1becc01b1c1Greg Clayton{
470952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
4727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    bool ret_val = false;
4730416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
4740416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
475bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
4760416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
4770416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
478bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
4797826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
4807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
4815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
4820416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(), tid, (ret_val ? "true" : "false"));
4837826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
4847826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_val;
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
487efbdd2280873cc87634bf4f4a37ab8b99662522aJim Inghambool
488efbdd2280873cc87634bf4f4a37ab8b99662522aJim InghamSBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
489efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham{
490952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
491efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
492efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    bool ret_val = false;
493efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    ProcessSP process_sp(GetSP());
494efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    if (process_sp)
495efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    {
496efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
497efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
498efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    }
499efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
500efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    if (log)
501efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
502efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham                     process_sp.get(), index_id, (ret_val ? "true" : "false"));
503efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
504efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    return ret_val;
505efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham}
506efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetThreadAtIndex (size_t index)
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
510952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5117826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
51290c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    SBThread sb_thread;
51390c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    ThreadSP thread_sp;
5140416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
5150416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
516bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
517a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
518a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
5190416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
520a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
52190c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton        sb_thread.SetThread (thread_sp);
522bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
5237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
5247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
5257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
5263f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
5270416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(), (uint32_t) index, thread_sp.get());
5287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
5297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
53090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    return sb_thread;
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5330e3b98e7de6d69613a9729bac9d4b965c0635698Jim Inghamuint32_t
5340e3b98e7de6d69613a9729bac9d4b965c0635698Jim InghamSBProcess::GetStopID(bool include_expression_stops)
5350e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham{
5360e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham    ProcessSP process_sp(GetSP());
5370e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham    if (process_sp)
5380e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham    {
5390e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5400e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham        if (include_expression_stops)
5410e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham            return process_sp->GetStopID();
5420e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham        else
5430e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham            return process_sp->GetLastNaturalStopID();
5440e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham    }
5450e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham    return 0;
5460e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham}
5470e3b98e7de6d69613a9729bac9d4b965c0635698Jim Ingham
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetState ()
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5517826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
5527826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    StateType ret_val = eStateInvalid;
5530416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
5540416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
555bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
5560416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5570416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        ret_val = process_sp->GetState();
558bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
5597826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
560952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5617826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
56249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBProcess(%p)::GetState () => %s",
5630416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
56461ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     lldb_private::StateAsCString (ret_val));
5657826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
5667826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_val;
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetExitStatus ()
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
573a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    int exit_status = 0;
5740416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
5750416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
576bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
5770416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5780416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        exit_status = process_sp->GetExitStatus ();
579bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
580952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
581a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
582a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
5830416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(), exit_status, exit_status);
584a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
585a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return exit_status;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetExitDescription ()
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
591a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    const char *exit_desc = NULL;
5920416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
5930416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
594bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
5950416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
5960416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        exit_desc = process_sp->GetExitDescription ();
597bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
598952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
599a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
600a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
6010416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(), exit_desc);
602a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return exit_desc;
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::pid_t
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetProcessID ()
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
6090416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
6100416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
6110416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        ret_val = process_sp->GetID();
6127826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
613952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6147826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
6155f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val);
6167826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
6177826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_val;
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62064742744396c966e8de770e765130629b0c78335Greg Claytonuint32_t
62164742744396c966e8de770e765130629b0c78335Greg ClaytonSBProcess::GetUniqueID()
62264742744396c966e8de770e765130629b0c78335Greg Clayton{
62364742744396c966e8de770e765130629b0c78335Greg Clayton    uint32_t ret_val = 0;
62464742744396c966e8de770e765130629b0c78335Greg Clayton    ProcessSP process_sp(GetSP());
62564742744396c966e8de770e765130629b0c78335Greg Clayton    if (process_sp)
62664742744396c966e8de770e765130629b0c78335Greg Clayton        ret_val = process_sp->GetUniqueID();
627952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
62864742744396c966e8de770e765130629b0c78335Greg Clayton    if (log)
62964742744396c966e8de770e765130629b0c78335Greg Clayton        log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val);
63064742744396c966e8de770e765130629b0c78335Greg Clayton    return ret_val;
63164742744396c966e8de770e765130629b0c78335Greg Clayton}
63264742744396c966e8de770e765130629b0c78335Greg Clayton
63360a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny ChenByteOrder
63460a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny ChenSBProcess::GetByteOrder () const
63560a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen{
63660a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen    ByteOrder byteOrder = eByteOrderInvalid;
6370416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
6380416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
6390416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
64060a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen
641952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
64260a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen    if (log)
6430416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
64460a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen
64560a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen    return byteOrder;
64660a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen}
64760a544f23362d4f2fbe1e68b9c5340aa5e11302cJohnny Chen
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetAddressByteSize () const
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6517826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    uint32_t size = 0;
6520416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
6530416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
6540416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        size =  process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
6557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
656952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6577826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
6580416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
6597826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
6607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return size;
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Continue ()
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
666952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6677826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
6690416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
6700416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
6710416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (log)
6720416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
6730416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
6740416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
6751a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton    {
6760416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
677de1dd81e18b0310501f3b76ae41f04a09f4dd474Greg Clayton
6780416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Error error (process_sp->Resume());
6791a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton        if (error.Success())
6801a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton        {
6810416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton            if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
682a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton            {
683a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                if (log)
6840416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                    log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
6850416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                process_sp->WaitForProcessToStop (NULL);
686a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton            }
6871a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton        }
6881a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton        sb_error.SetError(error);
6891a3083a04c20cc8e7298e03b731cab5d09aa7badGreg Clayton    }
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6937826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
6947826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
6957826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
6967826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        sb_error.GetDescription (sstr);
6970416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
6987826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
6997826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Destroy ()
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
7080416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
7090416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
71072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    {
7110416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
7120416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        sb_error.SetError(process_sp->Destroy());
71372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton    }
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
717952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
718a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
719a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
720a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        SBStream sstr;
721a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        sb_error.GetDescription (sstr);
72272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton        log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
7230416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
72472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                     sb_error.get(),
72572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton                     sstr.GetData());
726a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
727a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Stop ()
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
7360416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
7370416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
738bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
7390416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
7400416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        sb_error.SetError (process_sp->Halt());
741bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
7447826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
745952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7467826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
7477826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
7487826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
7497826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        sb_error.GetDescription (sstr);
7503f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
7510416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
7523f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     sb_error.get(),
75361ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     sstr.GetData());
7547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
7557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Kill ()
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
7630416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
7640416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
765bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
7660416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
7670416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        sb_error.SetError (process_sp->Destroy());
768bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
7717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
772952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
7747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    {
7757826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        SBStream sstr;
7767826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice        sb_error.GetDescription (sstr);
7773f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
7780416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
7793f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     sb_error.get(),
78061ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     sstr.GetData());
7817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    }
7827826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::Detach ()
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
789761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    // FIXME: This should come from a process default.
790761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    bool keep_stopped = false;
791761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham    return Detach (keep_stopped);
792761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham}
793761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham
794761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamSBError
795761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamSBProcess::Detach (bool keep_stopped)
796761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham{
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
7980416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
7990416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
800bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
8010416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
802761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham        sb_error.SetError (process_sp->Detach(keep_stopped));
803bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBError
811a66ba46379fe41036d870975c56ccc2319cb6618Greg ClaytonSBProcess::Signal (int signo)
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBError sb_error;
8140416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
8150416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
816bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
8170416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
8180416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        sb_error.SetError (process_sp->Signal (signo));
819bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
822952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
823a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
824a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
825a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        SBStream sstr;
826a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        sb_error.GetDescription (sstr);
827a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
8280416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
829a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     signo,
830a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sb_error.get(),
831a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sstr.GetData());
832a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sb_error;
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8365d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Inghamvoid
8375d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim InghamSBProcess::SendAsyncInterrupt ()
8385d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham{
8395d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham    ProcessSP process_sp(GetSP());
8405d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham    if (process_sp)
8415d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham    {
8425d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham        process_sp->SendAsyncInterrupt ();
8435d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham    }
8445d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham}
8455d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBThread
847a66ba46379fe41036d870975c56ccc2319cb6618Greg ClaytonSBProcess::GetThreadByID (tid_t tid)
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
849a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    SBThread sb_thread;
85090c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton    ThreadSP thread_sp;
8510416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
8520416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
853bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
8540416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
855a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
856a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
857a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
85890c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton        sb_thread.SetThread (thread_sp);
859bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
860a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
861952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
862a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
863a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
8645f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
8650416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
866a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     tid,
86790c5214bc61ee2cdf68236b36d9746ecd275302eGreg Clayton                     thread_sp.get());
868a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
869a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
870a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    return sb_thread;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
873efbdd2280873cc87634bf4f4a37ab8b99662522aJim InghamSBThread
874efbdd2280873cc87634bf4f4a37ab8b99662522aJim InghamSBProcess::GetThreadByIndexID (uint32_t index_id)
875efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham{
876efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    SBThread sb_thread;
877efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    ThreadSP thread_sp;
878efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    ProcessSP process_sp(GetSP());
879efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    if (process_sp)
880efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    {
881efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
882efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        Process::StopLocker stop_locker;
883efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
884efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
885efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        sb_thread.SetThread (thread_sp);
886efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    }
887efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
888952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
889efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    if (log)
890efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    {
891efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham        log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
892efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham                     process_sp.get(),
893efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham                     index_id,
894efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham                     thread_sp.get());
895efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    }
896efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
897efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham    return sb_thread;
898efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham}
899efbdd2280873cc87634bf4f4a37ab8b99662522aJim Ingham
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetStateFromEvent (const SBEvent &event)
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
903952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9047826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9057826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
9067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9077826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
90849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
90961ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     lldb_private::StateAsCString (ret_val));
9107826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9117826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    return ret_val;
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetRestartedFromEvent (const SBEvent &event)
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91763094e0bb161580564954dee512955c1c79d3476Greg Clayton    return Process::ProcessEventData::GetRestartedFromEvent (event.get());
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamsize_t
92189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim InghamSBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
92289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham{
92389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    return Process::ProcessEventData::GetNumRestartedReasons(event.get());
92489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham}
92589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham
92689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamconst char *
92789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim InghamSBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
92889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham{
92989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham    return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
93089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham}
93189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetProcessFromEvent (const SBEvent &event)
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93563094e0bb161580564954dee512955c1c79d3476Greg Clayton    SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return process;
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93928e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Inghambool
94028e23861bedbeb5e46be7d2af4c33bf5132422c6Jim InghamSBProcess::EventIsProcessEvent (const SBEvent &event)
94128e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham{
9425a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
94328e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham}
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBBroadcaster
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::GetBroadcaster () const
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
948952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9497826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9500416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
9510416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
9520416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    SBBroadcaster broadcaster(process_sp.get(), false);
9537826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9547826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
9550416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",  process_sp.get(),
95661ba7ec20f616f907473dd501341cef5b47fa3f8Caroline Tice                     broadcaster.get());
9577826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return broadcaster;
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9615a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Inghamconst char *
9625a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamSBProcess::GetBroadcasterClass ()
9635a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham{
9645a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    return Process::GetStaticBroadcasterClass().AsCString();
9655a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham}
9665a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
970952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9717826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_read = 0;
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9740416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
9750416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
976a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
977a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
9785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
9790416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
980a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     addr,
981a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     dst,
982851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)dst_len,
983a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sb_error.get());
984a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
9850416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
9860416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
988a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
989a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
990a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
991a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
992a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
993a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
994a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
995a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
9969f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
9979f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get());
998a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
999a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sb_error.SetErrorString ("SBProcess is invalid");
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    if (log)
10073f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton    {
10083f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        SBStream sstr;
10093f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton        sb_error.GetDescription (sstr);
10105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
10110416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
10123f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     addr,
10133f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     dst,
1014851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)dst_len,
10153f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     sb_error.get(),
10163f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                     sstr.GetData(),
1017851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)bytes_read);
10183f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton    }
10197826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_read;
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
10244a2e33769873d68d5703da5742c0e248f46e3a72Greg ClaytonSBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
10254a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton{
10264a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    size_t bytes_read = 0;
10270416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
10280416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
10294a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
1030a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1031a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1032a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1033a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1034a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1035a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1036a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1037a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1038952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10399f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
10409f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get());
1041a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1042a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
10434a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
10444a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    else
10454a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
10464a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        sb_error.SetErrorString ("SBProcess is invalid");
10474a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
10484a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    return bytes_read;
10494a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton}
10504a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton
10514a2e33769873d68d5703da5742c0e248f46e3a72Greg Claytonuint64_t
10524a2e33769873d68d5703da5742c0e248f46e3a72Greg ClaytonSBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
10534a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton{
1054a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    uint64_t value = 0;
10550416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
10560416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
10574a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
1058a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1059a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1060a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1061a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1062a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1063a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1064a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1065a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1066952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10679f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
10689f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get());
1069a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1070a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
10714a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
10724a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    else
10734a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
10744a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        sb_error.SetErrorString ("SBProcess is invalid");
10754a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
1076a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    return value;
10774a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton}
10784a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton
10794a2e33769873d68d5703da5742c0e248f46e3a72Greg Claytonlldb::addr_t
10804a2e33769873d68d5703da5742c0e248f46e3a72Greg ClaytonSBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
10814a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton{
10824a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
10830416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
10840416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
10854a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
1086a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1087a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1088a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1089a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1090a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1091a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1092a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1093a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1094952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10959f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
10969f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get());
1097a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1098a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
10994a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
11004a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    else
11014a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    {
11024a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton        sb_error.SetErrorString ("SBProcess is invalid");
11034a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    }
11044a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton    return ptr;
11054a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton}
11064a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton
11074a2e33769873d68d5703da5742c0e248f46e3a72Greg Claytonsize_t
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_written = 0;
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1112952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11130416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
11140416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
11150416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton
1116a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
1117a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
11185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
11190416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
1120a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     addr,
1121a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     src,
1122851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)src_len,
1123a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sb_error.get());
1124a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
1125a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
11260416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1128a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1129a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1130a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1131a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1132a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1133a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1134a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1135a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
11369f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
11379f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get());
1138a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1139a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1142a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    if (log)
1143a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    {
1144a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        SBStream sstr;
1145a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton        sb_error.GetDescription (sstr);
11465f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
11470416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp.get(),
1148a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     addr,
1149a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     src,
1150851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)src_len,
1151a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sb_error.get(),
1152a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton                     sstr.GetData(),
1153851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705Greg Clayton                     (uint64_t)bytes_written);
1154a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    }
1155a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return bytes_written;
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115998f930f429160f9777f626c3ac6aa609f4e965d2Caroline Ticebool
116098f930f429160f9777f626c3ac6aa609f4e965d2Caroline TiceSBProcess::GetDescription (SBStream &description)
116198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice{
116296154be69fa240a662419183ed08e1cfc5418164Greg Clayton    Stream &strm = description.ref();
116396154be69fa240a662419183ed08e1cfc5418164Greg Clayton
11640416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
11650416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
116698f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    {
116798f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice        char path[PATH_MAX];
116898f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice        GetTarget().GetExecutable().GetPath (path, sizeof(path));
11690416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton        Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
11705c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        const char *exe_name = NULL;
11715c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton        if (exe_module)
11725c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton            exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
11735c4c746a3a83c1aad411c6cdc5f9525a4fc2d17eGreg Clayton
11745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
11750416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton                     process_sp->GetID(),
117696154be69fa240a662419183ed08e1cfc5418164Greg Clayton                     lldb_private::StateAsCString (GetState()),
117796154be69fa240a662419183ed08e1cfc5418164Greg Clayton                     GetNumThreads(),
117896154be69fa240a662419183ed08e1cfc5418164Greg Clayton                     exe_name ? ", executable = " : "",
117996154be69fa240a662419183ed08e1cfc5418164Greg Clayton                     exe_name ? exe_name : "");
118098f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    }
118198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    else
118296154be69fa240a662419183ed08e1cfc5418164Greg Clayton        strm.PutCString ("No value");
118398f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice
118498f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    return true;
118598f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice}
11860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
11870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t
1188191343e7213d3d717327319352d086f981fa8e58Johnny ChenSBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1189191343e7213d3d717327319352d086f981fa8e58Johnny Chen{
1190952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1191191343e7213d3d717327319352d086f981fa8e58Johnny Chen
1192191343e7213d3d717327319352d086f981fa8e58Johnny Chen    uint32_t num = 0;
1193191343e7213d3d717327319352d086f981fa8e58Johnny Chen    ProcessSP process_sp(GetSP());
1194191343e7213d3d717327319352d086f981fa8e58Johnny Chen    if (process_sp)
1195191343e7213d3d717327319352d086f981fa8e58Johnny Chen    {
1196191343e7213d3d717327319352d086f981fa8e58Johnny Chen        Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1197191343e7213d3d717327319352d086f981fa8e58Johnny Chen        sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
1198191343e7213d3d717327319352d086f981fa8e58Johnny Chen        if (log)
1199191343e7213d3d717327319352d086f981fa8e58Johnny Chen            log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
1200191343e7213d3d717327319352d086f981fa8e58Johnny Chen                         process_sp.get(), num);
1201191343e7213d3d717327319352d086f981fa8e58Johnny Chen    }
1202191343e7213d3d717327319352d086f981fa8e58Johnny Chen    else
1203191343e7213d3d717327319352d086f981fa8e58Johnny Chen    {
1204191343e7213d3d717327319352d086f981fa8e58Johnny Chen        sb_error.SetErrorString ("SBProcess is invalid");
1205191343e7213d3d717327319352d086f981fa8e58Johnny Chen    }
1206191343e7213d3d717327319352d086f981fa8e58Johnny Chen    return num;
1207191343e7213d3d717327319352d086f981fa8e58Johnny Chen}
1208191343e7213d3d717327319352d086f981fa8e58Johnny Chen
1209191343e7213d3d717327319352d086f981fa8e58Johnny Chenuint32_t
12100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonSBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
12110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
12120416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
12130416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
1214bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
1215a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1216a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1217a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1218a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1219a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1220a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1221a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1222a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1223952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
12249f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
12259f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get());
1226a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1227a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1228bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
12290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return LLDB_INVALID_IMAGE_TOKEN;
12300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
12310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
12320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonlldb::SBError
12330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonSBProcess::UnloadImage (uint32_t image_token)
12340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
12350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    lldb::SBError sb_error;
12360416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    ProcessSP process_sp(GetSP());
12370416bdf783a7dc2544b9ab034e225391f8f47343Greg Clayton    if (process_sp)
1238bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    {
1239a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        Process::StopLocker stop_locker;
1240a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        if (stop_locker.TryLock(&process_sp->GetRunLock()))
1241a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1242a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1243a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetError (process_sp->UnloadImage (image_token));
1244a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1245a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        else
1246a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        {
1247952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
12489f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton            if (log)
12499f3c98e1cfdb463848cb13d03312fab8a5ec7f0dGreg Clayton                log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get());
1250a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton            sb_error.SetErrorString("process is running");
1251a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton        }
1252bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg Clayton    }
12530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    else
12540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        sb_error.SetErrorString("invalid process");
12550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return sb_error;
12560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
1257