summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2012-09-18 22:08:23 (GMT)
committerEvan Martin <martine@danga.com>2012-09-18 22:08:23 (GMT)
commite6c8bd91c22b64374aa7a1c84ae0a462f4fe2896 (patch)
tree06f8a0aceff8520d895aef40aaeb262ff364fe6c
parent75f1b00cc3b1685e7c530208d0e328c3f80a4c9b (diff)
parentfd5260f3cc67b284558d0cfcb89cb3b157c88e1a (diff)
downloadNinja-e6c8bd91c22b64374aa7a1c84ae0a462f4fe2896.zip
Ninja-e6c8bd91c22b64374aa7a1c84ae0a462f4fe2896.tar.gz
Ninja-e6c8bd91c22b64374aa7a1c84ae0a462f4fe2896.tar.bz2
Merge pull request #419 from syntheticpp/rate-buffer-size
Buffer size passed to snprintf is wrong in rate code
-rw-r--r--src/build.cc5
-rw-r--r--src/build.h28
2 files changed, 15 insertions, 18 deletions
diff --git a/src/build.cc b/src/build.cc
index 5a0c3b3..a2f2720 100644
--- a/src/build.cc
+++ b/src/build.cc
@@ -17,6 +17,7 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
+#include <functional>
#ifdef _WIN32
#include <windows.h>
@@ -180,14 +181,14 @@ string BuildStatus::FormatProgressStatus(
// Overall finished edges per second.
case 'o':
overall_rate_.UpdateRate(finished_edges_);
- overall_rate_.snprinfRate(buf, "%.1f");
+ snprinfRate(overall_rate_.rate(), buf, "%.1f");
out += buf;
break;
// Current rate, average over the last '-j' jobs.
case 'c':
current_rate_.UpdateRate(finished_edges_);
- current_rate_.snprinfRate(buf, "%.1f");
+ snprinfRate(current_rate_.rate(), buf, "%.1f");
out += buf;
break;
diff --git a/src/build.h b/src/build.h
index 0902a4c..8876d88 100644
--- a/src/build.h
+++ b/src/build.h
@@ -200,31 +200,33 @@ struct BuildStatus {
/// The custom progress status format to use.
const char* progress_status_format_;
+ template<size_t S>
+ void snprinfRate(double rate, char(&buf)[S], const char* format) const {
+ if (rate == -1) snprintf(buf, S, "?");
+ else snprintf(buf, S, format, rate);
+ }
+
struct RateInfo {
RateInfo() : rate_(-1) {}
void Restart() { stopwatch_.Restart(); }
+ double rate() { return rate_; }
void UpdateRate(int edges) {
if (edges && stopwatch_.Elapsed())
rate_ = edges / stopwatch_.Elapsed();
}
- template<class T>
- void snprinfRate(T buf, const char* format) {
- if (rate_ == -1) snprintf(buf, sizeof(buf), "?");
- else snprintf(buf, sizeof(buf), format, rate_);
- }
-
private:
- Stopwatch stopwatch_;
double rate_;
+ Stopwatch stopwatch_;
};
struct SlidingRateInfo {
- SlidingRateInfo(int n) : N(n), last_update_(-1), rate_(-1) {}
+ SlidingRateInfo(int n) : rate_(-1), N(n), last_update_(-1) {}
void Restart() { stopwatch_.Restart(); }
+ double rate() { return rate_; }
void UpdateRate(int update_hint) {
if (update_hint == last_update_)
@@ -238,18 +240,12 @@ struct BuildStatus {
rate_ = times_.size() / (times_.back() - times_.front());
}
- template<class T>
- void snprinfRate(T buf, const char* format) {
- if (rate_ == -1) snprintf(buf, sizeof(buf), "?");
- else snprintf(buf, sizeof(buf), format, rate_);
- }
-
private:
+ double rate_;
+ Stopwatch stopwatch_;
const size_t N;
std::queue<double> times_;
- Stopwatch stopwatch_;
int last_update_;
- double rate_;
};
mutable RateInfo overall_rate_;