| Index: src/profiler/tracing-cpu-profiler.cc
|
| diff --git a/src/profiler/tracing-cpu-profiler.cc b/src/profiler/tracing-cpu-profiler.cc
|
| index b24ca2fd254ce655384195bf1847e4d00db87aa3..8b3122590500925c312d2a4377d4ede4617d8cb8 100644
|
| --- a/src/profiler/tracing-cpu-profiler.cc
|
| +++ b/src/profiler/tracing-cpu-profiler.cc
|
| @@ -4,8 +4,13 @@
|
|
|
| #include "src/profiler/tracing-cpu-profiler.h"
|
|
|
| +#include "src/profiler/cpu-profiler.h"
|
| +#include "src/tracing/trace-event.h"
|
| #include "src/v8.h"
|
|
|
| +#define PROFILER_TRACE_CATEGORY_ENABLED(cat) \
|
| + (*TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT(cat)))
|
| +
|
| namespace v8 {
|
|
|
| std::unique_ptr<TracingCpuProfiler> TracingCpuProfiler::Create(
|
| @@ -17,9 +22,57 @@ std::unique_ptr<TracingCpuProfiler> TracingCpuProfiler::Create(
|
|
|
| namespace internal {
|
|
|
| -TracingCpuProfilerImpl::TracingCpuProfilerImpl(Isolate* isolate) {}
|
| +TracingCpuProfilerImpl::TracingCpuProfilerImpl(Isolate* isolate)
|
| + : isolate_(isolate), profiling_enabled_(false) {
|
| + // Make sure tracing system notices profiler categories.
|
| + PROFILER_TRACE_CATEGORY_ENABLED("v8.cpu_profiler");
|
| + PROFILER_TRACE_CATEGORY_ENABLED("v8.cpu_profiler.hires");
|
| + V8::GetCurrentPlatform()->AddTraceStateObserver(this);
|
| +}
|
| +
|
| +TracingCpuProfilerImpl::~TracingCpuProfilerImpl() {
|
| + StopProfiling();
|
| + V8::GetCurrentPlatform()->RemoveTraceStateObserver(this);
|
| +}
|
| +
|
| +void TracingCpuProfilerImpl::OnTraceEnabled() {
|
| + if (!PROFILER_TRACE_CATEGORY_ENABLED("v8.cpu_profiler")) return;
|
| + profiling_enabled_ = true;
|
| + isolate_->RequestInterrupt(
|
| + [](v8::Isolate*, void* data) {
|
| + reinterpret_cast<TracingCpuProfilerImpl*>(data)->StartProfiling();
|
| + },
|
| + this);
|
| +}
|
|
|
| -TracingCpuProfilerImpl::~TracingCpuProfilerImpl() {}
|
| +void TracingCpuProfilerImpl::OnTraceDisabled() {
|
| + base::LockGuard<base::Mutex> 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::LockGuard<base::Mutex> lock(&mutex_);
|
| + if (!profiling_enabled_ || profiler_) return;
|
| + int sampling_interval_us =
|
| + PROFILER_TRACE_CATEGORY_ENABLED("v8.cpu_profiler.hires") ? 100 : 1000;
|
| + profiler_.reset(new CpuProfiler(isolate_));
|
| + profiler_->set_sampling_interval(
|
| + base::TimeDelta::FromMicroseconds(sampling_interval_us));
|
| + profiler_->StartProfiling("", true);
|
| +}
|
| +
|
| +void TracingCpuProfilerImpl::StopProfiling() {
|
| + base::LockGuard<base::Mutex> lock(&mutex_);
|
| + if (!profiler_) return;
|
| + profiler_->StopProfiling("");
|
| + profiler_.reset();
|
| +}
|
|
|
| } // namespace internal
|
| } // namespace v8
|
|
|