summaryrefslogtreecommitdiffstats
path: root/patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch')
-rw-r--r--patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch111
1 files changed, 90 insertions, 21 deletions
diff --git a/patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch b/patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch
index caf8a5aac..f8ee646d7 100644
--- a/patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch
+++ b/patches/ninja-1.8.2/0002-Add-TokenPool-monitoring-to-SubprocessSet-DoWork.patch
@@ -6,37 +6,49 @@ Improve on the original jobserver client implementation. This makes
ninja a more aggressive GNU make jobserver client.
- add monitor interface to TokenPool
-- TokenPool passed down when plan indicates more work is ready to start
+- TokenPool is passed down when main loop indicates that more work is
+ ready and would be allowed to start if a token becomes available
- posix: update DoWork() to monitor TokenPool read file descriptor
- WaitForCommand() exits when DoWork() sets token flag
- Main loop starts over when WaitForCommand() sets token exit status
---
- src/build.cc | 27 ++++++++++++++++++++-------
- src/build.h | 2 +-
- src/build_test.cc | 4 ++--
+ src/build.cc | 53 +++++++++++++++++++++++++++++++++++------------
+ src/build.h | 3 ++-
+ src/build_test.cc | 9 ++++++--
src/exit_status.h | 3 ++-
- src/subprocess-posix.cc | 33 +++++++++++++++++++++++++++++++--
+ src/subprocess-posix.cc | 33 +++++++++++++++++++++++++++--
src/subprocess-win32.cc | 2 +-
- src/subprocess.h | 8 +++++++-
- src/subprocess_test.cc | 47 +++++++++++++++++++++++++++++++++--------------
+ src/subprocess.h | 8 ++++++-
+ src/subprocess_test.cc | 47 ++++++++++++++++++++++++++++-------------
src/tokenpool-gnu-make.cc | 5 +++++
src/tokenpool.h | 6 ++++++
- 10 files changed, 108 insertions(+), 29 deletions(-)
+ 10 files changed, 134 insertions(+), 35 deletions(-)
diff --git a/src/build.cc b/src/build.cc
-index cc796ff838fa..ccd67697786d 100644
+index cc796ff838fa..219bb9f1ff48 100644
--- a/src/build.cc
+++ b/src/build.cc
-@@ -50,7 +50,7 @@ struct DryRunCommandRunner : public CommandRunner {
+@@ -49,8 +49,9 @@ struct DryRunCommandRunner : public CommandRunner {
+
// Overridden from CommandRunner:
virtual bool CanRunMore();
++ virtual bool AcquireToken();
virtual bool StartCommand(Edge* edge);
- virtual bool WaitForCommand(Result* result);
+ virtual bool WaitForCommand(Result* result, bool more_ready);
private:
queue<Edge*> finished_;
-@@ -65,7 +65,7 @@ bool DryRunCommandRunner::StartCommand(Edge* edge) {
+@@ -60,12 +61,16 @@ bool DryRunCommandRunner::CanRunMore() {
+ return true;
+ }
+
++bool DryRunCommandRunner::AcquireToken() {
++ return true;
++}
++
+ bool DryRunCommandRunner::StartCommand(Edge* edge) {
+ finished_.push(edge);
return true;
}
@@ -45,16 +57,34 @@ index cc796ff838fa..ccd67697786d 100644
if (finished_.empty())
return false;
-@@ -490,7 +490,7 @@ struct RealCommandRunner : public CommandRunner {
+@@ -489,8 +494,9 @@ struct RealCommandRunner : public CommandRunner {
+ explicit RealCommandRunner(const BuildConfig& config);
virtual ~RealCommandRunner();
virtual bool CanRunMore();
++ virtual bool AcquireToken();
virtual bool StartCommand(Edge* edge);
- virtual bool WaitForCommand(Result* result);
+ virtual bool WaitForCommand(Result* result, bool more_ready);
virtual vector<Edge*> GetActiveEdges();
virtual void Abort();
-@@ -544,14 +544,23 @@ bool RealCommandRunner::StartCommand(Edge* edge) {
+@@ -527,9 +533,12 @@ bool RealCommandRunner::CanRunMore() {
+ subprocs_.running_.size() + subprocs_.finished_.size();
+ return (int)subproc_number < config_.parallelism
+ && (subprocs_.running_.empty() ||
+- ((config_.max_load_average <= 0.0f ||
+- GetLoadAverage() < config_.max_load_average)
+- && (!tokens_ || tokens_->Acquire())));
++ (config_.max_load_average <= 0.0f ||
++ GetLoadAverage() < config_.max_load_average));
++}
++
++bool RealCommandRunner::AcquireToken() {
++ return (!tokens_ || tokens_->Acquire());
+ }
+
+ bool RealCommandRunner::StartCommand(Edge* edge) {
+@@ -544,14 +553,23 @@ bool RealCommandRunner::StartCommand(Edge* edge) {
return true;
}
@@ -81,16 +111,34 @@ index cc796ff838fa..ccd67697786d 100644
if (tokens_)
tokens_->Release();
-@@ -685,7 +694,7 @@ bool Builder::Build(string* err) {
+@@ -662,9 +680,14 @@ bool Builder::Build(string* err) {
+ // command runner.
+ // Second, we attempt to wait for / reap the next finished command.
+ while (plan_.more_to_do()) {
+- // See if we can start any more commands.
+- if (failures_allowed && plan_.more_ready() &&
+- command_runner_->CanRunMore()) {
++ // See if we can start any more commands...
++ bool can_run_more =
++ failures_allowed &&
++ plan_.more_ready() &&
++ command_runner_->CanRunMore();
++
++ // ... but we also need a token to do that.
++ if (can_run_more && command_runner_->AcquireToken()) {
+ Edge* edge = plan_.FindWork();
+ if (!StartEdge(edge, err)) {
+ Cleanup();
+@@ -685,7 +708,7 @@ bool Builder::Build(string* err) {
// See if we can reap any finished commands.
if (pending_commands) {
CommandRunner::Result result;
- if (!command_runner_->WaitForCommand(&result) ||
-+ if (!command_runner_->WaitForCommand(&result, plan_.more_ready()) ||
++ if (!command_runner_->WaitForCommand(&result, can_run_more) ||
result.status == ExitInterrupted) {
Cleanup();
status_->BuildFinished();
-@@ -693,6 +702,10 @@ bool Builder::Build(string* err) {
+@@ -693,6 +716,10 @@ bool Builder::Build(string* err) {
return false;
}
@@ -102,10 +150,18 @@ index cc796ff838fa..ccd67697786d 100644
if (!FinishCommand(&result, err)) {
Cleanup();
diff --git a/src/build.h b/src/build.h
-index cca7e8d8181d..ec6594f714c0 100644
+index cca7e8d8181d..ca605e62e0e3 100644
--- a/src/build.h
+++ b/src/build.h
-@@ -119,7 +119,7 @@ struct CommandRunner {
+@@ -108,6 +108,7 @@ private:
+ struct CommandRunner {
+ virtual ~CommandRunner() {}
+ virtual bool CanRunMore() = 0;
++ virtual bool AcquireToken() = 0;
+ virtual bool StartCommand(Edge* edge) = 0;
+
+ /// The result of waiting for a command.
+@@ -119,7 +120,7 @@ struct CommandRunner {
bool success() const { return status == ExitSuccess; }
};
/// Wait for a command to complete, or return false if interrupted.
@@ -115,19 +171,32 @@ index cca7e8d8181d..ec6594f714c0 100644
virtual vector<Edge*> GetActiveEdges() { return vector<Edge*>(); }
virtual void Abort() {}
diff --git a/src/build_test.cc b/src/build_test.cc
-index 46ab33ef86c8..c1d3b047271a 100644
+index 46ab33ef86c8..a1022edcf546 100644
--- a/src/build_test.cc
+++ b/src/build_test.cc
-@@ -446,7 +446,7 @@ struct FakeCommandRunner : public CommandRunner {
+@@ -445,8 +445,9 @@ struct FakeCommandRunner : public CommandRunner {
+
// CommandRunner impl
virtual bool CanRunMore();
++ virtual bool AcquireToken();
virtual bool StartCommand(Edge* edge);
- virtual bool WaitForCommand(Result* result);
+ virtual bool WaitForCommand(Result* result, bool more_ready);
virtual vector<Edge*> GetActiveEdges();
virtual void Abort();
-@@ -575,7 +575,7 @@ bool FakeCommandRunner::StartCommand(Edge* edge) {
+@@ -547,6 +548,10 @@ bool FakeCommandRunner::CanRunMore() {
+ return last_command_ == NULL;
+ }
+
++bool FakeCommandRunner::AcquireToken() {
++ return true;
++}
++
+ bool FakeCommandRunner::StartCommand(Edge* edge) {
+ assert(!last_command_);
+ commands_ran_.push_back(edge->EvaluateCommand());
+@@ -575,7 +580,7 @@ bool FakeCommandRunner::StartCommand(Edge* edge) {
return true;
}