| Index: third_party/WebKit/Source/platform/v8_inspector/V8ProfilerAgentImpl.cpp
|
| diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8ProfilerAgentImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8ProfilerAgentImpl.cpp
|
| deleted file mode 100644
|
| index e7ec3febf6585a64f0f8ce151b40cd79a07bba53..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/platform/v8_inspector/V8ProfilerAgentImpl.cpp
|
| +++ /dev/null
|
| @@ -1,337 +0,0 @@
|
| -// Copyright 2015 The Chromium 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 "platform/v8_inspector/V8ProfilerAgentImpl.h"
|
| -
|
| -#include "platform/v8_inspector/Atomics.h"
|
| -#include "platform/v8_inspector/StringUtil.h"
|
| -#include "platform/v8_inspector/V8Debugger.h"
|
| -#include "platform/v8_inspector/V8InspectorImpl.h"
|
| -#include "platform/v8_inspector/V8InspectorSessionImpl.h"
|
| -#include "platform/v8_inspector/V8StackTraceImpl.h"
|
| -#include "platform/v8_inspector/protocol/Protocol.h"
|
| -#include <v8-profiler.h>
|
| -
|
| -#include <vector>
|
| -
|
| -#define ENSURE_V8_VERSION(major, minor) \
|
| - (V8_MAJOR_VERSION * 1000 + V8_MINOR_VERSION >= (major) * 1000 + (minor))
|
| -
|
| -namespace v8_inspector {
|
| -
|
| -namespace ProfilerAgentState {
|
| -static const char samplingInterval[] = "samplingInterval";
|
| -static const char userInitiatedProfiling[] = "userInitiatedProfiling";
|
| -static const char profilerEnabled[] = "profilerEnabled";
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -std::unique_ptr<protocol::Array<protocol::Profiler::PositionTickInfo>> buildInspectorObjectForPositionTicks(const v8::CpuProfileNode* node)
|
| -{
|
| - unsigned lineCount = node->GetHitLineCount();
|
| - if (!lineCount)
|
| - return nullptr;
|
| - auto array = protocol::Array<protocol::Profiler::PositionTickInfo>::create();
|
| - std::vector<v8::CpuProfileNode::LineTick> entries(lineCount);
|
| - if (node->GetLineTicks(&entries[0], lineCount)) {
|
| - for (unsigned i = 0; i < lineCount; i++) {
|
| - std::unique_ptr<protocol::Profiler::PositionTickInfo> line = protocol::Profiler::PositionTickInfo::create()
|
| - .setLine(entries[i].line)
|
| - .setTicks(entries[i].hit_count).build();
|
| - array->addItem(std::move(line));
|
| - }
|
| - }
|
| - return array;
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Profiler::ProfileNode> buildInspectorObjectFor(v8::Isolate* isolate, const v8::CpuProfileNode* node)
|
| -{
|
| - v8::HandleScope handleScope(isolate);
|
| - auto callFrame = protocol::Runtime::CallFrame::create()
|
| - .setFunctionName(toProtocolString(node->GetFunctionName()))
|
| - .setScriptId(String16::fromInteger(node->GetScriptId()))
|
| - .setUrl(toProtocolString(node->GetScriptResourceName()))
|
| - .setLineNumber(node->GetLineNumber() - 1)
|
| - .setColumnNumber(node->GetColumnNumber() - 1)
|
| - .build();
|
| - auto result = protocol::Profiler::ProfileNode::create()
|
| - .setCallFrame(std::move(callFrame))
|
| - .setHitCount(node->GetHitCount())
|
| - .setId(node->GetNodeId()).build();
|
| -
|
| - const int childrenCount = node->GetChildrenCount();
|
| - if (childrenCount) {
|
| - auto children = protocol::Array<int>::create();
|
| - for (int i = 0; i < childrenCount; i++)
|
| - children->addItem(node->GetChild(i)->GetNodeId());
|
| - result->setChildren(std::move(children));
|
| - }
|
| -
|
| - const char* deoptReason = node->GetBailoutReason();
|
| - if (deoptReason && deoptReason[0] && strcmp(deoptReason, "no reason"))
|
| - result->setDeoptReason(deoptReason);
|
| -
|
| - auto positionTicks = buildInspectorObjectForPositionTicks(node);
|
| - if (positionTicks)
|
| - result->setPositionTicks(std::move(positionTicks));
|
| -
|
| - return result;
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Array<int>> buildInspectorObjectForSamples(v8::CpuProfile* v8profile)
|
| -{
|
| - auto array = protocol::Array<int>::create();
|
| - int count = v8profile->GetSamplesCount();
|
| - for (int i = 0; i < count; i++)
|
| - array->addItem(v8profile->GetSample(i)->GetNodeId());
|
| - return array;
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Array<int>> buildInspectorObjectForTimestamps(v8::CpuProfile* v8profile)
|
| -{
|
| - auto array = protocol::Array<int>::create();
|
| - int count = v8profile->GetSamplesCount();
|
| - uint64_t lastTime = v8profile->GetStartTime();
|
| - for (int i = 0; i < count; i++) {
|
| - uint64_t ts = v8profile->GetSampleTimestamp(i);
|
| - array->addItem(static_cast<int>(ts - lastTime));
|
| - lastTime = ts;
|
| - }
|
| - return array;
|
| -}
|
| -
|
| -void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, protocol::Array<protocol::Profiler::ProfileNode>* list)
|
| -{
|
| - list->addItem(buildInspectorObjectFor(isolate, node));
|
| - const int childrenCount = node->GetChildrenCount();
|
| - for (int i = 0; i < childrenCount; i++)
|
| - flattenNodesTree(isolate, node->GetChild(i), list);
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Profiler::Profile> createCPUProfile(v8::Isolate* isolate, v8::CpuProfile* v8profile)
|
| -{
|
| - auto nodes = protocol::Array<protocol::Profiler::ProfileNode>::create();
|
| - flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get());
|
| - return protocol::Profiler::Profile::create()
|
| - .setNodes(std::move(nodes))
|
| - .setStartTime(static_cast<double>(v8profile->GetStartTime()))
|
| - .setEndTime(static_cast<double>(v8profile->GetEndTime()))
|
| - .setSamples(buildInspectorObjectForSamples(v8profile))
|
| - .setTimeDeltas(buildInspectorObjectForTimestamps(v8profile)).build();
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Debugger::Location> currentDebugLocation(V8InspectorImpl* inspector)
|
| -{
|
| - std::unique_ptr<V8StackTraceImpl> callStack = inspector->debugger()->captureStackTrace(false /* fullStack */);
|
| - auto location = protocol::Debugger::Location::create()
|
| - .setScriptId(toString16(callStack->topScriptId()))
|
| - .setLineNumber(callStack->topLineNumber()).build();
|
| - location->setColumnNumber(callStack->topColumnNumber());
|
| - return location;
|
| -}
|
| -
|
| -volatile int s_lastProfileId = 0;
|
| -
|
| -} // namespace
|
| -
|
| -class V8ProfilerAgentImpl::ProfileDescriptor {
|
| -public:
|
| - ProfileDescriptor(const String16& id, const String16& title)
|
| - : m_id(id)
|
| - , m_title(title) { }
|
| - String16 m_id;
|
| - String16 m_title;
|
| -};
|
| -
|
| -V8ProfilerAgentImpl::V8ProfilerAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state)
|
| - : m_session(session)
|
| - , m_isolate(m_session->inspector()->isolate())
|
| - , m_profiler(nullptr)
|
| - , m_state(state)
|
| - , m_frontend(frontendChannel)
|
| - , m_enabled(false)
|
| - , m_recordingCPUProfile(false)
|
| -{
|
| -}
|
| -
|
| -V8ProfilerAgentImpl::~V8ProfilerAgentImpl()
|
| -{
|
| -#if ENSURE_V8_VERSION(5, 4)
|
| - if (m_profiler)
|
| - m_profiler->Dispose();
|
| -#endif
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::consoleProfile(const String16& title)
|
| -{
|
| - if (!m_enabled)
|
| - return;
|
| - String16 id = nextProfileId();
|
| - m_startedProfiles.push_back(ProfileDescriptor(id, title));
|
| - startProfiling(id);
|
| - m_frontend.consoleProfileStarted(id, currentDebugLocation(m_session->inspector()), title);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title)
|
| -{
|
| - if (!m_enabled)
|
| - return;
|
| - String16 id;
|
| - String16 resolvedTitle;
|
| - // Take last started profile if no title was passed.
|
| - if (title.isEmpty()) {
|
| - if (m_startedProfiles.empty())
|
| - return;
|
| - id = m_startedProfiles.back().m_id;
|
| - resolvedTitle = m_startedProfiles.back().m_title;
|
| - m_startedProfiles.pop_back();
|
| - } else {
|
| - for (size_t i = 0; i < m_startedProfiles.size(); i++) {
|
| - if (m_startedProfiles[i].m_title == title) {
|
| - resolvedTitle = title;
|
| - id = m_startedProfiles[i].m_id;
|
| - m_startedProfiles.erase(m_startedProfiles.begin() + i);
|
| - break;
|
| - }
|
| - }
|
| - if (id.isEmpty())
|
| - return;
|
| - }
|
| - std::unique_ptr<protocol::Profiler::Profile> profile = stopProfiling(id, true);
|
| - if (!profile)
|
| - return;
|
| - std::unique_ptr<protocol::Debugger::Location> location = currentDebugLocation(m_session->inspector());
|
| - m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile), resolvedTitle);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::enable(ErrorString*)
|
| -{
|
| - if (m_enabled)
|
| - return;
|
| - m_enabled = true;
|
| -#if ENSURE_V8_VERSION(5, 4)
|
| - DCHECK(!m_profiler);
|
| - m_profiler = v8::CpuProfiler::New(m_isolate);
|
| -#endif
|
| - m_state->setBoolean(ProfilerAgentState::profilerEnabled, true);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::disable(ErrorString* errorString)
|
| -{
|
| - if (!m_enabled)
|
| - return;
|
| - for (size_t i = m_startedProfiles.size(); i > 0; --i)
|
| - stopProfiling(m_startedProfiles[i - 1].m_id, false);
|
| - m_startedProfiles.clear();
|
| - stop(nullptr, nullptr);
|
| -#if ENSURE_V8_VERSION(5, 4)
|
| - m_profiler->Dispose();
|
| - m_profiler = nullptr;
|
| -#endif
|
| - m_enabled = false;
|
| - m_state->setBoolean(ProfilerAgentState::profilerEnabled, false);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::setSamplingInterval(ErrorString* error, int interval)
|
| -{
|
| - if (m_recordingCPUProfile) {
|
| - *error = "Cannot change sampling interval when profiling.";
|
| - return;
|
| - }
|
| - m_state->setInteger(ProfilerAgentState::samplingInterval, interval);
|
| - profiler()->SetSamplingInterval(interval);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::restore()
|
| -{
|
| - DCHECK(!m_enabled);
|
| - if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false))
|
| - return;
|
| - m_enabled = true;
|
| -#if ENSURE_V8_VERSION(5, 4)
|
| - DCHECK(!m_profiler);
|
| - m_profiler = v8::CpuProfiler::New(m_isolate);
|
| -#endif
|
| - int interval = 0;
|
| - m_state->getInteger(ProfilerAgentState::samplingInterval, &interval);
|
| - if (interval)
|
| - profiler()->SetSamplingInterval(interval);
|
| - if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, false)) {
|
| - ErrorString error;
|
| - start(&error);
|
| - }
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::start(ErrorString* error)
|
| -{
|
| - if (m_recordingCPUProfile)
|
| - return;
|
| - if (!m_enabled) {
|
| - *error = "Profiler is not enabled";
|
| - return;
|
| - }
|
| - m_recordingCPUProfile = true;
|
| - m_frontendInitiatedProfileId = nextProfileId();
|
| - startProfiling(m_frontendInitiatedProfileId);
|
| - m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true);
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::stop(ErrorString* errorString, std::unique_ptr<protocol::Profiler::Profile>* profile)
|
| -{
|
| - if (!m_recordingCPUProfile) {
|
| - if (errorString)
|
| - *errorString = "No recording profiles found";
|
| - return;
|
| - }
|
| - m_recordingCPUProfile = false;
|
| - std::unique_ptr<protocol::Profiler::Profile> cpuProfile = stopProfiling(m_frontendInitiatedProfileId, !!profile);
|
| - if (profile) {
|
| - *profile = std::move(cpuProfile);
|
| - if (!profile->get() && errorString)
|
| - *errorString = "Profile is not found";
|
| - }
|
| - m_frontendInitiatedProfileId = String16();
|
| - m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false);
|
| -}
|
| -
|
| -String16 V8ProfilerAgentImpl::nextProfileId()
|
| -{
|
| - return String16::fromInteger(atomicIncrement(&s_lastProfileId));
|
| -}
|
| -
|
| -void V8ProfilerAgentImpl::startProfiling(const String16& title)
|
| -{
|
| - v8::HandleScope handleScope(m_isolate);
|
| - profiler()->StartProfiling(toV8String(m_isolate, title), true);
|
| -}
|
| -
|
| -std::unique_ptr<protocol::Profiler::Profile> V8ProfilerAgentImpl::stopProfiling(const String16& title, bool serialize)
|
| -{
|
| - v8::HandleScope handleScope(m_isolate);
|
| - v8::CpuProfile* profile = profiler()->StopProfiling(toV8String(m_isolate, title));
|
| - if (!profile)
|
| - return nullptr;
|
| - std::unique_ptr<protocol::Profiler::Profile> result;
|
| - if (serialize)
|
| - result = createCPUProfile(m_isolate, profile);
|
| - profile->Delete();
|
| - return result;
|
| -}
|
| -
|
| -bool V8ProfilerAgentImpl::isRecording() const
|
| -{
|
| - return m_recordingCPUProfile || !m_startedProfiles.empty();
|
| -}
|
| -
|
| -v8::CpuProfiler* V8ProfilerAgentImpl::profiler()
|
| -{
|
| -#if ENSURE_V8_VERSION(5, 4)
|
| - return m_profiler;
|
| -#else
|
| - return m_isolate->GetCpuProfiler();
|
| -#endif
|
| -}
|
| -
|
| -} // namespace v8_inspector
|
|
|