1 // Copyright 2016 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_COUNTERS_INL_H_ 6 #define V8_COUNTERS_INL_H_ 7 8 #include "src/counters.h" 9 10 namespace v8 { 11 namespace internal { 12 13 void RuntimeCallTimer::Start(RuntimeCallCounter* counter, 14 RuntimeCallTimer* parent) { 15 DCHECK(!IsStarted()); 16 counter_ = counter; 17 parent_.SetValue(parent); 18 if (FLAG_runtime_stats == 19 v8::tracing::TracingCategoryObserver::ENABLED_BY_SAMPLING) { 20 return; 21 } 22 base::TimeTicks now = Now(); 23 if (parent) parent->Pause(now); 24 Resume(now); 25 DCHECK(IsStarted()); 26 } 27 28 void RuntimeCallTimer::Pause(base::TimeTicks now) { 29 DCHECK(IsStarted()); 30 elapsed_ += (now - start_ticks_); 31 start_ticks_ = base::TimeTicks(); 32 } 33 34 void RuntimeCallTimer::Resume(base::TimeTicks now) { 35 DCHECK(!IsStarted()); 36 start_ticks_ = now; 37 } 38 39 RuntimeCallTimer* RuntimeCallTimer::Stop() { 40 if (!IsStarted()) return parent(); 41 base::TimeTicks now = Now(); 42 Pause(now); 43 counter_->Increment(); 44 CommitTimeToCounter(); 45 46 RuntimeCallTimer* parent_timer = parent(); 47 if (parent_timer) { 48 parent_timer->Resume(now); 49 } 50 return parent_timer; 51 } 52 53 void RuntimeCallTimer::CommitTimeToCounter() { 54 counter_->Add(elapsed_); 55 elapsed_ = base::TimeDelta(); 56 } 57 58 bool RuntimeCallTimer::IsStarted() { return start_ticks_ != base::TimeTicks(); } 59 60 base::TimeTicks RuntimeCallTimer::Now() { 61 return base::TimeTicks::HighResolutionNow(); 62 } 63 64 RuntimeCallTimerScope::RuntimeCallTimerScope( 65 Isolate* isolate, RuntimeCallStats::CounterId counter_id) { 66 if (V8_UNLIKELY(FLAG_runtime_stats)) { 67 Initialize(isolate->counters()->runtime_call_stats(), counter_id); 68 } 69 } 70 71 RuntimeCallTimerScope::RuntimeCallTimerScope( 72 HeapObject* heap_object, RuntimeCallStats::CounterId counter_id) { 73 RuntimeCallTimerScope(heap_object->GetIsolate(), counter_id); 74 } 75 76 RuntimeCallTimerScope::RuntimeCallTimerScope( 77 RuntimeCallStats* stats, RuntimeCallStats::CounterId counter_id) { 78 if (V8_UNLIKELY(FLAG_runtime_stats)) { 79 Initialize(stats, counter_id); 80 } 81 } 82 83 } // namespace internal 84 } // namespace v8 85 86 #endif // V8_COUNTERS_INL_H_ 87