 Chromium Code Reviews
 Chromium Code Reviews Issue 2918703002:
  Localize counter class member functions.  (Closed)
    
  
    Issue 2918703002:
  Localize counter class member functions.  (Closed) 
  | OLD | NEW | 
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef V8_COUNTERS_H_ | 5 #ifndef V8_COUNTERS_H_ | 
| 6 #define V8_COUNTERS_H_ | 6 #define V8_COUNTERS_H_ | 
| 7 | 7 | 
| 8 #include "include/v8.h" | 8 #include "include/v8.h" | 
| 9 #include "src/allocation.h" | 9 #include "src/allocation.h" | 
| 10 #include "src/base/atomic-utils.h" | 10 #include "src/base/atomic-utils.h" | 
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 | 29 | 
| 30 class StatsTable { | 30 class StatsTable { | 
| 31 public: | 31 public: | 
| 32 // Register an application-defined function where | 32 // Register an application-defined function where | 
| 33 // counters can be looked up. Note: Must be called on main thread, | 33 // counters can be looked up. Note: Must be called on main thread, | 
| 34 // so that threaded stats counters can be created now. | 34 // so that threaded stats counters can be created now. | 
| 35 void SetCounterFunction(CounterLookupCallback f); | 35 void SetCounterFunction(CounterLookupCallback f); | 
| 36 | 36 | 
| 37 // Register an application-defined function to create | 37 // Register an application-defined function to create | 
| 38 // a histogram for passing to the AddHistogramSample function | 38 // a histogram for passing to the AddHistogramSample function | 
| 39 void SetCreateHistogramFunction(CreateHistogramCallback f) { | 39 void SetCreateHistogramFunction(CreateHistogramCallback f); | 
| 40 create_histogram_function_ = f; | |
| 41 } | |
| 42 | 40 | 
| 43 // Register an application-defined function to add a sample | 41 // Register an application-defined function to add a sample | 
| 44 // to a histogram created with CreateHistogram function | 42 // to a histogram created with CreateHistogram function | 
| 45 void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) { | 43 void SetAddHistogramSampleFunction(AddHistogramSampleCallback f) { | 
| 46 add_histogram_sample_function_ = f; | 44 add_histogram_sample_function_ = f; | 
| 47 } | 45 } | 
| 48 | 46 | 
| 49 bool HasCounterFunction() const { | 47 bool HasCounterFunction() const { | 
| 50 return lookup_function_ != NULL; | 48 return lookup_function_ != NULL; | 
| 51 } | 49 } | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 int* FindLocationInStatsTable() const; | 112 int* FindLocationInStatsTable() const; | 
| 115 }; | 113 }; | 
| 116 | 114 | 
| 117 // StatsCounters are dynamically created values which can be tracked in | 115 // StatsCounters are dynamically created values which can be tracked in | 
| 118 // the StatsTable. They are designed to be lightweight to create and | 116 // the StatsTable. They are designed to be lightweight to create and | 
| 119 // easy to use. | 117 // easy to use. | 
| 120 // | 118 // | 
| 121 // Internally, a counter represents a value in a row of a StatsTable. | 119 // Internally, a counter represents a value in a row of a StatsTable. | 
| 122 // The row has a 32bit value for each process/thread in the table and also | 120 // The row has a 32bit value for each process/thread in the table and also | 
| 123 // a name (stored in the table metadata). Since the storage location can be | 121 // a name (stored in the table metadata). Since the storage location can be | 
| 124 // thread-specific, this class cannot be shared across threads. | 122 // thread-specific, this class cannot be shared across threads. Note: This | 
| 123 // class is not thread safe. | |
| 125 class StatsCounter : public StatsCounterBase { | 124 class StatsCounter : public StatsCounterBase { | 
| 126 public: | 125 public: | 
| 127 StatsCounter() { } | |
| 128 StatsCounter(Counters* counters, const char* name) | |
| 129 : StatsCounterBase(counters, name), lookup_done_(false) {} | |
| 130 | |
| 131 // Sets the counter to a specific value. | 126 // Sets the counter to a specific value. | 
| 132 void Set(int value) { | 127 void Set(int value) { | 
| 133 if (int* loc = GetPtr()) SetLoc(loc, value); | 128 if (int* loc = GetPtr()) SetLoc(loc, value); | 
| 134 } | 129 } | 
| 135 | 130 | 
| 136 // Increments the counter. | 131 // Increments the counter. | 
| 137 void Increment() { | 132 void Increment() { | 
| 138 if (int* loc = GetPtr()) IncrementLoc(loc); | 133 if (int* loc = GetPtr()) IncrementLoc(loc); | 
| 139 } | 134 } | 
| 140 | 135 | 
| (...skipping 18 matching lines...) Expand all Loading... | |
| 159 | 154 | 
| 160 // Get the internal pointer to the counter. This is used | 155 // Get the internal pointer to the counter. This is used | 
| 161 // by the code generator to emit code that manipulates a | 156 // by the code generator to emit code that manipulates a | 
| 162 // given counter without calling the runtime system. | 157 // given counter without calling the runtime system. | 
| 163 int* GetInternalPointer() { | 158 int* GetInternalPointer() { | 
| 164 int* loc = GetPtr(); | 159 int* loc = GetPtr(); | 
| 165 DCHECK(loc != NULL); | 160 DCHECK(loc != NULL); | 
| 166 return loc; | 161 return loc; | 
| 167 } | 162 } | 
| 168 | 163 | 
| 164 private: | |
| 165 StatsCounter() {} | |
| 166 StatsCounter(Counters* counters, const char* name) | |
| 167 : StatsCounterBase(counters, name), lookup_done_(false) {} | |
| 169 // Reset the cached internal pointer. | 168 // Reset the cached internal pointer. | 
| 170 void Reset() { lookup_done_ = false; } | 169 void Reset() { lookup_done_ = false; } | 
| 171 | 170 | 
| 172 private: | |
| 173 // Returns the cached address of this counter location. | 171 // Returns the cached address of this counter location. | 
| 174 int* GetPtr() { | 172 int* GetPtr() { | 
| 175 if (lookup_done_) return ptr_; | 173 if (lookup_done_) return ptr_; | 
| 176 lookup_done_ = true; | 174 lookup_done_ = true; | 
| 177 ptr_ = FindLocationInStatsTable(); | 175 ptr_ = FindLocationInStatsTable(); | 
| 178 return ptr_; | 176 return ptr_; | 
| 179 } | 177 } | 
| 180 | 178 | 
| 181 bool lookup_done_; | 179 bool lookup_done_; | 
| 180 | |
| 181 friend class Counters; | |
| 182 }; | 182 }; | 
| 183 | 183 | 
| 184 // Thread safe version of StatsCounter. WARNING: Unlike StatsCounter, | 184 // Thread safe version of StatsCounter. | 
| 185 // StatsCounterThreadSafe's constructor and method Reset() actually do | |
| 186 // the table lookup, and should be called from the main thread | |
| 187 // (i.e. not workers). | |
| 188 class StatsCounterThreadSafe : public StatsCounterBase { | 185 class StatsCounterThreadSafe : public StatsCounterBase { | 
| 189 public: | 186 public: | 
| 190 StatsCounterThreadSafe(Counters* counters, const char* name); | |
| 191 | |
| 192 void Set(int Value); | 187 void Set(int Value); | 
| 193 void Increment(); | 188 void Increment(); | 
| 194 void Increment(int value); | 189 void Increment(int value); | 
| 195 void Decrement(); | 190 void Decrement(); | 
| 196 void Decrement(int value); | 191 void Decrement(int value); | 
| 197 bool Enabled() { return ptr_ != NULL; } | 192 bool Enabled() { return ptr_ != NULL; } | 
| 198 int* GetInternalPointer() { | 193 int* GetInternalPointer() { | 
| 199 DCHECK(ptr_ != NULL); | 194 DCHECK(ptr_ != NULL); | 
| 200 return ptr_; | 195 return ptr_; | 
| 201 } | 196 } | 
| 202 void Reset() { GetPtr(); } | |
| 203 | 197 | 
| 204 private: | 198 private: | 
| 199 StatsCounterThreadSafe(Counters* counters, const char* name); | |
| 205 int* GetPtr(); | 200 int* GetPtr(); | 
| 
Mircea Trofin
2017/06/05 15:57:49
Why not delete GetPtr(), since it's only used in R
 
kschimpf
2017/06/05 17:38:52
Your right. It used to have multiple uses, but is
 | |
| 201 void Reset() { GetPtr(); } | |
| 206 | 202 | 
| 207 base::Mutex mutex_; | 203 base::Mutex mutex_; | 
| 208 | 204 | 
| 209 private: | 205 private: | 
| 206 friend class Counters; | |
| 210 DISALLOW_IMPLICIT_CONSTRUCTORS(StatsCounterThreadSafe); | 207 DISALLOW_IMPLICIT_CONSTRUCTORS(StatsCounterThreadSafe); | 
| 211 }; | 208 }; | 
| 212 | 209 | 
| 213 // A Histogram represents a dynamically created histogram in the StatsTable. | 210 // A Histogram represents a dynamically created histogram in the | 
| 214 // It will be registered with the histogram system on first use. | 211 // StatsTable. Note: This class is thread safe. | 
| 215 class Histogram { | 212 class Histogram { | 
| 216 public: | 213 public: | 
| 217 Histogram() { } | 214 // Add a single sample to this histogram. | 
| 215 void AddSample(int sample); | |
| 216 | |
| 217 // Returns true if this histogram is enabled. | |
| 218 bool Enabled() { return histogram_ != nullptr; } | |
| 219 | |
| 220 const char* name() { return name_; } | |
| 221 | |
| 222 protected: | |
| 223 Counters* counters() const { return counters_; } | |
| 224 | |
| 225 protected: | |
| 226 Histogram() {} | |
| 218 Histogram(const char* name, int min, int max, int num_buckets, | 227 Histogram(const char* name, int min, int max, int num_buckets, | 
| 219 Counters* counters) | 228 Counters* counters) | 
| 220 : name_(name), | 229 : name_(name), | 
| 221 min_(min), | 230 min_(min), | 
| 222 max_(max), | 231 max_(max), | 
| 223 num_buckets_(num_buckets), | 232 num_buckets_(num_buckets), | 
| 224 histogram_(NULL), | 233 histogram_(nullptr), | 
| 225 lookup_done_(false), | |
| 226 counters_(counters) {} | 234 counters_(counters) {} | 
| 227 | 235 | 
| 228 // Add a single sample to this histogram. | |
| 229 void AddSample(int sample); | |
| 230 | |
| 231 // Returns true if this histogram is enabled. | |
| 232 bool Enabled() { | |
| 233 return GetHistogram() != NULL; | |
| 234 } | |
| 235 | |
| 236 // Reset the cached internal pointer. | 236 // Reset the cached internal pointer. | 
| 237 void Reset() { | 237 void Reset() { histogram_ = CreateHistogram(); } | 
| 238 lookup_done_ = false; | |
| 239 } | |
| 240 | |
| 241 const char* name() { return name_; } | |
| 242 | |
| 243 protected: | |
| 244 // Returns the handle to the histogram. | |
| 245 void* GetHistogram() { | |
| 246 if (!lookup_done_) { | |
| 247 lookup_done_ = true; | |
| 248 histogram_ = CreateHistogram(); | |
| 249 } | |
| 250 return histogram_; | |
| 251 } | |
| 252 | |
| 253 Counters* counters() const { return counters_; } | |
| 254 | 238 | 
| 255 private: | 239 private: | 
| 256 void* CreateHistogram() const; | 240 void* CreateHistogram() const; | 
| 257 | 241 | 
| 258 const char* name_; | 242 const char* name_; | 
| 259 int min_; | 243 int min_; | 
| 260 int max_; | 244 int max_; | 
| 261 int num_buckets_; | 245 int num_buckets_; | 
| 262 void* histogram_; | 246 void* histogram_; | 
| 263 bool lookup_done_; | |
| 264 Counters* counters_; | 247 Counters* counters_; | 
| 248 | |
| 249 friend class Counters; | |
| 265 }; | 250 }; | 
| 266 | 251 | 
| 267 // A HistogramTimer allows distributions of results to be created. | 252 // A HistogramTimer allows distributions of results to be created. | 
| 268 class HistogramTimer : public Histogram { | 253 class HistogramTimer : public Histogram { | 
| 269 public: | 254 public: | 
| 270 enum Resolution { | 255 enum Resolution { | 
| 271 MILLISECOND, | 256 MILLISECOND, | 
| 272 MICROSECOND | 257 MICROSECOND | 
| 273 }; | 258 }; | 
| 274 | 259 | 
| 275 HistogramTimer() {} | 260 // Note: public for testing purposes only. | 
| 276 HistogramTimer(const char* name, int min, int max, Resolution resolution, | 261 HistogramTimer(const char* name, int min, int max, Resolution resolution, | 
| 277 int num_buckets, Counters* counters) | 262 int num_buckets, Counters* counters) | 
| 278 : Histogram(name, min, max, num_buckets, counters), | 263 : Histogram(name, min, max, num_buckets, counters), | 
| 279 resolution_(resolution) {} | 264 resolution_(resolution) {} | 
| 280 | 265 | 
| 281 // Start the timer. | 266 // Start the timer. | 
| 282 void Start(); | 267 void Start(); | 
| 283 | 268 | 
| 284 // Stop the timer and record the results. | 269 // Stop the timer and record the results. | 
| 285 void Stop(); | 270 void Stop(); | 
| 286 | 271 | 
| 287 // Returns true if the timer is running. | 272 // Returns true if the timer is running. | 
| 288 bool Running() { | 273 bool Running() { | 
| 289 return Enabled() && timer_.IsStarted(); | 274 return Enabled() && timer_.IsStarted(); | 
| 290 } | 275 } | 
| 291 | 276 | 
| 292 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. | 277 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. | 
| 293 #ifdef DEBUG | 278 #ifdef DEBUG | 
| 294 base::ElapsedTimer* timer() { return &timer_; } | 279 base::ElapsedTimer* timer() { return &timer_; } | 
| 295 #endif | 280 #endif | 
| 296 | 281 | 
| 297 private: | 282 private: | 
| 283 HistogramTimer() {} | |
| 284 | |
| 298 base::ElapsedTimer timer_; | 285 base::ElapsedTimer timer_; | 
| 299 Resolution resolution_; | 286 Resolution resolution_; | 
| 287 | |
| 288 friend class Counters; | |
| 300 }; | 289 }; | 
| 301 | 290 | 
| 302 // Helper class for scoping a HistogramTimer. | 291 // Helper class for scoping a HistogramTimer. | 
| 303 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the | 292 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the | 
| 304 // Parser is currently reentrant (when it throws an error, we call back | 293 // Parser is currently reentrant (when it throws an error, we call back | 
| 305 // into JavaScript and all bets are off), but ElapsedTimer is not | 294 // into JavaScript and all bets are off), but ElapsedTimer is not | 
| 306 // reentry-safe. Fix this properly and remove |allow_nesting|. | 295 // reentry-safe. Fix this properly and remove |allow_nesting|. | 
| 307 class HistogramTimerScope BASE_EMBEDDED { | 296 class HistogramTimerScope BASE_EMBEDDED { | 
| 308 public: | 297 public: | 
| 309 explicit HistogramTimerScope(HistogramTimer* timer, | 298 explicit HistogramTimerScope(HistogramTimer* timer, | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 // An example use might be to aggregate the time spent in lazy compilation | 337 // An example use might be to aggregate the time spent in lazy compilation | 
| 349 // while running a script. | 338 // while running a script. | 
| 350 // | 339 // | 
| 351 // Helpers: | 340 // Helpers: | 
| 352 // - AggregatingHistogramTimerScope, the "outer" scope within which | 341 // - AggregatingHistogramTimerScope, the "outer" scope within which | 
| 353 // times will be summed up. | 342 // times will be summed up. | 
| 354 // - AggregatedHistogramTimerScope, the "inner" scope which defines the | 343 // - AggregatedHistogramTimerScope, the "inner" scope which defines the | 
| 355 // events to be timed. | 344 // events to be timed. | 
| 356 class AggregatableHistogramTimer : public Histogram { | 345 class AggregatableHistogramTimer : public Histogram { | 
| 357 public: | 346 public: | 
| 358 AggregatableHistogramTimer() {} | |
| 359 AggregatableHistogramTimer(const char* name, int min, int max, | |
| 360 int num_buckets, Counters* counters) | |
| 361 : Histogram(name, min, max, num_buckets, counters) {} | |
| 362 | |
| 363 // Start/stop the "outer" scope. | 347 // Start/stop the "outer" scope. | 
| 364 void Start() { time_ = base::TimeDelta(); } | 348 void Start() { time_ = base::TimeDelta(); } | 
| 365 void Stop() { AddSample(static_cast<int>(time_.InMicroseconds())); } | 349 void Stop() { AddSample(static_cast<int>(time_.InMicroseconds())); } | 
| 366 | 350 | 
| 367 // Add a time value ("inner" scope). | 351 // Add a time value ("inner" scope). | 
| 368 void Add(base::TimeDelta other) { time_ += other; } | 352 void Add(base::TimeDelta other) { time_ += other; } | 
| 369 | 353 | 
| 370 private: | 354 private: | 
| 355 AggregatableHistogramTimer() {} | |
| 356 AggregatableHistogramTimer(const char* name, int min, int max, | |
| 357 int num_buckets, Counters* counters) | |
| 358 : Histogram(name, min, max, num_buckets, counters) {} | |
| 359 | |
| 371 base::TimeDelta time_; | 360 base::TimeDelta time_; | 
| 361 friend class Counters; | |
| 372 }; | 362 }; | 
| 373 | 363 | 
| 374 // A helper class for use with AggregatableHistogramTimer. This is the | 364 // A helper class for use with AggregatableHistogramTimer. This is the | 
| 375 // // outer-most timer scope used with an AggregatableHistogramTimer. It will | 365 // // outer-most timer scope used with an AggregatableHistogramTimer. It will | 
| 376 // // aggregate the information from the inner AggregatedHistogramTimerScope. | 366 // // aggregate the information from the inner AggregatedHistogramTimerScope. | 
| 377 class AggregatingHistogramTimerScope { | 367 class AggregatingHistogramTimerScope { | 
| 378 public: | 368 public: | 
| 379 explicit AggregatingHistogramTimerScope(AggregatableHistogramTimer* histogram) | 369 explicit AggregatingHistogramTimerScope(AggregatableHistogramTimer* histogram) | 
| 380 : histogram_(histogram) { | 370 : histogram_(histogram) { | 
| 381 histogram_->Start(); | 371 histogram_->Start(); | 
| (...skipping 25 matching lines...) Expand all Loading... | |
| 407 // backing histogram receives one sample every T ms, where the T is controlled | 397 // backing histogram receives one sample every T ms, where the T is controlled | 
| 408 // by the FLAG_histogram_interval. | 398 // by the FLAG_histogram_interval. | 
| 409 // | 399 // | 
| 410 // More formally: let F be a real-valued function that maps time to sample | 400 // More formally: let F be a real-valued function that maps time to sample | 
| 411 // values. We define F as a linear interpolation between adjacent samples. For | 401 // values. We define F as a linear interpolation between adjacent samples. For | 
| 412 // each time interval [x; x + T) the backing histogram gets one sample value | 402 // each time interval [x; x + T) the backing histogram gets one sample value | 
| 413 // that is the average of F(t) in the interval. | 403 // that is the average of F(t) in the interval. | 
| 414 template <typename Histogram> | 404 template <typename Histogram> | 
| 415 class AggregatedMemoryHistogram { | 405 class AggregatedMemoryHistogram { | 
| 416 public: | 406 public: | 
| 417 AggregatedMemoryHistogram() | 407 // Note: public for testing purposes only. | 
| 418 : is_initialized_(false), | |
| 419 start_ms_(0.0), | |
| 420 last_ms_(0.0), | |
| 421 aggregate_value_(0.0), | |
| 422 last_value_(0.0), | |
| 423 backing_histogram_(NULL) {} | |
| 424 | |
| 425 explicit AggregatedMemoryHistogram(Histogram* backing_histogram) | 408 explicit AggregatedMemoryHistogram(Histogram* backing_histogram) | 
| 426 : AggregatedMemoryHistogram() { | 409 : AggregatedMemoryHistogram() { | 
| 427 backing_histogram_ = backing_histogram; | 410 backing_histogram_ = backing_histogram; | 
| 428 } | 411 } | 
| 429 | 412 | 
| 430 // Invariants that hold before and after AddSample if | 413 // Invariants that hold before and after AddSample if | 
| 431 // is_initialized_ is true: | 414 // is_initialized_ is true: | 
| 432 // | 415 // | 
| 433 // 1) For we processed samples that came in before start_ms_ and sent the | 416 // 1) For we processed samples that came in before start_ms_ and sent the | 
| 434 // corresponding aggregated samples to backing histogram. | 417 // corresponding aggregated samples to backing histogram. | 
| 435 // 2) (last_ms_, last_value_) is the last received sample. | 418 // 2) (last_ms_, last_value_) is the last received sample. | 
| 436 // 3) last_ms_ < start_ms_ + FLAG_histogram_interval. | 419 // 3) last_ms_ < start_ms_ + FLAG_histogram_interval. | 
| 437 // 4) aggregate_value_ is the average of the function that is constructed by | 420 // 4) aggregate_value_ is the average of the function that is constructed by | 
| 438 // linearly interpolating samples received between start_ms_ and last_ms_. | 421 // linearly interpolating samples received between start_ms_ and last_ms_. | 
| 439 void AddSample(double current_ms, double current_value); | 422 void AddSample(double current_ms, double current_value); | 
| 440 | 423 | 
| 441 private: | 424 private: | 
| 425 AggregatedMemoryHistogram() | |
| 426 : is_initialized_(false), | |
| 427 start_ms_(0.0), | |
| 428 last_ms_(0.0), | |
| 429 aggregate_value_(0.0), | |
| 430 last_value_(0.0), | |
| 431 backing_histogram_(NULL) {} | |
| 432 | |
| 442 double Aggregate(double current_ms, double current_value); | 433 double Aggregate(double current_ms, double current_value); | 
| 443 bool is_initialized_; | 434 bool is_initialized_; | 
| 444 double start_ms_; | 435 double start_ms_; | 
| 445 double last_ms_; | 436 double last_ms_; | 
| 446 double aggregate_value_; | 437 double aggregate_value_; | 
| 447 double last_value_; | 438 double last_value_; | 
| 448 Histogram* backing_histogram_; | 439 Histogram* backing_histogram_; | 
| 440 | |
| 441 friend class Counters; | |
| 449 }; | 442 }; | 
| 450 | 443 | 
| 451 | 444 | 
| 452 template <typename Histogram> | 445 template <typename Histogram> | 
| 453 void AggregatedMemoryHistogram<Histogram>::AddSample(double current_ms, | 446 void AggregatedMemoryHistogram<Histogram>::AddSample(double current_ms, | 
| 454 double current_value) { | 447 double current_value) { | 
| 455 if (!is_initialized_) { | 448 if (!is_initialized_) { | 
| 456 aggregate_value_ = current_value; | 449 aggregate_value_ = current_value; | 
| 457 start_ms_ = current_ms; | 450 start_ms_ = current_ms; | 
| 458 last_value_ = current_value; | 451 last_value_ = current_value; | 
| (...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1323 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(COUNTER_ID) | 1316 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(COUNTER_ID) | 
| 1324 #undef COUNTER_ID | 1317 #undef COUNTER_ID | 
| 1325 #define COUNTER_ID(name) kCountOfCODE_AGE__##name, \ | 1318 #define COUNTER_ID(name) kCountOfCODE_AGE__##name, \ | 
| 1326 kSizeOfCODE_AGE__##name, | 1319 kSizeOfCODE_AGE__##name, | 
| 1327 CODE_AGE_LIST_COMPLETE(COUNTER_ID) | 1320 CODE_AGE_LIST_COMPLETE(COUNTER_ID) | 
| 1328 #undef COUNTER_ID | 1321 #undef COUNTER_ID | 
| 1329 stats_counter_count | 1322 stats_counter_count | 
| 1330 }; | 1323 }; | 
| 1331 // clang-format on | 1324 // clang-format on | 
| 1332 | 1325 | 
| 1333 void ResetCounters(); | |
| 1334 void ResetHistograms(); | |
| 1335 void InitializeHistograms(); | |
| 1336 | |
| 1337 RuntimeCallStats* runtime_call_stats() { return &runtime_call_stats_; } | 1326 RuntimeCallStats* runtime_call_stats() { return &runtime_call_stats_; } | 
| 1338 | 1327 | 
| 1339 StatsTable* stats_table() { return &stats_table_; } | 1328 StatsTable* stats_table() { return &stats_table_; } | 
| 1340 | 1329 | 
| 1341 Isolate* isolate() { return isolate_; } | 1330 Isolate* isolate() { return isolate_; } | 
| 1342 | 1331 | 
| 1343 private: | 1332 private: | 
| 1344 Isolate* isolate_; | 1333 Isolate* isolate_; | 
| 1345 StatsTable stats_table_; | 1334 StatsTable stats_table_; | 
| 1346 | 1335 | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1402 #undef SC | 1391 #undef SC | 
| 1403 | 1392 | 
| 1404 #define SC(name) \ | 1393 #define SC(name) \ | 
| 1405 StatsCounter size_of_CODE_AGE_##name##_; \ | 1394 StatsCounter size_of_CODE_AGE_##name##_; \ | 
| 1406 StatsCounter count_of_CODE_AGE_##name##_; | 1395 StatsCounter count_of_CODE_AGE_##name##_; | 
| 1407 CODE_AGE_LIST_COMPLETE(SC) | 1396 CODE_AGE_LIST_COMPLETE(SC) | 
| 1408 #undef SC | 1397 #undef SC | 
| 1409 | 1398 | 
| 1410 RuntimeCallStats runtime_call_stats_; | 1399 RuntimeCallStats runtime_call_stats_; | 
| 1411 | 1400 | 
| 1401 friend class StatsTable; | |
| 1402 void ResetCounters(); | |
| 1403 void ResetHistograms(); | |
| 1404 | |
| 1412 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 1405 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 
| 1413 }; | 1406 }; | 
| 1414 | 1407 | 
| 1415 } // namespace internal | 1408 } // namespace internal | 
| 1416 } // namespace v8 | 1409 } // namespace v8 | 
| 1417 | 1410 | 
| 1418 #endif // V8_COUNTERS_H_ | 1411 #endif // V8_COUNTERS_H_ | 
| OLD | NEW |