| Index: src/counters.h
|
| diff --git a/src/counters.h b/src/counters.h
|
| index 26b756624b7303163a1d9450da05c102b87568fa..5071609334d1267b23d0dedd76ee98dc66de3097 100644
|
| --- a/src/counters.h
|
| +++ b/src/counters.h
|
| @@ -29,19 +29,18 @@ class Counters;
|
|
|
| class StatsTable {
|
| public:
|
| - // Register an application-defined function where
|
| - // counters can be looked up. Note: Must be called on main thread,
|
| - // so that threaded stats counters can be created now.
|
| + // Register an application-defined function for recording
|
| + // subsequent counter statistics.
|
| void SetCounterFunction(CounterLookupCallback f);
|
|
|
| - // Register an application-defined function to create
|
| - // a histogram for passing to the AddHistogramSample function
|
| + // Register an application-defined function to create histograms for
|
| + // recording subsequent histogram samples.
|
| void SetCreateHistogramFunction(CreateHistogramCallback f) {
|
| create_histogram_function_ = f;
|
| }
|
|
|
| // Register an application-defined function to add a sample
|
| - // to a histogram created with CreateHistogram function
|
| + // to a histogram created with CreateHistogram function.
|
| void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) {
|
| add_histogram_sample_function_ = f;
|
| }
|
| @@ -82,15 +81,14 @@ class StatsTable {
|
| }
|
|
|
| private:
|
| + friend class Counters;
|
| +
|
| explicit StatsTable(Counters* counters);
|
|
|
| - Counters* counters_;
|
| CounterLookupCallback lookup_function_;
|
| CreateHistogramCallback create_histogram_function_;
|
| AddHistogramSampleCallback add_histogram_sample_function_;
|
|
|
| - friend class Counters;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(StatsTable);
|
| };
|
|
|
| @@ -121,13 +119,10 @@ class StatsCounterBase {
|
| // Internally, a counter represents a value in a row of a StatsTable.
|
| // The row has a 32bit value for each process/thread in the table and also
|
| // a name (stored in the table metadata). Since the storage location can be
|
| -// thread-specific, this class cannot be shared across threads.
|
| +// thread-specific, this class cannot be shared across threads. Note: This
|
| +// class is not thread safe.
|
| class StatsCounter : public StatsCounterBase {
|
| public:
|
| - StatsCounter() { }
|
| - StatsCounter(Counters* counters, const char* name)
|
| - : StatsCounterBase(counters, name), lookup_done_(false) {}
|
| -
|
| // Sets the counter to a specific value.
|
| void Set(int value) {
|
| if (int* loc = GetPtr()) SetLoc(loc, value);
|
| @@ -166,10 +161,16 @@ class StatsCounter : public StatsCounterBase {
|
| return loc;
|
| }
|
|
|
| + private:
|
| + friend class Counters;
|
| +
|
| + StatsCounter() {}
|
| + StatsCounter(Counters* counters, const char* name)
|
| + : StatsCounterBase(counters, name), lookup_done_(false) {}
|
| +
|
| // Reset the cached internal pointer.
|
| void Reset() { lookup_done_ = false; }
|
|
|
| - private:
|
| // Returns the cached address of this counter location.
|
| int* GetPtr() {
|
| if (lookup_done_) return ptr_;
|
| @@ -181,14 +182,9 @@ class StatsCounter : public StatsCounterBase {
|
| bool lookup_done_;
|
| };
|
|
|
| -// Thread safe version of StatsCounter. WARNING: Unlike StatsCounter,
|
| -// StatsCounterThreadSafe's constructor and method Reset() actually do
|
| -// the table lookup, and should be called from the main thread
|
| -// (i.e. not workers).
|
| +// Thread safe version of StatsCounter.
|
| class StatsCounterThreadSafe : public StatsCounterBase {
|
| public:
|
| - StatsCounterThreadSafe(Counters* counters, const char* name);
|
| -
|
| void Set(int Value);
|
| void Increment();
|
| void Increment(int value);
|
| @@ -199,60 +195,49 @@ class StatsCounterThreadSafe : public StatsCounterBase {
|
| DCHECK(ptr_ != NULL);
|
| return ptr_;
|
| }
|
| - void Reset() { GetPtr(); }
|
|
|
| private:
|
| - int* GetPtr();
|
| + friend class Counters;
|
| +
|
| + StatsCounterThreadSafe(Counters* counters, const char* name);
|
| + void Reset() { ptr_ = FindLocationInStatsTable(); }
|
|
|
| base::Mutex mutex_;
|
|
|
| - private:
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(StatsCounterThreadSafe);
|
| };
|
|
|
| -// A Histogram represents a dynamically created histogram in the StatsTable.
|
| -// It will be registered with the histogram system on first use.
|
| +// A Histogram represents a dynamically created histogram in the
|
| +// StatsTable. Note: This class is thread safe.
|
| class Histogram {
|
| public:
|
| - Histogram() { }
|
| - Histogram(const char* name, int min, int max, int num_buckets,
|
| - Counters* counters)
|
| - : name_(name),
|
| - min_(min),
|
| - max_(max),
|
| - num_buckets_(num_buckets),
|
| - histogram_(NULL),
|
| - lookup_done_(false),
|
| - counters_(counters) {}
|
| -
|
| // Add a single sample to this histogram.
|
| void AddSample(int sample);
|
|
|
| // Returns true if this histogram is enabled.
|
| - bool Enabled() {
|
| - return GetHistogram() != NULL;
|
| - }
|
| -
|
| - // Reset the cached internal pointer.
|
| - void Reset() {
|
| - lookup_done_ = false;
|
| - }
|
| + bool Enabled() { return histogram_ != nullptr; }
|
|
|
| const char* name() { return name_; }
|
|
|
| protected:
|
| - // Returns the handle to the histogram.
|
| - void* GetHistogram() {
|
| - if (!lookup_done_) {
|
| - lookup_done_ = true;
|
| - histogram_ = CreateHistogram();
|
| - }
|
| - return histogram_;
|
| - }
|
| + Histogram() {}
|
| + Histogram(const char* name, int min, int max, int num_buckets,
|
| + Counters* counters)
|
| + : name_(name),
|
| + min_(min),
|
| + max_(max),
|
| + num_buckets_(num_buckets),
|
| + histogram_(nullptr),
|
| + counters_(counters) {}
|
|
|
| Counters* counters() const { return counters_; }
|
|
|
| + // Reset the cached internal pointer.
|
| + void Reset() { histogram_ = CreateHistogram(); }
|
| +
|
| private:
|
| + friend class Counters;
|
| +
|
| void* CreateHistogram() const;
|
|
|
| const char* name_;
|
| @@ -260,7 +245,6 @@ class Histogram {
|
| int max_;
|
| int num_buckets_;
|
| void* histogram_;
|
| - bool lookup_done_;
|
| Counters* counters_;
|
| };
|
|
|
| @@ -272,7 +256,7 @@ class HistogramTimer : public Histogram {
|
| MICROSECOND
|
| };
|
|
|
| - HistogramTimer() {}
|
| + // Note: public for testing purposes only.
|
| HistogramTimer(const char* name, int min, int max, Resolution resolution,
|
| int num_buckets, Counters* counters)
|
| : Histogram(name, min, max, num_buckets, counters),
|
| @@ -295,8 +279,12 @@ class HistogramTimer : public Histogram {
|
| #endif
|
|
|
| private:
|
| + friend class Counters;
|
| +
|
| base::ElapsedTimer timer_;
|
| Resolution resolution_;
|
| +
|
| + HistogramTimer() {}
|
| };
|
|
|
| // Helper class for scoping a HistogramTimer.
|
| @@ -355,11 +343,6 @@ class HistogramTimerScope BASE_EMBEDDED {
|
| // events to be timed.
|
| class AggregatableHistogramTimer : public Histogram {
|
| public:
|
| - AggregatableHistogramTimer() {}
|
| - AggregatableHistogramTimer(const char* name, int min, int max,
|
| - int num_buckets, Counters* counters)
|
| - : Histogram(name, min, max, num_buckets, counters) {}
|
| -
|
| // Start/stop the "outer" scope.
|
| void Start() { time_ = base::TimeDelta(); }
|
| void Stop() { AddSample(static_cast<int>(time_.InMicroseconds())); }
|
| @@ -368,6 +351,13 @@ class AggregatableHistogramTimer : public Histogram {
|
| void Add(base::TimeDelta other) { time_ += other; }
|
|
|
| private:
|
| + friend class Counters;
|
| +
|
| + AggregatableHistogramTimer() {}
|
| + AggregatableHistogramTimer(const char* name, int min, int max,
|
| + int num_buckets, Counters* counters)
|
| + : Histogram(name, min, max, num_buckets, counters) {}
|
| +
|
| base::TimeDelta time_;
|
| };
|
|
|
| @@ -414,14 +404,7 @@ class AggregatedHistogramTimerScope {
|
| template <typename Histogram>
|
| class AggregatedMemoryHistogram {
|
| public:
|
| - AggregatedMemoryHistogram()
|
| - : is_initialized_(false),
|
| - start_ms_(0.0),
|
| - last_ms_(0.0),
|
| - aggregate_value_(0.0),
|
| - last_value_(0.0),
|
| - backing_histogram_(NULL) {}
|
| -
|
| + // Note: public for testing purposes only.
|
| explicit AggregatedMemoryHistogram(Histogram* backing_histogram)
|
| : AggregatedMemoryHistogram() {
|
| backing_histogram_ = backing_histogram;
|
| @@ -439,7 +422,17 @@ class AggregatedMemoryHistogram {
|
| void AddSample(double current_ms, double current_value);
|
|
|
| private:
|
| + friend class Counters;
|
| +
|
| + AggregatedMemoryHistogram()
|
| + : is_initialized_(false),
|
| + start_ms_(0.0),
|
| + last_ms_(0.0),
|
| + aggregate_value_(0.0),
|
| + last_value_(0.0),
|
| + backing_histogram_(NULL) {}
|
| double Aggregate(double current_ms, double current_value);
|
| +
|
| bool is_initialized_;
|
| double start_ms_;
|
| double last_ms_;
|
| @@ -536,14 +529,14 @@ class RuntimeCallCounter final {
|
| void Add(base::TimeDelta delta) { time_ += delta.InMicroseconds(); }
|
|
|
| private:
|
| + friend class RuntimeCallStats;
|
| +
|
| RuntimeCallCounter() {}
|
|
|
| const char* name_;
|
| int64_t count_;
|
| // Stored as int64_t so that its initialization can be deferred.
|
| int64_t time_;
|
| -
|
| - friend class RuntimeCallStats;
|
| };
|
|
|
| // RuntimeCallTimer is used to keep track of the stack of currently active
|
| @@ -1217,6 +1210,23 @@ class Counters : public std::enable_shared_from_this<Counters> {
|
| public:
|
| explicit Counters(Isolate* isolate);
|
|
|
| + // Register an application-defined function for recording
|
| + // subsequent counter statistics. Note: Must be called on the main
|
| + // thread.
|
| + void ResetCounterFunction(CounterLookupCallback f);
|
| +
|
| + // Register an application-defined function to create histograms for
|
| + // recording subsequent histogram samples. Note: Must be called on
|
| + // the main thread.
|
| + void ResetCreateHistogramFunction(CreateHistogramCallback f);
|
| +
|
| + // Register an application-defined function to add a sample
|
| + // to a histogram. Will be used in all subsequent sample additions.
|
| + // Note: Must be called on the main thread.
|
| + void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) {
|
| + stats_table_.SetAddHistogramSampleFunction(f);
|
| + }
|
| +
|
| #define HR(name, caption, min, max, num_buckets) \
|
| Histogram* name() { return &name##_; }
|
| HISTOGRAM_RANGE_LIST(HR)
|
| @@ -1330,20 +1340,31 @@ class Counters : public std::enable_shared_from_this<Counters> {
|
| };
|
| // clang-format on
|
|
|
| - void ResetCounters();
|
| - void ResetHistograms();
|
| - void InitializeHistograms();
|
| -
|
| RuntimeCallStats* runtime_call_stats() { return &runtime_call_stats_; }
|
|
|
| - StatsTable* stats_table() { return &stats_table_; }
|
| -
|
| - Isolate* isolate() { return isolate_; }
|
| -
|
| private:
|
| + friend class StatsTable;
|
| + friend class StatsCounterBase;
|
| + friend class Histogram;
|
| + friend class HistogramTimer;
|
| +
|
| Isolate* isolate_;
|
| StatsTable stats_table_;
|
|
|
| + int* FindLocation(const char* name) {
|
| + return stats_table_.FindLocation(name);
|
| + }
|
| +
|
| + void* CreateHistogram(const char* name, int min, int max, size_t buckets) {
|
| + return stats_table_.CreateHistogram(name, min, max, buckets);
|
| + }
|
| +
|
| + void AddHistogramSample(void* histogram, int sample) {
|
| + stats_table_.AddHistogramSample(histogram, sample);
|
| + }
|
| +
|
| + Isolate* isolate() { return isolate_; }
|
| +
|
| #define HR(name, caption, min, max, num_buckets) Histogram name##_;
|
| HISTOGRAM_RANGE_LIST(HR)
|
| #undef HR
|
|
|