Esempio n. 1
0
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());
}
Esempio n. 2
0
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());
    }
  }
}