Home | History | Annotate | Download | only in src
      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