diff options
author | Nico Weber <thakis@chromium.org> | 2014-05-13 19:35:52 (GMT) |
---|---|---|
committer | Nico Weber <thakis@chromium.org> | 2014-05-13 19:37:31 (GMT) |
commit | 47993664be821df46b009d3e48d251e6266cefc9 (patch) | |
tree | ad5d847c6aa2ff4efc92eec7caad75a9fa300d32 /src/subprocess-win32.cc | |
parent | 6c9a54649d4eec45f58e117612a34a2c214a0214 (diff) | |
download | Ninja-47993664be821df46b009d3e48d251e6266cefc9.zip Ninja-47993664be821df46b009d3e48d251e6266cefc9.tar.gz Ninja-47993664be821df46b009d3e48d251e6266cefc9.tar.bz2 |
wip for console pool on windows
Diffstat (limited to 'src/subprocess-win32.cc')
-rw-r--r-- | src/subprocess-win32.cc | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/subprocess-win32.cc b/src/subprocess-win32.cc index c9607e1..c71f95b 100644 --- a/src/subprocess-win32.cc +++ b/src/subprocess-win32.cc @@ -21,7 +21,9 @@ #include "util.h" -Subprocess::Subprocess() : child_(NULL) , overlapped_(), is_reading_(false) { +Subprocess::Subprocess(bool use_console) : child_(NULL) , overlapped_(), + is_reading_(false), + use_console_(use_console) { } Subprocess::~Subprocess() { @@ -87,10 +89,14 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { STARTUPINFOA startup_info; memset(&startup_info, 0, sizeof(startup_info)); startup_info.cb = sizeof(STARTUPINFO); - startup_info.dwFlags = STARTF_USESTDHANDLES; - startup_info.hStdInput = nul; - startup_info.hStdOutput = child_pipe; - startup_info.hStdError = child_pipe; + if (!use_console_) { + startup_info.dwFlags = STARTF_USESTDHANDLES; + startup_info.hStdInput = nul; + startup_info.hStdOutput = child_pipe; + startup_info.hStdError = child_pipe; + } + // In the console case, child_pipe is still inherited by the child and closed + // when the subprocess finishes, which then notifies ninja. PROCESS_INFORMATION process_info; memset(&process_info, 0, sizeof(process_info)); @@ -215,9 +221,7 @@ BOOL WINAPI SubprocessSet::NotifyInterrupted(DWORD dwCtrlType) { } Subprocess *SubprocessSet::Add(const string& command, bool use_console) { - assert(!use_console); // We don't support this yet on Windows. - - Subprocess *subprocess = new Subprocess; + Subprocess *subprocess = new Subprocess(use_console); if (!subprocess->Start(this, command)) { delete subprocess; return 0; @@ -269,7 +273,9 @@ Subprocess* SubprocessSet::NextFinished() { void SubprocessSet::Clear() { for (vector<Subprocess*>::iterator i = running_.begin(); i != running_.end(); ++i) { - if ((*i)->child_) { + // Since the foreground process is in our process group, it will receive a + // SIGINT at the same time as us. XXX is this true on windows? + if ((*i)->child_ && !(*i)->use_console_) { if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, GetProcessId((*i)->child_))) { Win32Fatal("GenerateConsoleCtrlEvent"); |