| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/profiler/tracing-cpu-profiler.h" |
| |
| #include "src/execution/isolate.h" |
| #include "src/init/v8.h" |
| #include "src/profiler/cpu-profiler.h" |
| #include "src/tracing/trace-event.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| TracingCpuProfilerImpl::TracingCpuProfilerImpl(Isolate* isolate) |
| : isolate_(isolate), profiling_enabled_(false) { |
| V8::GetCurrentPlatform()->GetTracingController()->AddTraceStateObserver(this); |
| } |
| |
| TracingCpuProfilerImpl::~TracingCpuProfilerImpl() { |
| StopProfiling(); |
| V8::GetCurrentPlatform()->GetTracingController()->RemoveTraceStateObserver( |
| this); |
| } |
| |
| void TracingCpuProfilerImpl::OnTraceEnabled() { |
| bool enabled; |
| TRACE_EVENT_CATEGORY_GROUP_ENABLED( |
| TRACE_DISABLED_BY_DEFAULT("v8.cpu_profiler"), &enabled); |
| if (!enabled) return; |
| profiling_enabled_ = true; |
| isolate_->RequestInterrupt( |
| [](v8::Isolate*, void* data) { |
| reinterpret_cast<TracingCpuProfilerImpl*>(data)->StartProfiling(); |
| }, |
| this); |
| } |
| |
| void TracingCpuProfilerImpl::OnTraceDisabled() { |
| base::MutexGuard lock(&mutex_); |
| if (!profiling_enabled_) return; |
| profiling_enabled_ = false; |
| isolate_->RequestInterrupt( |
| [](v8::Isolate*, void* data) { |
| reinterpret_cast<TracingCpuProfilerImpl*>(data)->StopProfiling(); |
| }, |
| this); |
| } |
| |
| void TracingCpuProfilerImpl::StartProfiling() { |
| base::MutexGuard lock(&mutex_); |
| if (!profiling_enabled_ || profiler_) return; |
| int sampling_interval_us = 100; |
| profiler_.reset(new CpuProfiler(isolate_, kDebugNaming)); |
| profiler_->set_sampling_interval( |
| base::TimeDelta::FromMicroseconds(sampling_interval_us)); |
| profiler_->StartProfiling("", {kLeafNodeLineNumbers}); |
| } |
| |
| void TracingCpuProfilerImpl::StopProfiling() { |
| base::MutexGuard lock(&mutex_); |
| if (!profiler_) return; |
| profiler_->StopProfiling(""); |
| profiler_.reset(); |
| } |
| |
| } // namespace internal |
| } // namespace v8 |