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 (base::AsAtomic32::Relaxed_Load(&FLAG_runtime_stats) ==
19       v8::tracing::TracingCategoryObserver::ENABLED_BY_SAMPLING) {
20     return;
21   }
22   base::TimeTicks now = RuntimeCallTimer::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 = RuntimeCallTimer::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 
RuntimeCallTimerScope(Isolate * isolate,HeapObject * heap_object,RuntimeCallCounterId counter_id)60 RuntimeCallTimerScope::RuntimeCallTimerScope(Isolate* isolate,
61                                              HeapObject* heap_object,
62                                              RuntimeCallCounterId counter_id)
63     : RuntimeCallTimerScope(isolate, counter_id) {}
64 
65 }  // namespace internal
66 }  // namespace v8
67 
68 #endif  // V8_COUNTERS_INL_H_
69