catch ourselves when we're stuck
authorEvan Martin <martine@danga.com>
Sat, 8 Jan 2011 00:35:47 +0000 (16:35 -0800)
committerEvan Martin <martine@danga.com>
Sat, 8 Jan 2011 00:35:47 +0000 (16:35 -0800)
src/build.cc
src/build.h
src/build_test.cc

index d02027d..8ffbc7c 100644 (file)
@@ -165,7 +165,7 @@ struct RealCommandRunner : public CommandRunner {
   virtual ~RealCommandRunner() {}
   virtual bool CanRunMore();
   virtual bool StartCommand(Edge* edge);
-  virtual void WaitForCommands();
+  virtual bool WaitForCommands();
   virtual Edge* NextFinishedCommand(bool* success);
 
   SubprocessSet subprocs_;
@@ -188,10 +188,14 @@ bool RealCommandRunner::StartCommand(Edge* edge) {
   return true;
 }
 
-void RealCommandRunner::WaitForCommands() {
-  while (subprocs_.finished_.empty() && !subprocs_.running_.empty()) {
+bool RealCommandRunner::WaitForCommands() {
+  if (subprocs_.running_.empty())
+    return false;
+
+  while (subprocs_.finished_.empty()) {
     subprocs_.DoWork();
   }
+  return true;
 }
 
 Edge* RealCommandRunner::NextFinishedCommand(bool* success) {
@@ -225,7 +229,8 @@ struct DryRunCommandRunner : public CommandRunner {
     finished_.push(edge);
     return true;
   }
-  virtual void WaitForCommands() {
+  virtual bool WaitForCommands() {
+    return true;
   }
   virtual Edge* NextFinishedCommand(bool* success) {
     if (finished_.empty())
@@ -300,7 +305,10 @@ bool Builder::Build(string* err) {
       }
       FinishEdge(edge);
     } else {
-      command_runner_->WaitForCommands();
+      if (!command_runner_->WaitForCommands()) {
+        *err = "stuck [this is a bug]";
+        return false;
+      }
     }
   }
 
index f4b8d0c..843e907 100644 (file)
@@ -53,7 +53,9 @@ struct CommandRunner {
   virtual ~CommandRunner() {}
   virtual bool CanRunMore() = 0;
   virtual bool StartCommand(Edge* edge) = 0;
-  virtual void WaitForCommands() = 0;
+  // Wait for commands to make progress; return false if there is no
+  // progress to be made.
+  virtual bool WaitForCommands() = 0;
   virtual Edge* NextFinishedCommand(bool* success) = 0;
 };
 
index b2c4d76..a430801 100644 (file)
@@ -178,7 +178,7 @@ struct BuildTest : public StateTestWithBuiltinRules,
   // CommandRunner impl
   virtual bool CanRunMore();
   virtual bool StartCommand(Edge* edge);
-  virtual void WaitForCommands();
+  virtual bool WaitForCommands();
   virtual Edge* NextFinishedCommand(bool* success);
 
   // DiskInterface
@@ -251,7 +251,8 @@ bool BuildTest::StartCommand(Edge* edge) {
   return false;
 }
 
-void BuildTest::WaitForCommands() {
+bool BuildTest::WaitForCommands() {
+  return true;
 }
 
 Edge* BuildTest::NextFinishedCommand(bool* success) {