TEST(SubprocessSet, Single) { SubprocessSet subprocs_; Subprocess* ls = new Subprocess(&subprocs_); EXPECT_TRUE(ls->Start("cmd.exe /c DIR C:\\")); subprocs_.Add(ls); while (!ls->done()) { subprocs_.DoWork(); } ASSERT_TRUE(ls->Finish()); ASSERT_NE("", ls->stdout_.buf_); ASSERT_EQ(1, subprocs_.finished_.size()); }
void SubprocessSet::DoWork() { DWORD numbytesread; Subprocess* subproc; LPOVERLAPPED overlapped; BOOL ok = GetQueuedCompletionStatus(g_ioport, &numbytesread, (PULONG_PTR) &subproc, &overlapped, INFINITE); assert(GetLastError() == ERROR_BROKEN_PIPE || ok); assert(&subproc->stdout_.overlapped_ == overlapped || &subproc->stderr_.overlapped_ == overlapped ); Subprocess::Stream* stream; if (overlapped == &subproc->stdout_.overlapped_) stream = &subproc->stdout_; else stream = &subproc->stderr_; stream->ProcessInput(ok ? numbytesread : 0); if (subproc->done()) { vector<Subprocess*>::iterator end = std::remove(running_.begin(), running_.end(), subproc); if (running_.end() != end) { finished_.push(subproc); running_.resize(end - running_.begin()); } } }