Title: [143218] trunk/Source/WebCore
Revision
143218
Author
[email protected]
Date
2013-02-18 07:46:06 -0800 (Mon, 18 Feb 2013)

Log Message

Web Inspector: Native Memory Instrumentation: Generate meta information for HeapSnapshot parser.
https://bugs.webkit.org/show_bug.cgi?id=110104

Reviewed by Yury Semikhatsky.

The format of Native heap snapshot is slightly different so it should provide its own meta information.

* inspector/HeapGraphSerializer.cpp:
(WebCore::HeapGraphSerializer::HeapGraphSerializer):
(WebCore::HeapGraphSerializer::finish):
(WebCore::HeapGraphSerializer::reportMemoryUsage):
(WebCore::HeapGraphSerializer::registerTypeString):
(WebCore):
* inspector/HeapGraphSerializer.h:
(HeapGraphSerializer):
* inspector/Inspector.json:
* inspector/InspectorMemoryAgent.cpp:
(WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
(WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):
* inspector/InspectorMemoryAgent.h:
(InspectorMemoryAgent):
* inspector/front-end/HeapSnapshot.js:
(WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
* inspector/front-end/NativeHeapSnapshot.js:
(WebInspector.NativeHeapSnapshot):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (143217 => 143218)


--- trunk/Source/WebCore/ChangeLog	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/ChangeLog	2013-02-18 15:46:06 UTC (rev 143218)
@@ -1,3 +1,32 @@
+2013-02-18  Ilya Tikhonovsky  <[email protected]>
+
+        Web Inspector: Native Memory Instrumentation: Generate meta information for HeapSnapshot parser.
+        https://bugs.webkit.org/show_bug.cgi?id=110104
+
+        Reviewed by Yury Semikhatsky.
+
+        The format of Native heap snapshot is slightly different so it should provide its own meta information.
+
+
+        * inspector/HeapGraphSerializer.cpp:
+        (WebCore::HeapGraphSerializer::HeapGraphSerializer):
+        (WebCore::HeapGraphSerializer::finish):
+        (WebCore::HeapGraphSerializer::reportMemoryUsage):
+        (WebCore::HeapGraphSerializer::registerTypeString):
+        (WebCore):
+        * inspector/HeapGraphSerializer.h:
+        (HeapGraphSerializer):
+        * inspector/Inspector.json:
+        * inspector/InspectorMemoryAgent.cpp:
+        (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
+        (WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):
+        * inspector/InspectorMemoryAgent.h:
+        (InspectorMemoryAgent):
+        * inspector/front-end/HeapSnapshot.js:
+        (WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
+        * inspector/front-end/NativeHeapSnapshot.js:
+        (WebInspector.NativeHeapSnapshot):
+
 2013-02-18  Carlos Garcia Campos  <[email protected]>
 
         [GTK] Force single header includes in GObject DOM bindings

Modified: trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp (143217 => 143218)


--- trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp	2013-02-18 15:46:06 UTC (rev 143218)
@@ -50,6 +50,7 @@
     , m_nodeEdgesCount(0)
     , m_nodes(Nodes::create())
     , m_baseToRealNodeIdMap(BaseToRealNodeIdMap::create())
+    , m_typeStrings(InspectorObject::create())
     , m_leafCount(0)
 {
     ASSERT(m_client);
@@ -57,10 +58,12 @@
 
     memset(m_edgeTypes, 0, sizeof(m_edgeTypes));
 
-    m_edgeTypes[WTF::PointerMember] = addString("weak");
-    m_edgeTypes[WTF::OwnPtrMember] = addString("ownRef");
-    m_edgeTypes[WTF::RefPtrMember] = addString("countRef");
+    m_edgeTypes[WTF::PointerMember] = registerTypeString("weak");
+    m_edgeTypes[WTF::OwnPtrMember] = m_edgeTypes[WTF::RefPtrMember] = registerTypeString("property");
 
+    // FIXME: It is used as a magic constant for 'object' node type.
+    registerTypeString("object");
+
     m_unknownClassNameId = addString("unknown");
 }
 
@@ -155,21 +158,55 @@
     m_baseToRealNodeIdMap->addItem(toNodeId(real));
 }
 
-void HeapGraphSerializer::finish()
+PassRefPtr<InspectorObject> HeapGraphSerializer::finish()
 {
     addRootNode();
     pushUpdate();
+    String metaString =
+        "{"
+            "\"node_fields\":["
+                "\"type\","
+                "\"name\","
+                "\"id\","
+                "\"self_size\","
+                "\"edge_count\""
+            "],"
+            "\"node_types\":["
+                "[]," // FIXME: It is a fallback for Heap Snapshot parser. In case of Native Heap Snapshot it is a plain string id.
+                "\"string\","
+                "\"number\","
+                "\"number\","
+                "\"number\""
+            "],"
+            "\"edge_fields\":["
+                "\"type\","
+                "\"name_or_index\","
+                "\"to_node\""
+            "],"
+            "\"edge_types\":["
+                "[],"
+                "\"string_or_number\","
+                "\"node\""
+            "]"
+        "}";
+
+    RefPtr<InspectorValue> metaValue = InspectorValue::parseJSON(metaString);
+    RefPtr<InspectorObject> meta;
+    metaValue->asObject(&meta);
+    ASSERT(meta);
+    meta->setObject("type_strings", m_typeStrings);
+    return meta.release();
 }
 
 void HeapGraphSerializer::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
 {
     MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Inspector);
-    info.addMember(m_stringToIndex, "stringToIndex");
-    info.addMember(m_strings, "strings");
-    info.addMember(m_edges, "edges");
-    info.addMember(m_nodes, "nodes");
-    info.addMember(m_baseToRealNodeIdMap, "baseToRealNodeIdMap");
-    info.addMember(m_roots, "roots");
+    info.ignoreMember(m_stringToIndex);
+    info.ignoreMember(m_strings);
+    info.ignoreMember(m_edges);
+    info.ignoreMember(m_nodes);
+    info.ignoreMember(m_baseToRealNodeIdMap);
+    info.ignoreMember(m_roots);
 }
 
 int HeapGraphSerializer::addString(const String& string)
@@ -182,6 +219,13 @@
     return result.iterator->value;
 }
 
+int HeapGraphSerializer::registerTypeString(const String& string)
+{
+    int stringId = addString(string);
+    m_typeStrings->setNumber(string, stringId);
+    return stringId;
+}
+
 int HeapGraphSerializer::toNodeId(const void* to)
 {
     if (!to)

Modified: trunk/Source/WebCore/inspector/HeapGraphSerializer.h (143217 => 143218)


--- trunk/Source/WebCore/inspector/HeapGraphSerializer.h	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/HeapGraphSerializer.h	2013-02-18 15:46:06 UTC (rev 143218)
@@ -60,7 +60,7 @@
     void reportLeaf(const WTF::MemoryObjectInfo&, const char*);
     void reportBaseAddress(const void*, const void*);
 
-    void finish();
+    PassRefPtr<InspectorObject> finish();
 
     void reportMemoryUsage(MemoryObjectInfo*) const;
 
@@ -72,6 +72,7 @@
 
     int addString(const String&);
     void addRootNode();
+    int registerTypeString(const String&);
 
     void reportEdgeImpl(const int toNodeId, const char* name, int memberType);
     int reportNodeImpl(const WTF::MemoryObjectInfo&, int edgesCount);
@@ -100,6 +101,7 @@
     Address2NodeId m_address2NodeIdMap;
 
     Vector<const void*> m_roots;
+    RefPtr<InspectorObject> m_typeStrings;
 
     size_t m_edgeTypes[WTF::LastMemberTypeEntry];
     int m_unknownClassNameId;

Modified: trunk/Source/WebCore/inspector/Inspector.json (143217 => 143218)


--- trunk/Source/WebCore/inspector/Inspector.json	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/Inspector.json	2013-02-18 15:46:06 UTC (rev 143218)
@@ -77,7 +77,8 @@
                     { "name": "reportGraph", "type": "boolean", "optional": true, "description": "Whether native memory graph should be reported in addition to aggregated statistics." }
                 ],
                 "returns": [
-                    { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"}
+                    { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"},
+                    { "name": "graphMetaInformation", "type": "object", "optional": true, "description": "An object describing structures of nodes and edges in the graph."}
                 ]
             }
         ],

Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp (143217 => 143218)


--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp	2013-02-18 15:46:06 UTC (rev 143218)
@@ -307,10 +307,10 @@
     getProcessMemoryDistributionImpl(false, memoryInfo);
 }
 
-void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory)
+void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory, RefPtr<InspectorObject>& graphMetaInformation)
 {
     TypeNameToSizeMap memoryInfo;
-    getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
+    graphMetaInformation = getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
 
     MemoryUsageStatsGenerator statsGenerator;
     RefPtr<InspectorMemoryBlocks> children = InspectorMemoryBlocks::create();
@@ -348,8 +348,9 @@
 
 }
 
-void InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
+PassRefPtr<InspectorObject> InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
 {
+    RefPtr<InspectorObject> meta;
     OwnPtr<HeapGraphSerializer> graphSerializer;
     OwnPtr<FrontendWrapper> frontendWrapper;
 
@@ -374,7 +375,7 @@
     memoryInstrumentation.addRootObject(memoryInstrumentationClient);
     if (graphSerializer) {
         memoryInstrumentation.addRootObject(graphSerializer.get());
-        graphSerializer->finish();
+        meta = graphSerializer->finish();
         graphSerializer.release(); // Release it earlier than frontendWrapper
         frontendWrapper.release();
     }
@@ -384,6 +385,7 @@
     *memoryInfo = memoryInstrumentationClient.sizesMap();
     addPlatformComponentsInfo(memoryInfo);
     addMemoryInstrumentationDebugData(&memoryInstrumentationClient, memoryInfo);
+    return meta.release();
 }
 
 InspectorMemoryAgent::InspectorMemoryAgent(InstrumentingAgents* instrumentingAgents, InspectorClient* client, InspectorCompositeState* state, Page* page)

Modified: trunk/Source/WebCore/inspector/InspectorMemoryAgent.h (143217 => 143218)


--- trunk/Source/WebCore/inspector/InspectorMemoryAgent.h	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/InspectorMemoryAgent.h	2013-02-18 15:46:06 UTC (rev 143218)
@@ -60,7 +60,7 @@
     virtual ~InspectorMemoryAgent();
 
     virtual void getDOMCounters(ErrorString*, int* documents, int* nodes, int* jsEventListeners);
-    virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& processMemory);
+    virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& out_processMemory, RefPtr<InspectorObject>& graphMetaInformation);
 
     virtual void reportMemoryUsage(MemoryObjectInfo*) const;
 
@@ -72,7 +72,7 @@
 private:
     InspectorMemoryAgent(InstrumentingAgents*, InspectorClient*, InspectorCompositeState*, Page*);
 
-    void getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
+    PassRefPtr<InspectorObject> getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
 
     InspectorClient* m_inspectorClient;
     Page* m_page;

Modified: trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js (143217 => 143218)


--- trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js	2013-02-18 15:46:06 UTC (rev 143218)
@@ -1026,8 +1026,21 @@
             }
         }
 
-        if (postOrderIndex !== nodeCount)
+        if (postOrderIndex !== nodeCount) {
+            var dumpNode = this.rootNode();
+            for (var i = 0; i < nodeCount; ++i) {
+                if (painted[i] !== black) {
+                    dumpNode.nodeIndex = i * nodeFieldCount;
+                    console.log(JSON.stringify(dumpNode.serialize()));
+                    var retainers = dumpNode.retainers();
+                    while (retainers) {
+                        console.log("edgeName: " + retainers.item().name() + " nodeClassName: " + retainers.item().node().className());
+                        retainers = retainers.item().node().retainers();
+                    }
+                }
+            }
             throw new Error("Postordering failed. " + (nodeCount - postOrderIndex) + " hanging nodes");
+        }
 
         return {postOrderIndex2NodeOrdinal: postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};
     },

Modified: trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js (143217 => 143218)


--- trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js	2013-02-18 15:46:06 UTC (rev 143218)
@@ -35,7 +35,9 @@
 WebInspector.NativeHeapSnapshot = function(profile)
 {
     WebInspector.HeapSnapshot.call(this, profile);
-    this._nodeObjectType = 3;
+    this._nodeObjectType = this._metaNode.type_strings["object"];
+    this._edgeWeakType = this._metaNode.type_strings["weak"];
+    this._edgeElementType = this._metaNode.type_strings["property"];
 }
 
 WebInspector.NativeHeapSnapshot.prototype = {

Modified: trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js (143217 => 143218)


--- trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js	2013-02-18 15:40:17 UTC (rev 143217)
+++ trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js	2013-02-18 15:46:06 UTC (rev 143218)
@@ -267,62 +267,16 @@
          * @param {?string} error
          * @param {?MemoryAgent.MemoryBlock} memoryBlock
          */
-        function didReceiveMemorySnapshot(error, memoryBlock)
+        function didReceiveMemorySnapshot(error, memoryBlock, graphMetaInformation)
         {
             this.isTemporary = false;
             this.sidebarElement.subtitle = Number.bytesToString(/** @type{number} */(memoryBlock.size));
 
-            var meta = {
-              "node_fields": [
-                "type",
-                "name",
-                "id",
-                "self_size",
-                "edge_count"
-              ],
-              "node_types": [
-                [
-                  "hidden",
-                  "array",
-                  "string",
-                  "object",
-                  "code",
-                  "closure",
-                  "regexp",
-                  "number",
-                  "native",
-                  "synthetic"
-                ],
-                "string",
-                "number",
-                "number",
-                "number",
-              ],
-              "edge_fields": [
-                "type",
-                "name_or_index",
-                "to_node"
-              ],
-              "edge_types": [
-                [
-                  "context",
-                  "element",
-                  "property",
-                  "internal",
-                  "hidden",
-                  "shortcut",
-                  "weak"
-                ],
-                "string_or_number",
-                "node"
-              ]
-            };
+            var edgeFieldCount = graphMetaInformation.edge_fields.length;
+            var nodeFieldCount = graphMetaInformation.node_fields.length;
+            var nodeIdFieldOffset = graphMetaInformation.node_fields.indexOf("id");
+            var toNodeIdFieldOffset = graphMetaInformation.edge_fields.indexOf("to_node");
 
-            var edgeFieldCount = meta.edge_fields.length;
-            var nodeFieldCount = meta.node_fields.length;
-            var nodeIdFieldOffset = meta.node_fields.indexOf("id");
-            var toNodeIdFieldOffset = meta.edge_fields.indexOf("to_node");
-
             var baseToRealNodeIdMap = {};
             for (var i = 0; i < this._baseToRealNodeId.length; i += 2)
                 baseToRealNodeIdMap[this._baseToRealNodeId[i]] = this._baseToRealNodeId[i + 1];
@@ -341,7 +295,7 @@
 
             var heapSnapshot = {
                 "snapshot": {
-                    "meta": meta,
+                    "meta": graphMetaInformation,
                     node_count: this._nodes.length / nodeFieldCount,
                     edge_count: this._edges.length / edgeFieldCount,
                     root_index: this._nodes.length - nodeFieldCount
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to