summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Windows
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2014-10-14 21:55:08 +0000
committerZachary Turner <zturner@google.com>2014-10-14 21:55:08 +0000
commit172d37d3b92ca70e65f11f9a7caf7af4c8a5e44f (patch)
tree0df4532b38c6277c18c69659225f56a8188c6092 /lldb/source/Plugins/Process/Windows
parent756acbaa0e76c17426983863099d42449b0a6729 (diff)
downloadbcm5719-llvm-172d37d3b92ca70e65f11f9a7caf7af4c8a5e44f.tar.gz
bcm5719-llvm-172d37d3b92ca70e65f11f9a7caf7af4c8a5e44f.zip
Create a process launcher abstraction.
This implements Host::LaunchProcess for windows, and in doing so does some minor refactor to move towards a more modular process launching design. The original motivation for this is that launching processes on windows needs some very windows specific code, which would live most appropriately in source/Host/windows somewhere. However, there is already some common code that all platforms use when launching a process before delegating to the platform specific stuff, which lives in source/Host/common/Host.cpp which would be nice to reuse without duplicating. This commonality has been abstracted into MonitoringProcessLauncher, a class which abstracts out the notion of launching a process using an arbitrary algorithm, and then monitoring it for state changes. The windows specific launching code lives in ProcessLauncherWindows, and the posix specific launching code lives in ProcessLauncherPosix. When launching a process MonitoringProcessLauncher is created, and then an appropriate delegate launcher is created and given to the MonitoringProcessLauncher. Reviewed by: Greg Clayton Differential Revision: http://reviews.llvm.org/D5781 llvm-svn: 219731
Diffstat (limited to 'lldb/source/Plugins/Process/Windows')
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.cpp76
1 files changed, 5 insertions, 71 deletions
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
index de625e3c4ba..a61a4d2b909 100644
--- a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
@@ -16,6 +16,8 @@
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/State.h"
#include "lldb/Host/Host.h"
+#include "lldb/Host/HostProcess.h"
+#include "lldb/Host/windows/ProcessLauncherWindows.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/FileAction.h"
@@ -26,42 +28,6 @@
using namespace lldb;
using namespace lldb_private;
-namespace
-{
-HANDLE
-GetStdioHandle(ProcessLaunchInfo &launch_info, int fd)
-{
- const FileAction *action = launch_info.GetFileActionForFD(fd);
- if (action == nullptr)
- return NULL;
- SECURITY_ATTRIBUTES secattr = {0};
- secattr.nLength = sizeof(SECURITY_ATTRIBUTES);
- secattr.bInheritHandle = TRUE;
-
- const char *path = action->GetPath();
- DWORD access = 0;
- DWORD share = FILE_SHARE_READ | FILE_SHARE_WRITE;
- DWORD create = 0;
- DWORD flags = 0;
- if (fd == STDIN_FILENO)
- {
- access = GENERIC_READ;
- create = OPEN_EXISTING;
- flags = FILE_ATTRIBUTE_READONLY;
- }
- if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
- {
- access = GENERIC_WRITE;
- create = CREATE_ALWAYS;
- if (fd == STDERR_FILENO)
- flags = FILE_FLAG_WRITE_THROUGH;
- }
-
- HANDLE result = ::CreateFile(path, access, share, &secattr, create, flags, NULL);
- return (result == INVALID_HANDLE_VALUE) ? NULL : result;
-}
-}
-
//------------------------------------------------------------------------------
// Static functions.
@@ -123,42 +89,10 @@ Error
ProcessWindows::DoLaunch(Module *exe_module,
ProcessLaunchInfo &launch_info)
{
- std::string executable;
- std::string commandLine;
- std::vector<char> environment;
- STARTUPINFO startupinfo = {0};
- PROCESS_INFORMATION pi = {0};
-
- HANDLE stdin_handle = GetStdioHandle(launch_info, STDIN_FILENO);
- HANDLE stdout_handle = GetStdioHandle(launch_info, STDOUT_FILENO);
- HANDLE stderr_handle = GetStdioHandle(launch_info, STDERR_FILENO);
-
- startupinfo.cb = sizeof(startupinfo);
- startupinfo.dwFlags |= STARTF_USESTDHANDLES;
- startupinfo.hStdError = stderr_handle;
- startupinfo.hStdInput = stdin_handle;
- startupinfo.hStdOutput = stdout_handle;
-
- executable = launch_info.GetExecutableFile().GetPath();
- launch_info.GetArguments().GetQuotedCommandString(commandLine);
- BOOL result = ::CreateProcessA(executable.c_str(), const_cast<char *>(commandLine.c_str()), NULL, NULL, TRUE,
- CREATE_NEW_CONSOLE, NULL, launch_info.GetWorkingDirectory(), &startupinfo, &pi);
- if (result)
- {
- ::CloseHandle(pi.hProcess);
- ::CloseHandle(pi.hThread);
- }
-
- if (stdin_handle)
- ::CloseHandle(stdin_handle);
- if (stdout_handle)
- ::CloseHandle(stdout_handle);
- if (stderr_handle)
- ::CloseHandle(stderr_handle);
-
Error error;
- if (!result)
- error.SetErrorToErrno();
+ ProcessLauncherWindows launcher;
+ HostProcess process = launcher.LaunchProcess(launch_info, error);
+ launch_info.SetProcessID(process.GetProcessId());
return error;
}
OpenPOWER on IntegriCloud