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 |