• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Start(RuntimeCallCounter * counter,RuntimeCallTimer * parent)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 
Pause(base::TimeTicks now)28 void RuntimeCallTimer::Pause(base::TimeTicks now) {
29   DCHECK(IsStarted());
30   elapsed_ += (now - start_ticks_);
31   start_ticks_ = base::TimeTicks();
32 }
33 
Resume(base::TimeTicks now)34 void RuntimeCallTimer::Resume(base::TimeTicks now) {
35   DCHECK(!IsStarted());
36   start_ticks_ = now;
37 }
38 
Stop()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 
CommitTimeToCounter()53 void RuntimeCallTimer::CommitTimeToCounter() {
54   counter_->Add(elapsed_);
55   elapsed_ = base::TimeDelta();
56 }
57 
IsStarted()58 bool RuntimeCallTimer::IsStarted() { return start_ticks_ != base::TimeTicks(); }
59 
Now()60 base::TimeTicks RuntimeCallTimer::Now() {
61   return base::TimeTicks::HighResolutionNow();
62 }
63 
RuntimeCallTimerScope(Isolate * isolate,RuntimeCallStats::CounterId counter_id)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 
RuntimeCallTimerScope(HeapObject * heap_object,RuntimeCallStats::CounterId counter_id)71 RuntimeCallTimerScope::RuntimeCallTimerScope(
72     HeapObject* heap_object, RuntimeCallStats::CounterId counter_id) {
73   RuntimeCallTimerScope(heap_object->GetIsolate(), counter_id);
74 }
75 
RuntimeCallTimerScope(RuntimeCallStats * stats,RuntimeCallStats::CounterId counter_id)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