Index: src/counters.h |
diff --git a/src/counters.h b/src/counters.h |
index 681ac59b1cce9a87fc57e042b75162d009692580..e28eae4037724d93ac5a137f21ea597e51d37486 100644 |
--- a/src/counters.h |
+++ b/src/counters.h |
@@ -492,13 +492,14 @@ struct RuntimeCallCounter { |
// timers used for properly measuring the own time of a RuntimeCallCounter. |
class RuntimeCallTimer { |
public: |
- inline void Initialize(RuntimeCallCounter* counter, |
- RuntimeCallTimer* parent) { |
+ RuntimeCallTimer() {} |
+ |
+ private: |
+ friend class RuntimeCallStats; |
+ |
+ inline void Start(RuntimeCallCounter* counter, RuntimeCallTimer* parent) { |
counter_ = counter; |
parent_ = parent; |
- } |
- |
- inline void Start() { |
timer_.Start(); |
counter_->count++; |
} |
@@ -508,22 +509,21 @@ class RuntimeCallTimer { |
timer_.Stop(); |
counter_->time += delta; |
if (parent_ != NULL) { |
- parent_->AdjustForSubTimer(delta); |
+ // Adjust parent timer so that it does not include sub timer's time. |
+ parent_->counter_->time -= delta; |
} |
return parent_; |
} |
- inline void AdjustForSubTimer(base::TimeDelta delta) { |
- counter_->time -= delta; |
- } |
- |
- private: |
- RuntimeCallCounter* counter_; |
- RuntimeCallTimer* parent_; |
+ RuntimeCallCounter* counter_ = nullptr; |
+ RuntimeCallTimer* parent_ = nullptr; |
base::ElapsedTimer timer_; |
}; |
-struct RuntimeCallStats { |
+class RuntimeCallStats { |
+ public: |
+ typedef RuntimeCallCounter RuntimeCallStats::*CounterId; |
+ |
// Dummy counter for the unexpected stub miss. |
RuntimeCallCounter UnexpectedStubMiss = |
RuntimeCallCounter("UnexpectedStubMiss"); |
@@ -539,42 +539,43 @@ struct RuntimeCallStats { |
BUILTIN_LIST_C(CALL_BUILTIN_COUNTER) |
#undef CALL_BUILTIN_COUNTER |
- // Counter to track recursive time events. |
- RuntimeCallTimer* current_timer_ = NULL; |
- |
// Starting measuring the time for a function. This will establish the |
// connection to the parent counter for properly calculating the own times. |
- void Enter(RuntimeCallCounter* counter); |
- void Enter(RuntimeCallTimer* timer); |
+ static void Enter(Isolate* isolate, RuntimeCallTimer* timer, |
+ CounterId counter_id); |
+ |
// Leave a scope for a measured runtime function. This will properly add |
// the time delta to the current_counter and subtract the delta from its |
// parent. |
- void Leave(); |
- void Leave(RuntimeCallTimer* timer); |
- |
- RuntimeCallTimer* current_timer() { return current_timer_; } |
+ static void Leave(Isolate* isolate, RuntimeCallTimer* timer); |
void Reset(); |
void Print(std::ostream& os); |
RuntimeCallStats() { Reset(); } |
+ |
+ private: |
+ // Counter to track recursive time events. |
+ RuntimeCallTimer* current_timer_ = NULL; |
}; |
// A RuntimeCallTimerScopes wraps around a RuntimeCallTimer to measure the |
// the time of C++ scope. |
class RuntimeCallTimerScope { |
public: |
- inline explicit RuntimeCallTimerScope(Isolate* isolate, |
- RuntimeCallCounter* counter) { |
- if (FLAG_runtime_call_stats) Enter(isolate, counter); |
+ inline explicit RuntimeCallTimerScope( |
+ Isolate* isolate, RuntimeCallStats::CounterId counter_id) { |
+ if (V8_UNLIKELY(FLAG_runtime_call_stats)) { |
+ isolate_ = isolate; |
+ RuntimeCallStats::Enter(isolate_, &timer_, counter_id); |
+ } |
} |
inline ~RuntimeCallTimerScope() { |
- if (FLAG_runtime_call_stats) Leave(); |
+ if (V8_UNLIKELY(FLAG_runtime_call_stats)) { |
+ RuntimeCallStats::Leave(isolate_, &timer_); |
+ } |
} |
- void Enter(Isolate* isolate, RuntimeCallCounter* counter); |
- void Leave(); |
- |
private: |
Isolate* isolate_; |
RuntimeCallTimer timer_; |