diff options
Diffstat (limited to 'Source/WebCore/inspector/InspectorMemoryAgent.cpp')
-rw-r--r-- | Source/WebCore/inspector/InspectorMemoryAgent.cpp | 189 |
1 files changed, 125 insertions, 64 deletions
diff --git a/Source/WebCore/inspector/InspectorMemoryAgent.cpp b/Source/WebCore/inspector/InspectorMemoryAgent.cpp index 164d914d6..ebf9c364a 100644 --- a/Source/WebCore/inspector/InspectorMemoryAgent.cpp +++ b/Source/WebCore/inspector/InspectorMemoryAgent.cpp @@ -1,95 +1,156 @@ /* - * Copyright (C) 2011 Google Inc. All rights reserved. + * Copyright (C) 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" - -#if ENABLE(INSPECTOR) - #include "InspectorMemoryAgent.h" -#include "CharacterData.h" -#include "Document.h" -#include "EventListenerMap.h" -#include "Frame.h" -#include "InspectorDOMStorageAgent.h" -#include "InspectorWebFrontendDispatchers.h" +#if ENABLE(RESOURCE_USAGE) + #include "InstrumentingAgents.h" -#include "MemoryCache.h" -#include "Node.h" -#include "NodeTraversal.h" -#include "ScriptProfiler.h" -#include "StyledElement.h" -#include <inspector/InspectorValues.h> -#include <runtime/ArrayBufferView.h> -#include <wtf/HashSet.h> -#include <wtf/OwnPtr.h> -#include <wtf/PassOwnPtr.h> -#include <wtf/Vector.h> -#include <wtf/text/StringBuilder.h> -#include <wtf/text/StringImpl.h> -#include <wtf/text/WTFString.h> - -// Use a type alias instead of 'using' here which would cause a conflict on Mac. -typedef Inspector::TypeBuilder::Memory::MemoryBlock InspectorMemoryBlock; -typedef Inspector::TypeBuilder::Array<InspectorMemoryBlock> InspectorMemoryBlocks; +#include "ResourceUsageThread.h" +#include <inspector/InspectorEnvironment.h> +#include <wtf/Stopwatch.h> using namespace Inspector; namespace WebCore { -InspectorMemoryAgent::~InspectorMemoryAgent() +InspectorMemoryAgent::InspectorMemoryAgent(PageAgentContext& context) + : InspectorAgentBase(ASCIILiteral("Memory"), context) + , m_frontendDispatcher(std::make_unique<Inspector::MemoryFrontendDispatcher>(context.frontendRouter)) + , m_backendDispatcher(Inspector::MemoryBackendDispatcher::create(context.backendDispatcher, this)) +{ +} + +void InspectorMemoryAgent::didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*) +{ + m_instrumentingAgents.setInspectorMemoryAgent(this); +} + +void InspectorMemoryAgent::willDestroyFrontendAndBackend(DisconnectReason) +{ + m_instrumentingAgents.setInspectorMemoryAgent(nullptr); + + ErrorString ignored; + stopTracking(ignored); + disable(ignored); +} + +void InspectorMemoryAgent::enable(ErrorString&) +{ + m_enabled = true; +} + +void InspectorMemoryAgent::disable(ErrorString&) { + m_enabled = false; } -void InspectorMemoryAgent::didCreateFrontendAndBackend(Inspector::InspectorFrontendChannel*, InspectorBackendDispatcher* backendDispatcher) +void InspectorMemoryAgent::startTracking(ErrorString&) { - m_backendDispatcher = InspectorMemoryBackendDispatcher::create(backendDispatcher, this); + if (m_tracking) + return; + + ResourceUsageThread::addObserver(this, [this] (const ResourceUsageData& data) { + collectSample(data); + }); + + m_tracking = true; + + m_frontendDispatcher->trackingStart(m_environment.executionStopwatch()->elapsedTime()); } -void InspectorMemoryAgent::willDestroyFrontendAndBackend(InspectorDisconnectReason) +void InspectorMemoryAgent::stopTracking(ErrorString&) { - m_backendDispatcher.clear(); + if (!m_tracking) + return; + + ResourceUsageThread::removeObserver(this); + + m_tracking = false; + + m_frontendDispatcher->trackingComplete(); } -void InspectorMemoryAgent::getDOMCounters(ErrorString*, int* documents, int* nodes, int* jsEventListeners) +void InspectorMemoryAgent::didHandleMemoryPressure(Critical critical) { - *documents = InspectorCounters::counterValue(InspectorCounters::DocumentCounter); - *nodes = InspectorCounters::counterValue(InspectorCounters::NodeCounter); - *jsEventListeners = ThreadLocalInspectorCounters::current().counterValue(ThreadLocalInspectorCounters::JSEventListenerCounter); + if (!m_enabled) + return; + + MemoryFrontendDispatcher::Severity severity = critical == Critical::Yes ? MemoryFrontendDispatcher::Severity::Critical : MemoryFrontendDispatcher::Severity::NonCritical; + m_frontendDispatcher->memoryPressure(m_environment.executionStopwatch()->elapsedTime(), severity); } -InspectorMemoryAgent::InspectorMemoryAgent(InstrumentingAgents* instrumentingAgents) - : InspectorAgentBase(ASCIILiteral("Memory"), instrumentingAgents) +void InspectorMemoryAgent::collectSample(const ResourceUsageData& data) { + auto javascriptCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::Javascript) + .setSize(data.categories[MemoryCategory::GCHeap].totalSize() + data.categories[MemoryCategory::GCOwned].totalSize()) + .release(); + + auto jitCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::JIT) + .setSize(data.categories[MemoryCategory::JSJIT].totalSize()) + .release(); + + auto imagesCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::Images) + .setSize(data.categories[MemoryCategory::Images].totalSize()) + .release(); + + auto layersCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::Layers) + .setSize(data.categories[MemoryCategory::Layers].totalSize()) + .release(); + + auto pageCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::Page) + .setSize(data.categories[MemoryCategory::bmalloc].totalSize() + data.categories[MemoryCategory::LibcMalloc].totalSize()) + .release(); + + auto otherCategory = Protocol::Memory::CategoryData::create() + .setType(Protocol::Memory::CategoryData::Type::Other) + .setSize(data.categories[MemoryCategory::Other].totalSize()) + .release(); + + auto categories = Protocol::Array<Protocol::Memory::CategoryData>::create(); + categories->addItem(WTFMove(javascriptCategory)); + categories->addItem(WTFMove(jitCategory)); + categories->addItem(WTFMove(imagesCategory)); + categories->addItem(WTFMove(layersCategory)); + categories->addItem(WTFMove(pageCategory)); + categories->addItem(WTFMove(otherCategory)); + + auto event = Protocol::Memory::Event::create() + .setTimestamp(m_environment.executionStopwatch()->elapsedTime()) + .setCategories(WTFMove(categories)) + .release(); + + m_frontendDispatcher->trackingUpdate(WTFMove(event)); } -} // namespace WebCore +} // namespace Inspector -#endif // ENABLE(INSPECTOR) +#endif // ENABLE(RESOURCE_USAGE) |