Title: [131290] trunk/Source/WebCore
Revision
131290
Author
loi...@chromium.org
Date
2012-10-14 23:21:29 -0700 (Sun, 14 Oct 2012)

Log Message

Web Inspector: NMI remove hand made object builders with automatic builder.
https://bugs.webkit.org/show_bug.cgi?id=99186

Reviewed by Yury Semikhatsky.

Old builders were replaced with single automatic builder.
It does the next things:
a) deduplicates entries in the MemoryInstrumentationClient's map and converts objectType pointers to String;
b) creates parent entries and assigns their aggregated sizes;
c) creates the hierarchy of MemoryBlocks recursively.

* dom/WebCoreMemoryInstrumentation.cpp:
(WebCore):
* dom/WebCoreMemoryInstrumentation.h:
(WebCoreMemoryTypes):
* inspector/InspectorMemoryAgent.cpp:
(WebCore):
(WebCore::jsHeapInfo):
(WebCore::renderTreeInfo):
(WebCore::addPlatformComponentsInfo):
(WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
* inspector/MemoryInstrumentationImpl.cpp:
(WebCore::MemoryInstrumentationClientImpl::sizesMap):
(WebCore):
* inspector/MemoryInstrumentationImpl.h:
(WebCore):
(MemoryInstrumentationClientImpl):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (131289 => 131290)


--- trunk/Source/WebCore/ChangeLog	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/ChangeLog	2012-10-15 06:21:29 UTC (rev 131290)
@@ -1,3 +1,33 @@
+2012-10-12  Ilya Tikhonovsky  <loi...@chromium.org>
+
+        Web Inspector: NMI remove hand made object builders with automatic builder.
+        https://bugs.webkit.org/show_bug.cgi?id=99186
+
+        Reviewed by Yury Semikhatsky.
+
+        Old builders were replaced with single automatic builder.
+        It does the next things:
+        a) deduplicates entries in the MemoryInstrumentationClient's map and converts objectType pointers to String;
+        b) creates parent entries and assigns their aggregated sizes;
+        c) creates the hierarchy of MemoryBlocks recursively.
+
+        * dom/WebCoreMemoryInstrumentation.cpp:
+        (WebCore):
+        * dom/WebCoreMemoryInstrumentation.h:
+        (WebCoreMemoryTypes):
+        * inspector/InspectorMemoryAgent.cpp:
+        (WebCore):
+        (WebCore::jsHeapInfo):
+        (WebCore::renderTreeInfo):
+        (WebCore::addPlatformComponentsInfo):
+        (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
+        * inspector/MemoryInstrumentationImpl.cpp:
+        (WebCore::MemoryInstrumentationClientImpl::sizesMap):
+        (WebCore):
+        * inspector/MemoryInstrumentationImpl.h:
+        (WebCore):
+        (MemoryInstrumentationClientImpl):
+
 2012-10-14  Sam Weinig  <s...@webkit.org>
 
         Simplify user content in WebKit2 by using WebCore::UserStyleSheet and WebCore::UserScript directly

Modified: trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.cpp (131289 => 131290)


--- trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.cpp	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.cpp	2012-10-15 06:21:29 UTC (rev 131290)
@@ -33,12 +33,10 @@
 
 namespace WebCore {
 
-MemoryObjectType WebCoreMemoryTypes::Page = "Page";
 MemoryObjectType WebCoreMemoryTypes::DOM = "Page.DOM";
 MemoryObjectType WebCoreMemoryTypes::CSS = "Page.CSS";
 MemoryObjectType WebCoreMemoryTypes::Binding = "Page.Binding";
 
-MemoryObjectType WebCoreMemoryTypes::MemoryCache = "MemoryCache";
 MemoryObjectType WebCoreMemoryTypes::MemoryCacheStructures = "MemoryCache.InternalStructures";
 MemoryObjectType WebCoreMemoryTypes::CachedResource = "MemoryCache.Resource";
 MemoryObjectType WebCoreMemoryTypes::CachedResourceRaw = "MemoryCache.RawResource";
@@ -50,7 +48,6 @@
 MemoryObjectType WebCoreMemoryTypes::CachedResourceShader = "MemoryCache.Shader";
 MemoryObjectType WebCoreMemoryTypes::CachedResourceXSLT = "MemoryCache.XSLT";
 
-MemoryObjectType WebCoreMemoryTypes::ExternalResources = "JSExternalResources";
 MemoryObjectType WebCoreMemoryTypes::ExternalStrings = "JSExternalResources.Strings";
 MemoryObjectType WebCoreMemoryTypes::ExternalArrays = "JSExternalResources.Arrays";
 

Modified: trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.h (131289 => 131290)


--- trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.h	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/dom/WebCoreMemoryInstrumentation.h	2012-10-15 06:21:29 UTC (rev 131290)
@@ -41,12 +41,10 @@
 
 class WebCoreMemoryTypes : public PlatformMemoryTypes {
 public:
-    static MemoryObjectType Page;
     static MemoryObjectType DOM;
     static MemoryObjectType CSS;
     static MemoryObjectType Binding;
 
-    static MemoryObjectType MemoryCache;
     static MemoryObjectType MemoryCacheStructures;
     static MemoryObjectType CachedResource;
     static MemoryObjectType CachedResourceRaw;
@@ -58,7 +56,6 @@
     static MemoryObjectType CachedResourceShader;
     static MemoryObjectType CachedResourceXSLT;
 
-    static MemoryObjectType ExternalResources;
     static MemoryObjectType ExternalStrings;
     static MemoryObjectType ExternalArrays;
 };

Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp (131289 => 131290)


--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2012-10-15 06:21:29 UTC (rev 131290)
@@ -56,6 +56,7 @@
 #include <wtf/ArrayBufferView.h>
 #include <wtf/HashSet.h>
 #include <wtf/MemoryInstrumentationArrayBufferView.h>
+#include <wtf/NonCopyingSort.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
 #include <wtf/Vector.h>
@@ -70,6 +71,7 @@
 
 // Use a type alias instead of 'using' here which would cause a conflict on Mac.
 typedef WebCore::TypeBuilder::Memory::MemoryBlock InspectorMemoryBlock;
+typedef WebCore::TypeBuilder::Array<InspectorMemoryBlock> InspectorMemoryBlocks;
 
 namespace WebCore {
 
@@ -93,78 +95,59 @@
 public:
     MemoryUsageStatsGenerator(MemoryInstrumentationClientImpl* client) : m_client(client) { }
 
-    void dump(TypeBuilder::Array<InspectorMemoryBlock>* children)
+    void dump(InspectorMemoryBlocks* children)
     {
-        children->addItem(buildObjectForMemoryCache());
-        children->addItem(buildObjectForPage());
-        children->addItem(buildObjectForExternalResources());
+        m_sizesMap = m_client->sizesMap();
 
-        addMemoryInstrumentationDebugData(children);
-    }
+        Vector<String> objectTypes;
+        objectTypes.appendRange(m_sizesMap.keys().begin(), m_sizesMap.keys().end());
 
-private:
-    PassRefPtr<InspectorMemoryBlock> buildObjectForMemoryCache() const
-    {
-        size_t totalSize = 0;
+        for (Vector<String>::const_iterator i = objectTypes.begin(); i != objectTypes.end(); ++i)
+            updateParentSizes(*i, m_sizesMap.get(*i));
 
-        RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create();
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::MemoryCacheStructures);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceRaw);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceCSS);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceFont);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceImage);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceScript);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceSVG);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceShader);
-        totalSize += addMemoryBlockFor(children.get(), WebCoreMemoryTypes::CachedResourceXSLT);
+        objectTypes.clear();
+        objectTypes.appendRange(m_sizesMap.keys().begin(), m_sizesMap.keys().end());
+        nonCopyingSort(objectTypes.begin(), objectTypes.end(), stringCompare);
 
-        RefPtr<InspectorMemoryBlock> block = InspectorMemoryBlock::create().setName(WebCoreMemoryTypes::MemoryCache);
-        block->setSize(totalSize);
-        block->setChildren(children.release());
-        return block.release();
-    }
+        size_t index = 0;
+        while (index < objectTypes.size())
+            index = buildObjectForIndex(index, objectTypes, children);
 
-    PassRefPtr<InspectorMemoryBlock> buildObjectForPage() const
-    {
-        size_t totalSize = 0;
-
-        RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > domChildren = TypeBuilder::Array<InspectorMemoryBlock>::create();
-        totalSize += addMemoryBlockFor(domChildren.get(), WebCoreMemoryTypes::DOM);
-        totalSize += addMemoryBlockFor(domChildren.get(), WebCoreMemoryTypes::Image);
-        totalSize += addMemoryBlockFor(domChildren.get(), WebCoreMemoryTypes::CSS);
-        totalSize += addMemoryBlockFor(domChildren.get(), WebCoreMemoryTypes::Binding);
-        totalSize += addMemoryBlockFor(domChildren.get(), WebCoreMemoryTypes::Loader);
-
-        RefPtr<InspectorMemoryBlock> dom = InspectorMemoryBlock::create().setName(WebCoreMemoryTypes::Page);
-        dom->setSize(totalSize);
-        dom->setChildren(domChildren.release());
-        return dom.release();
+        addMemoryInstrumentationDebugData(children);
     }
 
-    PassRefPtr<InspectorMemoryBlock> buildObjectForExternalResources() const
-    {
-        size_t totalSize = 0;
+private:
+    static bool stringCompare(const String& a, const String& b) { return WTF::codePointCompare(a, b) < 0; }
 
-        RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > resourcesChildren = TypeBuilder::Array<InspectorMemoryBlock>::create();
-        totalSize += addMemoryBlockFor(resourcesChildren.get(), WebCoreMemoryTypes::ExternalStrings);
-        totalSize += addMemoryBlockFor(resourcesChildren.get(), WebCoreMemoryTypes::ExternalArrays);
-
-        RefPtr<InspectorMemoryBlock> resources = InspectorMemoryBlock::create().setName(WebCoreMemoryTypes::ExternalResources);
-        resources->setSize(totalSize);
-        resources->setChildren(resourcesChildren.release());
-        return resources.release();
+    void updateParentSizes(String objectType, const size_t size)
+    {
+        for (size_t dotPosition = objectType.reverseFind('.'); dotPosition != notFound; dotPosition = objectType.reverseFind('.', dotPosition)) {
+            objectType = objectType.substring(0, dotPosition);
+            TypeNameToSizeMap::AddResult result = m_sizesMap.add(objectType, size);
+            if (!result.isNewEntry)
+                result.iterator->value += size;
+        }
     }
 
-    size_t addMemoryBlockFor(TypeBuilder::Array<InspectorMemoryBlock>* array, MemoryObjectType typeName) const
+    size_t buildObjectForIndex(size_t index, const Vector<String>& objectTypes, InspectorMemoryBlocks* array)
     {
-        RefPtr<InspectorMemoryBlock> result = InspectorMemoryBlock::create().setName(typeName);
-        size_t size = m_client->totalSize(typeName);
-        result->setSize(size);
-        array->addItem(result);
-        return size;
+        String typeName = objectTypes[index];
+        RefPtr<InspectorMemoryBlock> block = InspectorMemoryBlock::create().setName(typeName);
+        block->setSize(m_sizesMap.get(typeName));
+        array->addItem(block);
+        ++index;
+        RefPtr<InspectorMemoryBlocks> children;
+        while (index < objectTypes.size() && objectTypes[index].startsWith(typeName)) {
+            if (!children)
+                children = InspectorMemoryBlocks::create();
+            index = buildObjectForIndex(index, objectTypes, children.get());
+        }
+        if (children)
+            block->setChildren(children.release());
+        return index;
     }
 
-    void addMemoryInstrumentationDebugData(TypeBuilder::Array<InspectorMemoryBlock>* children)
+    void addMemoryInstrumentationDebugData(InspectorMemoryBlocks* children)
     {
         if (m_client->checkInstrumentedObjects()) {
             RefPtr<InspectorMemoryBlock> totalInstrumented = InspectorMemoryBlock::create().setName("InstrumentedObjectsCount");
@@ -179,6 +162,7 @@
     }
 
     MemoryInstrumentationClientImpl* m_client;
+    TypeNameToSizeMap m_sizesMap;
 };
 
 String nodeName(Node* node)
@@ -499,7 +483,7 @@
     RefPtr<InspectorMemoryBlock> jsHeapAllocated = InspectorMemoryBlock::create().setName(MemoryBlockName::jsHeapAllocated);
     jsHeapAllocated->setSize(static_cast<int>(info.totalJSHeapSize));
 
-    RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create();
+    RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = InspectorMemoryBlocks::create();
     RefPtr<InspectorMemoryBlock> jsHeapUsed = InspectorMemoryBlock::create().setName(MemoryBlockName::jsHeapUsed);
     jsHeapUsed->setSize(static_cast<int>(info.usedJSHeapSize));
     children->addItem(jsHeapUsed);
@@ -515,7 +499,7 @@
     RefPtr<InspectorMemoryBlock> renderTreeAllocated = InspectorMemoryBlock::create().setName(MemoryBlockName::renderTreeAllocated);
     renderTreeAllocated->setSize(arenaSize.allocated);
 
-    RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create();
+    RefPtr<InspectorMemoryBlocks> children = InspectorMemoryBlocks::create();
     RefPtr<InspectorMemoryBlock> renderTreeUsed = InspectorMemoryBlock::create().setName(MemoryBlockName::renderTreeUsed);
     renderTreeUsed->setSize(arenaSize.treeSize);
     children->addItem(renderTreeUsed);
@@ -589,7 +573,7 @@
     domTreesIterator.visitMemoryCache();
 }
 
-static void addPlatformComponentsInfo(PassRefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children)
+static void addPlatformComponentsInfo(PassRefPtr<InspectorMemoryBlocks> children)
 {
     Vector<MemoryUsageSupport::ComponentInfo> components;
     MemoryUsageSupport::memoryUsageByComponents(components);
@@ -619,7 +603,7 @@
     MemoryInstrumentationClientImpl memoryInstrumentationClient(allocatedObjects.isEmpty() ? 0 : &allocatedObjects);
     MemoryInstrumentationImpl memoryInstrumentation(&memoryInstrumentationClient);
 
-    RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create();
+    RefPtr<InspectorMemoryBlocks> children = InspectorMemoryBlocks::create();
     children->addItem(jsHeapInfo());
     children->addItem(renderTreeInfo(m_page)); // FIXME: collect for all pages?
     collectDomTreeInfo(m_page, memoryInstrumentation); // FIXME: collect for all pages?

Modified: trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.cpp (131289 => 131290)


--- trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.cpp	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.cpp	2012-10-15 06:21:29 UTC (rev 131290)
@@ -34,9 +34,25 @@
 
 #include "MemoryInstrumentationImpl.h"
 #include <wtf/Assertions.h>
+#include <wtf/text/StringHash.h>
 
 namespace WebCore {
 
+TypeNameToSizeMap MemoryInstrumentationClientImpl::sizesMap() const
+{
+    // TypeToSizeMap uses const char* as the key.
+    // Thus it could happen that we have two different keys with equal string.
+    TypeNameToSizeMap sizesMap;
+    for (TypeToSizeMap::const_iterator i = m_totalSizes.begin(); i != m_totalSizes.end(); ++i) {
+        String objectType(i->key);
+        TypeNameToSizeMap::AddResult result = sizesMap.add(objectType, i->value);
+        if (!result.isNewEntry)
+            result.iterator->value += i->value;
+    }
+
+    return sizesMap;
+}
+
 void MemoryInstrumentationClientImpl::countObjectSize(MemoryObjectType objectType, size_t size)
 {
     ASSERT(objectType);

Modified: trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.h (131289 => 131290)


--- trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.h	2012-10-15 03:17:17 UTC (rev 131289)
+++ trunk/Source/WebCore/inspector/MemoryInstrumentationImpl.h	2012-10-15 06:21:29 UTC (rev 131290)
@@ -37,12 +37,14 @@
 #include <wtf/HashSet.h>
 #include <wtf/MemoryInstrumentation.h>
 #include <wtf/Vector.h>
+#include <wtf/text/StringHash.h>
 
 using WTF::MemoryObjectType;
 
 namespace WebCore {
 
 typedef HashSet<const void*> VisitedObjects;
+typedef HashMap<String, size_t> TypeNameToSizeMap;
 
 class MemoryInstrumentationClientImpl : public WTF::MemoryInstrumentationClient {
 public:
@@ -72,6 +74,8 @@
             m_totalSizes.capacity() * sizeof(TypeToSizeMap::ValueType);
     }
 
+    TypeNameToSizeMap sizesMap() const;
+
     bool checkInstrumentedObjects() const { return m_allocatedObjects; }
     size_t visitedObjects() const { return m_visitedObjects.size(); }
     size_t totalCountedObjects() const { return m_totalCountedObjects; }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to