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; }