// Copyright 2012 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_LOGGING_COUNTERS_H_ #define V8_LOGGING_COUNTERS_H_ #include <memory> #include "include/v8-callbacks.h" #include "src/base/atomic-utils.h" #include "src/base/platform/elapsed-timer.h" #include "src/base/platform/time.h" #include "src/common/globals.h" #include "src/logging/counters-definitions.h" #include "src/logging/runtime-call-stats.h" #include "src/objects/code-kind.h" #include "src/objects/objects.h" #include "src/utils/allocation.h" namespace v8 { namespace internal { // StatsCounters is an interface for plugging into external // counters for monitoring. Counters can be looked up and // manipulated by name. class Counters; class Isolate; class StatsTable { … }; // StatsCounters are dynamically created values which can be tracked in the // StatsTable. They are designed to be lightweight to create and easy to use. // // 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. // This class is thread-safe. class StatsCounter { … }; // A Histogram represents a dynamically created histogram in the // StatsTable. Note: This class is thread safe. class Histogram { … }; // Dummy classes for better visiting. class PercentageHistogram : public Histogram { … }; class LegacyMemoryHistogram : public Histogram { … }; enum class TimedHistogramResolution { … }; // A thread safe histogram timer. class TimedHistogram : public Histogram { … }; class NestedTimedHistogramScope; class PauseNestedTimedHistogramScope; // For use with the NestedTimedHistogramScope. 'Nested' here means that scopes // may have nested lifetimes while still correctly accounting for time, e.g.: // // void f() { // NestedTimedHistogramScope timer(...); // ... // f(); // Recursive call. // } class NestedTimedHistogram : public TimedHistogram { … }; // A histogram timer that can aggregate events within a larger scope. // // Intended use of this timer is to have an outer (aggregating) and an inner // (to be aggregated) scope, where the inner scope measure the time of events, // and all those inner scope measurements will be summed up by the outer scope. // An example use might be to aggregate the time spent in lazy compilation // while running a script. // // Helpers: // - AggregatingHistogramTimerScope, the "outer" scope within which // times will be summed up. // - AggregatedHistogramTimerScope, the "inner" scope which defines the // events to be timed. class AggregatableHistogramTimer : public Histogram { … }; // A helper class for use with AggregatableHistogramTimer. This is the // // outer-most timer scope used with an AggregatableHistogramTimer. It will // // aggregate the information from the inner AggregatedHistogramTimerScope. class V8_NODISCARD AggregatingHistogramTimerScope { … }; // A helper class for use with AggregatableHistogramTimer, the "inner" scope // // which defines the events to be timed. class V8_NODISCARD AggregatedHistogramTimerScope { … }; // AggretatedMemoryHistogram collects (time, value) sample pairs and turns // them into time-uniform samples for the backing historgram, such that the // backing histogram receives one sample every T ms, where the T is controlled // by the v8_flags.histogram_interval. // // More formally: let F be a real-valued function that maps time to sample // values. We define F as a linear interpolation between adjacent samples. For // each time interval [x; x + T) the backing histogram gets one sample value // that is the average of F(t) in the interval. template <typename Histogram> class AggregatedMemoryHistogram { … }; template <typename Histogram> void AggregatedMemoryHistogram<Histogram>::AddSample(double current_ms, double current_value) { … } template <typename Histogram> double AggregatedMemoryHistogram<Histogram>::Aggregate(double current_ms, double current_value) { … } // This file contains all the v8 counters that are in use. class Counters : public std::enable_shared_from_this<Counters> { … }; class CountersVisitor { … }; class CountersInitializer : public CountersVisitor { … }; class StatsCounterResetter : public CountersVisitor { … }; class HistogramResetter : public CountersVisitor { … }; } // namespace internal } // namespace v8 #endif // V8_LOGGING_COUNTERS_H_