Changeset 143218 in webkit


Ignore:
Timestamp:
Feb 18, 2013 7:46:06 AM (11 years ago)
Author:
loislo@chromium.org
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):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r143212 r143218  
     12013-02-18  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: Native Memory Instrumentation: Generate meta information for HeapSnapshot parser.
     4        https://bugs.webkit.org/show_bug.cgi?id=110104
     5
     6        Reviewed by Yury Semikhatsky.
     7
     8        The format of Native heap snapshot is slightly different so it should provide its own meta information.
     9
     10
     11        * inspector/HeapGraphSerializer.cpp:
     12        (WebCore::HeapGraphSerializer::HeapGraphSerializer):
     13        (WebCore::HeapGraphSerializer::finish):
     14        (WebCore::HeapGraphSerializer::reportMemoryUsage):
     15        (WebCore::HeapGraphSerializer::registerTypeString):
     16        (WebCore):
     17        * inspector/HeapGraphSerializer.h:
     18        (HeapGraphSerializer):
     19        * inspector/Inspector.json:
     20        * inspector/InspectorMemoryAgent.cpp:
     21        (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution):
     22        (WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):
     23        * inspector/InspectorMemoryAgent.h:
     24        (InspectorMemoryAgent):
     25        * inspector/front-end/HeapSnapshot.js:
     26        (WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
     27        * inspector/front-end/NativeHeapSnapshot.js:
     28        (WebInspector.NativeHeapSnapshot):
     29
    1302013-02-18  Carlos Garcia Campos  <cgarcia@igalia.com>
    231
  • trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp

    r143175 r143218  
    5151    , m_nodes(Nodes::create())
    5252    , m_baseToRealNodeIdMap(BaseToRealNodeIdMap::create())
     53    , m_typeStrings(InspectorObject::create())
    5354    , m_leafCount(0)
    5455{
     
    5859    memset(m_edgeTypes, 0, sizeof(m_edgeTypes));
    5960
    60     m_edgeTypes[WTF::PointerMember] = addString("weak");
    61     m_edgeTypes[WTF::OwnPtrMember] = addString("ownRef");
    62     m_edgeTypes[WTF::RefPtrMember] = addString("countRef");
     61    m_edgeTypes[WTF::PointerMember] = registerTypeString("weak");
     62    m_edgeTypes[WTF::OwnPtrMember] = m_edgeTypes[WTF::RefPtrMember] = registerTypeString("property");
     63
     64    // FIXME: It is used as a magic constant for 'object' node type.
     65    registerTypeString("object");
    6366
    6467    m_unknownClassNameId = addString("unknown");
     
    156159}
    157160
    158 void HeapGraphSerializer::finish()
     161PassRefPtr<InspectorObject> HeapGraphSerializer::finish()
    159162{
    160163    addRootNode();
    161164    pushUpdate();
     165    String metaString =
     166        "{"
     167            "\"node_fields\":["
     168                "\"type\","
     169                "\"name\","
     170                "\"id\","
     171                "\"self_size\","
     172                "\"edge_count\""
     173            "],"
     174            "\"node_types\":["
     175                "[]," // FIXME: It is a fallback for Heap Snapshot parser. In case of Native Heap Snapshot it is a plain string id.
     176                "\"string\","
     177                "\"number\","
     178                "\"number\","
     179                "\"number\""
     180            "],"
     181            "\"edge_fields\":["
     182                "\"type\","
     183                "\"name_or_index\","
     184                "\"to_node\""
     185            "],"
     186            "\"edge_types\":["
     187                "[],"
     188                "\"string_or_number\","
     189                "\"node\""
     190            "]"
     191        "}";
     192
     193    RefPtr<InspectorValue> metaValue = InspectorValue::parseJSON(metaString);
     194    RefPtr<InspectorObject> meta;
     195    metaValue->asObject(&meta);
     196    ASSERT(meta);
     197    meta->setObject("type_strings", m_typeStrings);
     198    return meta.release();
    162199}
    163200
     
    165202{
    166203    MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Inspector);
    167     info.addMember(m_stringToIndex, "stringToIndex");
    168     info.addMember(m_strings, "strings");
    169     info.addMember(m_edges, "edges");
    170     info.addMember(m_nodes, "nodes");
    171     info.addMember(m_baseToRealNodeIdMap, "baseToRealNodeIdMap");
    172     info.addMember(m_roots, "roots");
     204    info.ignoreMember(m_stringToIndex);
     205    info.ignoreMember(m_strings);
     206    info.ignoreMember(m_edges);
     207    info.ignoreMember(m_nodes);
     208    info.ignoreMember(m_baseToRealNodeIdMap);
     209    info.ignoreMember(m_roots);
    173210}
    174211
     
    183220}
    184221
     222int HeapGraphSerializer::registerTypeString(const String& string)
     223{
     224    int stringId = addString(string);
     225    m_typeStrings->setNumber(string, stringId);
     226    return stringId;
     227}
     228
    185229int HeapGraphSerializer::toNodeId(const void* to)
    186230{
  • trunk/Source/WebCore/inspector/HeapGraphSerializer.h

    r143175 r143218  
    6161    void reportBaseAddress(const void*, const void*);
    6262
    63     void finish();
     63    PassRefPtr<InspectorObject> finish();
    6464
    6565    void reportMemoryUsage(MemoryObjectInfo*) const;
     
    7373    int addString(const String&);
    7474    void addRootNode();
     75    int registerTypeString(const String&);
    7576
    7677    void reportEdgeImpl(const int toNodeId, const char* name, int memberType);
     
    101102
    102103    Vector<const void*> m_roots;
     104    RefPtr<InspectorObject> m_typeStrings;
    103105
    104106    size_t m_edgeTypes[WTF::LastMemberTypeEntry];
  • trunk/Source/WebCore/inspector/Inspector.json

    r143206 r143218  
    7878                ],
    7979                "returns": [
    80                     { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"}
     80                    { "name": "distribution", "$ref": "MemoryBlock", "description": "An object describing all memory allocated by the process"},
     81                    { "name": "graphMetaInformation", "type": "object", "optional": true, "description": "An object describing structures of nodes and edges in the graph."}
    8182                ]
    8283            }
  • trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp

    r143175 r143218  
    308308}
    309309
    310 void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory)
     310void InspectorMemoryAgent::getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<InspectorMemoryBlock>& processMemory, RefPtr<InspectorObject>& graphMetaInformation)
    311311{
    312312    TypeNameToSizeMap memoryInfo;
    313     getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
     313    graphMetaInformation = getProcessMemoryDistributionImpl(reportGraph && *reportGraph, &memoryInfo);
    314314
    315315    MemoryUsageStatsGenerator statsGenerator;
     
    349349}
    350350
    351 void InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
    352 {
     351PassRefPtr<InspectorObject> InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
     352{
     353    RefPtr<InspectorObject> meta;
    353354    OwnPtr<HeapGraphSerializer> graphSerializer;
    354355    OwnPtr<FrontendWrapper> frontendWrapper;
     
    375376    if (graphSerializer) {
    376377        memoryInstrumentation.addRootObject(graphSerializer.get());
    377         graphSerializer->finish();
     378        meta = graphSerializer->finish();
    378379        graphSerializer.release(); // Release it earlier than frontendWrapper
    379380        frontendWrapper.release();
     
    385386    addPlatformComponentsInfo(memoryInfo);
    386387    addMemoryInstrumentationDebugData(&memoryInstrumentationClient, memoryInfo);
     388    return meta.release();
    387389}
    388390
  • trunk/Source/WebCore/inspector/InspectorMemoryAgent.h

    r142281 r143218  
    6161
    6262    virtual void getDOMCounters(ErrorString*, int* documents, int* nodes, int* jsEventListeners);
    63     virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& processMemory);
     63    virtual void getProcessMemoryDistribution(ErrorString*, const bool* reportGraph, RefPtr<TypeBuilder::Memory::MemoryBlock>& out_processMemory, RefPtr<InspectorObject>& graphMetaInformation);
    6464
    6565    virtual void reportMemoryUsage(MemoryObjectInfo*) const;
     
    7373    InspectorMemoryAgent(InstrumentingAgents*, InspectorClient*, InspectorCompositeState*, Page*);
    7474
    75     void getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
     75    PassRefPtr<InspectorObject> getProcessMemoryDistributionImpl(bool reportGraph, HashMap<String, size_t>* memoryInfo);
    7676
    7777    InspectorClient* m_inspectorClient;
  • trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js

    r140953 r143218  
    10271027        }
    10281028
    1029         if (postOrderIndex !== nodeCount)
     1029        if (postOrderIndex !== nodeCount) {
     1030            var dumpNode = this.rootNode();
     1031            for (var i = 0; i < nodeCount; ++i) {
     1032                if (painted[i] !== black) {
     1033                    dumpNode.nodeIndex = i * nodeFieldCount;
     1034                    console.log(JSON.stringify(dumpNode.serialize()));
     1035                    var retainers = dumpNode.retainers();
     1036                    while (retainers) {
     1037                        console.log("edgeName: " + retainers.item().name() + " nodeClassName: " + retainers.item().node().className());
     1038                        retainers = retainers.item().node().retainers();
     1039                    }
     1040                }
     1041            }
    10301042            throw new Error("Postordering failed. " + (nodeCount - postOrderIndex) + " hanging nodes");
     1043        }
    10311044
    10321045        return {postOrderIndex2NodeOrdinal: postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};
  • trunk/Source/WebCore/inspector/front-end/NativeHeapSnapshot.js

    r142074 r143218  
    3636{
    3737    WebInspector.HeapSnapshot.call(this, profile);
    38     this._nodeObjectType = 3;
     38    this._nodeObjectType = this._metaNode.type_strings["object"];
     39    this._edgeWeakType = this._metaNode.type_strings["weak"];
     40    this._edgeElementType = this._metaNode.type_strings["property"];
    3941}
    4042
  • trunk/Source/WebCore/inspector/front-end/NativeMemorySnapshotView.js

    r142473 r143218  
    268268         * @param {?MemoryAgent.MemoryBlock} memoryBlock
    269269         */
    270         function didReceiveMemorySnapshot(error, memoryBlock)
     270        function didReceiveMemorySnapshot(error, memoryBlock, graphMetaInformation)
    271271        {
    272272            this.isTemporary = false;
    273273            this.sidebarElement.subtitle = Number.bytesToString(/** @type{number} */(memoryBlock.size));
    274274
    275             var meta = {
    276               "node_fields": [
    277                 "type",
    278                 "name",
    279                 "id",
    280                 "self_size",
    281                 "edge_count"
    282               ],
    283               "node_types": [
    284                 [
    285                   "hidden",
    286                   "array",
    287                   "string",
    288                   "object",
    289                   "code",
    290                   "closure",
    291                   "regexp",
    292                   "number",
    293                   "native",
    294                   "synthetic"
    295                 ],
    296                 "string",
    297                 "number",
    298                 "number",
    299                 "number",
    300               ],
    301               "edge_fields": [
    302                 "type",
    303                 "name_or_index",
    304                 "to_node"
    305               ],
    306               "edge_types": [
    307                 [
    308                   "context",
    309                   "element",
    310                   "property",
    311                   "internal",
    312                   "hidden",
    313                   "shortcut",
    314                   "weak"
    315                 ],
    316                 "string_or_number",
    317                 "node"
    318               ]
    319             };
    320 
    321             var edgeFieldCount = meta.edge_fields.length;
    322             var nodeFieldCount = meta.node_fields.length;
    323             var nodeIdFieldOffset = meta.node_fields.indexOf("id");
    324             var toNodeIdFieldOffset = meta.edge_fields.indexOf("to_node");
     275            var edgeFieldCount = graphMetaInformation.edge_fields.length;
     276            var nodeFieldCount = graphMetaInformation.node_fields.length;
     277            var nodeIdFieldOffset = graphMetaInformation.node_fields.indexOf("id");
     278            var toNodeIdFieldOffset = graphMetaInformation.edge_fields.indexOf("to_node");
    325279
    326280            var baseToRealNodeIdMap = {};
     
    342296            var heapSnapshot = {
    343297                "snapshot": {
    344                     "meta": meta,
     298                    "meta": graphMetaInformation,
    345299                    node_count: this._nodes.length / nodeFieldCount,
    346300                    edge_count: this._edges.length / edgeFieldCount,
Note: See TracChangeset for help on using the changeset viewer.