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
10namespace v8 {
11namespace internal {
12
13void RuntimeCallTimer::Start(RuntimeCallCounter* counter,
14 RuntimeCallTimer* parent) {
15 DCHECK(!IsStarted());
16 counter_ = counter;
17 parent_.SetValue(parent);
18 if (TracingFlags::runtime_stats.load(std::memory_order_relaxed) ==
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
28void RuntimeCallTimer::Pause(base::TimeTicks now) {
29 DCHECK(IsStarted());
30 elapsed_ += (now - start_ticks_);
31 start_ticks_ = base::TimeTicks();
32}
33
34void RuntimeCallTimer::Resume(base::TimeTicks now) {
35 DCHECK(!IsStarted());
36 start_ticks_ = now;
37}
38
39RuntimeCallTimer* 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
53void RuntimeCallTimer::CommitTimeToCounter() {
54 counter_->Add(elapsed_);
55 elapsed_ = base::TimeDelta();
56}
57
58bool RuntimeCallTimer::IsStarted() { return start_ticks_ != base::TimeTicks(); }
59
60RuntimeCallTimerScope::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