From 63ca311423b94ce2094f9cc7dc9ffe38a4757aee Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Sun, 28 Nov 2010 20:05:11 -0800 Subject: [PATCH] remove finished subprocs from running set --- subprocess.cc | 7 +++++++ subprocess_test.cc | 3 +++ 2 files changed, 10 insertions(+) diff --git a/subprocess.cc b/subprocess.cc index 59e05eb..82d3683 100644 --- a/subprocess.cc +++ b/subprocess.cc @@ -1,6 +1,8 @@ #include "subprocess.h" +#include #include +#include #include #include #include @@ -72,11 +74,14 @@ void Subprocess::OnFDReady(int fd) { } bool Subprocess::Finish(string* err) { + assert(pid_ != -1); + int status; if (waitpid(pid_, &status, 0) < 0) { *err = strerror(errno); return false; } + pid_ = -1; if (WIFEXITED(status)) { int exit = WEXITSTATUS(status); @@ -133,6 +138,8 @@ void SubprocessSet::DoWork(string* err) { if (subproc->done()) { subproc->Finish(err); finished_.push(subproc); + std::remove(running_.begin(), running_.end(), subproc); + running_.resize(running_.size() - 1); } } } diff --git a/subprocess_test.cc b/subprocess_test.cc index 325fad9..b51bbe7 100644 --- a/subprocess_test.cc +++ b/subprocess_test.cc @@ -66,6 +66,7 @@ TEST(SubprocessSet, Multi) { subprocs.Add(processes[i]); } + ASSERT_EQ(3, subprocs.running_.size()); for (int i = 0; i < 3; ++i) { ASSERT_FALSE(processes[i]->done()); ASSERT_EQ("", processes[i]->stdout_.buf_); @@ -74,10 +75,12 @@ TEST(SubprocessSet, Multi) { while (!processes[0]->done() || !processes[1]->done() || !processes[2]->done()) { + ASSERT_GT(subprocs.running_.size(), 0); subprocs.DoWork(&err); ASSERT_EQ("", err); } + ASSERT_EQ(0, subprocs.running_.size()); ASSERT_EQ(3, subprocs.finished_.size()); for (int i = 0; i < 3; ++i) { -- 2.7.4