summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2014-11-10 22:32:18 +0000
committerZachary Turner <zturner@google.com>2014-11-10 22:32:18 +0000
commit3985f891a3b6fa9fcbf3c44d629722778698e6a2 (patch)
tree18378a9325653c269bf3314f590fbd98032682c7
parentba80da60c806bc2d7ae65bc557b519ebb2772901 (diff)
downloadbcm5719-llvm-3985f891a3b6fa9fcbf3c44d629722778698e6a2.tar.gz
bcm5719-llvm-3985f891a3b6fa9fcbf3c44d629722778698e6a2.zip
[ProcessWindows] Notify process plugin when the launch succeeds.
llvm-svn: 221637
-rw-r--r--lldb/source/Plugins/Process/Windows/DebuggerThread.cpp18
-rw-r--r--lldb/source/Plugins/Process/Windows/DebuggerThread.h16
-rw-r--r--lldb/source/Plugins/Process/Windows/ForwardDecl.h3
-rw-r--r--lldb/source/Plugins/Process/Windows/IDebugDelegate.h14
-rw-r--r--lldb/source/Plugins/Process/Windows/LocalDebugDelegate.cpp6
-rw-r--r--lldb/source/Plugins/Process/Windows/LocalDebugDelegate.h19
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessMessages.h9
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.cpp49
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.h8
9 files changed, 89 insertions, 53 deletions
diff --git a/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp b/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
index da4b375596a..f0e27b08607 100644
--- a/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
+++ b/lldb/source/Plugins/Process/Windows/DebuggerThread.cpp
@@ -43,28 +43,22 @@ struct DebugLaunchContext
DebuggerThread::DebuggerThread(DebugDelegateSP debug_delegate)
: m_debug_delegate(debug_delegate)
, m_image_file(nullptr)
- , m_launched_event(nullptr)
{
- m_launched_event = ::CreateEvent(nullptr, TRUE, FALSE, nullptr);
}
DebuggerThread::~DebuggerThread()
{
- if (m_launched_event != nullptr)
- ::CloseHandle(m_launched_event);
}
-HostProcess
+Error
DebuggerThread::DebugLaunch(const ProcessLaunchInfo &launch_info)
{
Error error;
DebugLaunchContext *context = new DebugLaunchContext(this, launch_info);
HostThread slave_thread(ThreadLauncher::LaunchThread("lldb.plugin.process-windows.slave[?]", DebuggerThreadRoutine, context, &error));
- if (error.Success())
- ::WaitForSingleObject(m_launched_event, INFINITE);
- return m_process;
+ return error;
}
lldb::thread_result_t
@@ -95,7 +89,10 @@ DebuggerThread::DebuggerThreadRoutine(const ProcessLaunchInfo &launch_info)
if (error.Success())
DebugLoop();
else
- SetEvent(m_launched_event);
+ {
+ ProcessMessageDebuggerError message(m_process, error, 0);
+ m_debug_delegate->OnDebuggerError(message);
+ }
return 0;
}
@@ -175,7 +172,8 @@ DebuggerThread::HandleCreateProcessEvent(const CREATE_PROCESS_DEBUG_INFO &info,
((HostThreadWindows &)m_main_thread.GetNativeThread()).SetOwnsHandle(false);
m_image_file = info.hFile;
- SetEvent(m_launched_event);
+ ProcessMessageDebuggerConnected message(m_process);
+ m_debug_delegate->OnDebuggerConnected(message);
return DBG_CONTINUE;
}
diff --git a/lldb/source/Plugins/Process/Windows/DebuggerThread.h b/lldb/source/Plugins/Process/Windows/DebuggerThread.h
index 98b554dae2a..9505eeb6c69 100644
--- a/lldb/source/Plugins/Process/Windows/DebuggerThread.h
+++ b/lldb/source/Plugins/Process/Windows/DebuggerThread.h
@@ -32,7 +32,18 @@ class DebuggerThread : public std::enable_shared_from_this<DebuggerThread>
DebuggerThread(DebugDelegateSP debug_delegate);
virtual ~DebuggerThread();
- HostProcess DebugLaunch(const ProcessLaunchInfo &launch_info);
+ Error DebugLaunch(const ProcessLaunchInfo &launch_info);
+
+ HostProcess
+ GetProcess() const
+ {
+ return m_process;
+ }
+ HostThread
+ GetMainThread() const
+ {
+ return m_main_thread;
+ }
private:
void DebugLoop();
@@ -48,9 +59,6 @@ class DebuggerThread : public std::enable_shared_from_this<DebuggerThread>
DebugDelegateSP m_debug_delegate;
- HANDLE m_launched_event; // Signalled when the process is finished launching, either
- // successfully or with an error.
-
HostProcess m_process; // The process being debugged.
HostThread m_main_thread; // The main thread of the inferior.
HANDLE m_image_file; // The image file of the process being debugged.
diff --git a/lldb/source/Plugins/Process/Windows/ForwardDecl.h b/lldb/source/Plugins/Process/Windows/ForwardDecl.h
index 739905f438f..05104938e31 100644
--- a/lldb/source/Plugins/Process/Windows/ForwardDecl.h
+++ b/lldb/source/Plugins/Process/Windows/ForwardDecl.h
@@ -22,7 +22,6 @@ class DebuggerThread;
// Process message forward declarations.
class ProcessMessageBase;
-class ProcessMessageCreateProcess;
class ProcessMessageExitProcess;
class ProcessMessageDebuggerConnected;
class ProcessMessageException;
@@ -34,7 +33,7 @@ class ProcessMessageDebugString;
class ProcessMessageDebuggerError;
typedef std::shared_ptr<IDebugDelegate> DebugDelegateSP;
-typedef std::unique_ptr<DebuggerThread> DebuggerThreadUP;
+typedef std::shared_ptr<DebuggerThread> DebuggerThreadSP;
}
#endif \ No newline at end of file
diff --git a/lldb/source/Plugins/Process/Windows/IDebugDelegate.h b/lldb/source/Plugins/Process/Windows/IDebugDelegate.h
index 0398c61a466..3d291b7dd4a 100644
--- a/lldb/source/Plugins/Process/Windows/IDebugDelegate.h
+++ b/lldb/source/Plugins/Process/Windows/IDebugDelegate.h
@@ -10,20 +10,11 @@
#ifndef liblldb_Plugins_Process_Windows_IDebugDelegate_H_
#define liblldb_Plugins_Process_Windows_IDebugDelegate_H_
+#include "ForwardDecl.h"
+
namespace lldb_private
{
-class ProcessMessageCreateProcess;
-class ProcessMessageExitProcess;
-class ProcessMessageDebuggerConnected;
-class ProcessMessageException;
-class ProcessMessageCreateThread;
-class ProcessMessageExitThread;
-class ProcessMessageLoadDll;
-class ProcessMessageUnloadDll;
-class ProcessMessageDebugString;
-class ProcessMessageDebuggerError;
-
//----------------------------------------------------------------------
// IDebugDelegate
//
@@ -35,7 +26,6 @@ class IDebugDelegate
public:
virtual ~IDebugDelegate() {}
- virtual void OnProcessLaunched(const ProcessMessageCreateProcess &message) = 0;
virtual void OnExitProcess(const ProcessMessageExitProcess &message) = 0;
virtual void OnDebuggerConnected(const ProcessMessageDebuggerConnected &message) = 0;
virtual void OnDebugException(const ProcessMessageException &message) = 0;
diff --git a/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.cpp b/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.cpp
index 4f31b4317b3..155b80eab88 100644
--- a/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.cpp
+++ b/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.cpp
@@ -19,12 +19,6 @@ LocalDebugDelegate::LocalDebugDelegate(ProcessSP process)
}
void
-LocalDebugDelegate::OnProcessLaunched(const ProcessMessageCreateProcess &message)
-{
- ((ProcessWindows &)*m_process).OnProcessLaunched(message);
-}
-
-void
LocalDebugDelegate::OnExitProcess(const ProcessMessageExitProcess &message)
{
((ProcessWindows &)*m_process).OnExitProcess(message);
diff --git a/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.h b/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.h
index 88bf7f393e9..708ee71911c 100644
--- a/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.h
+++ b/lldb/source/Plugins/Process/Windows/LocalDebugDelegate.h
@@ -42,16 +42,15 @@ class LocalDebugDelegate : public IDebugDelegate
public:
explicit LocalDebugDelegate::LocalDebugDelegate(lldb::ProcessSP process);
- void OnProcessLaunched(const ProcessMessageCreateProcess &message);
- void OnExitProcess(const ProcessMessageExitProcess &message);
- void OnDebuggerConnected(const ProcessMessageDebuggerConnected &message);
- void OnDebugException(const ProcessMessageException &message);
- void OnCreateThread(const ProcessMessageCreateThread &message);
- void OnExitThread(const ProcessMessageExitThread &message);
- void OnLoadDll(const ProcessMessageLoadDll &message);
- void OnUnloadDll(const ProcessMessageUnloadDll &message);
- void OnDebugString(const ProcessMessageDebugString &message);
- void OnDebuggerError(const ProcessMessageDebuggerError &message);
+ void OnExitProcess(const ProcessMessageExitProcess &message) override;
+ void OnDebuggerConnected(const ProcessMessageDebuggerConnected &message) override;
+ void OnDebugException(const ProcessMessageException &message) override;
+ void OnCreateThread(const ProcessMessageCreateThread &message) override;
+ void OnExitThread(const ProcessMessageExitThread &message) override;
+ void OnLoadDll(const ProcessMessageLoadDll &message) override;
+ void OnUnloadDll(const ProcessMessageUnloadDll &message) override;
+ void OnDebugString(const ProcessMessageDebugString &message) override;
+ void OnDebuggerError(const ProcessMessageDebuggerError &message) override;
private:
lldb::ProcessSP m_process;
diff --git a/lldb/source/Plugins/Process/Windows/ProcessMessages.h b/lldb/source/Plugins/Process/Windows/ProcessMessages.h
index d71f55f3749..6873ef81339 100644
--- a/lldb/source/Plugins/Process/Windows/ProcessMessages.h
+++ b/lldb/source/Plugins/Process/Windows/ProcessMessages.h
@@ -42,6 +42,15 @@ class ProcessMessageBase
HostProcess m_process;
};
+class ProcessMessageDebuggerConnected : public ProcessMessageBase
+{
+ public:
+ ProcessMessageDebuggerConnected(const HostProcess &process)
+ : ProcessMessageBase(process)
+ {
+ }
+};
+
class ProcessMessageExitProcess : public ProcessMessageBase
{
public:
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
index f0edeaeeaaa..db410c35a20 100644
--- a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
@@ -35,6 +35,24 @@
using namespace lldb;
using namespace lldb_private;
+namespace lldb_private
+{
+// We store a pointer to this class in the ProcessWindows, so that we don't expose Windows
+// OS specific types and implementation details from a public header file.
+class ProcessWindowsData
+{
+ public:
+ ProcessWindowsData()
+ : m_launched_event(nullptr)
+ {
+ m_launched_event = ::CreateEvent(nullptr, TRUE, FALSE, nullptr);
+ }
+
+ ~ProcessWindowsData() { ::CloseHandle(m_launched_event); }
+
+ HANDLE m_launched_event;
+};
+}
//------------------------------------------------------------------------------
// Static functions.
@@ -61,8 +79,9 @@ ProcessWindows::Initialize()
//------------------------------------------------------------------------------
// Constructors and destructors.
-ProcessWindows::ProcessWindows(Target& target, Listener &listener)
+ProcessWindows::ProcessWindows(Target &target, Listener &listener)
: lldb_private::Process(target, listener)
+ , m_data_up(new ProcessWindowsData())
{
}
@@ -107,7 +126,15 @@ ProcessWindows::DoLaunch(Module *exe_module,
{
DebugDelegateSP delegate(new LocalDebugDelegate(shared_from_this()));
m_debugger.reset(new DebuggerThread(delegate));
- process = m_debugger->DebugLaunch(launch_info);
+ // Kick off the DebugLaunch asynchronously and wait for it to complete.
+ result = m_debugger->DebugLaunch(launch_info);
+ if (result.Success())
+ {
+ if (::WaitForSingleObject(m_data_up->m_launched_event, INFINITE) == WAIT_OBJECT_0)
+ process = m_debugger->GetProcess();
+ else
+ result.SetError(::GetLastError(), eErrorTypeWin32);
+ }
}
else
return Host::LaunchProcess(launch_info);
@@ -210,11 +237,6 @@ ProcessWindows::CanDebug(Target &target, bool plugin_specified_by_name)
}
void
-ProcessWindows::OnProcessLaunched(const ProcessMessageCreateProcess &message)
-{
-}
-
-void
ProcessWindows::OnExitProcess(const ProcessMessageExitProcess &message)
{
SetProcessExitStatus(nullptr, GetID(), true, 0, message.GetExitCode());
@@ -223,6 +245,7 @@ ProcessWindows::OnExitProcess(const ProcessMessageExitProcess &message)
void
ProcessWindows::OnDebuggerConnected(const ProcessMessageDebuggerConnected &message)
{
+ ::SetEvent(m_data_up->m_launched_event);
}
void
@@ -258,4 +281,16 @@ ProcessWindows::OnDebugString(const ProcessMessageDebugString &message)
void
ProcessWindows::OnDebuggerError(const ProcessMessageDebuggerError &message)
{
+ DWORD result = ::WaitForSingleObject(m_data_up->m_launched_event, 0);
+ if (result == WAIT_TIMEOUT)
+ {
+ // If we haven't actually launched the process yet, this was an error
+ // launching the process. Set the internal error and signal.
+ m_launch_error = message.GetError();
+ ::SetEvent(m_data_up->m_launched_event);
+ return;
+ }
+
+ // This happened while debugging.
+ // TODO: Implement this.
}
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/ProcessWindows.h
index 61473e40995..480d5e892ab 100644
--- a/lldb/source/Plugins/Process/Windows/ProcessWindows.h
+++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.h
@@ -14,11 +14,13 @@
// C++ Includes
#include <map>
+#include <memory>
#include <queue>
// Other libraries and framework includes
#include "ForwardDecl.h"
#include "IDebugDelegate.h"
+#include "lldb/Core/Error.h"
#include "lldb/Host/HostThread.h"
#include "lldb/Target/Process.h"
@@ -27,6 +29,7 @@ class ProcessMonitor;
namespace lldb_private
{
class HostProcess;
+class ProcessWindowsData;
}
class ProcessWindows : public lldb_private::Process, public lldb_private::IDebugDelegate
@@ -112,7 +115,6 @@ public:
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, lldb_private::Error &error);
// IDebugDelegate overrides.
- virtual void OnProcessLaunched(const lldb_private::ProcessMessageCreateProcess &message) override;
virtual void OnExitProcess(const lldb_private::ProcessMessageExitProcess &message) override;
virtual void OnDebuggerConnected(const lldb_private::ProcessMessageDebuggerConnected &message) override;
virtual void OnDebugException(const lldb_private::ProcessMessageException &message) override;
@@ -124,7 +126,9 @@ public:
virtual void OnDebuggerError(const lldb_private::ProcessMessageDebuggerError &message) override;
private:
- lldb_private::DebuggerThreadUP m_debugger;
+ std::unique_ptr<lldb_private::ProcessWindowsData> m_data_up;
+ lldb_private::Error m_launch_error;
+ lldb_private::DebuggerThreadSP m_debugger;
};
#endif // liblldb_Plugins_Process_Windows_ProcessWindows_H_
OpenPOWER on IntegriCloud