[C++] Make kati stats thread safe
diff --git a/stats.cc b/stats.cc
index 49a0ef3..847c61a 100644
--- a/stats.cc
+++ b/stats.cc
@@ -26,31 +26,35 @@
namespace {
vector<Stats*>* g_stats;
+thread_local double g_start_time = 0.0;
} // namespace
Stats::Stats(const char* name)
- : name_(name), start_time_(0), elapsed_(0), cnt_(0) {
+ : name_(name), elapsed_(0), cnt_(0) {
if (g_stats == NULL)
g_stats = new vector<Stats*>;
g_stats->push_back(this);
}
string Stats::String() const {
+ unique_lock<mutex> lock(mu_);
return StringPrintf("%s: %f / %d", name_, elapsed_, cnt_);
}
void Stats::Start() {
- CHECK(!start_time_);
+ CHECK(!g_start_time);
+ g_start_time = GetTime();
+ unique_lock<mutex> lock(mu_);
cnt_++;
- start_time_ = GetTime();
}
double Stats::End() {
- CHECK(start_time_);
- double e = GetTime() - start_time_;
+ CHECK(g_start_time);
+ double e = GetTime() - g_start_time;
+ g_start_time = 0;
+ unique_lock<mutex> lock(mu_);
elapsed_ += e;
- start_time_ = 0;
return e;
}
diff --git a/stats.h b/stats.h
index 7b259ae..63acc55 100644
--- a/stats.h
+++ b/stats.h
@@ -15,6 +15,7 @@
#ifndef STATS_H_
#define STATS_H_
+#include <mutex>
#include <string>
using namespace std;
@@ -32,9 +33,9 @@
friend class ScopedStatsRecorder;
const char* name_;
- double start_time_;
double elapsed_;
int cnt_;
+ mutable mutex mu_;
};
class ScopedStatsRecorder {