Changeset 143175 in webkit


Ignore:
Timestamp:
Feb 18, 2013 1:54:33 AM (11 years ago)
Author:
loislo@chromium.org
Message:

Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
https://bugs.webkit.org/show_bug.cgi?id=109554

In some cases leaves have no pointer so with the old schema we can't generate nodeId for them because we
can't insert 0 into hashmap. It happens when we call addPrivateBuffer method.

Drive by fix: I introduced a client interface for the HeapGraphSerializer.
It helps me to do the tests for the serializer.

Reviewed by Yury Semikhatsky.

It is covered by newly added tests in TestWebKitAPI.

Source/WebCore:

  • inspector/HeapGraphSerializer.cpp:

(WebCore::HeapGraphSerializer::HeapGraphSerializer):
(WebCore::HeapGraphSerializer::pushUpdate):
(WebCore::HeapGraphSerializer::reportNode):
(WebCore::HeapGraphSerializer::toNodeId):
(WebCore::HeapGraphSerializer::addRootNode):

  • inspector/HeapGraphSerializer.h:

(HeapGraphSerializer):
(Client):
(WebCore::HeapGraphSerializer::Client::~Client):

  • inspector/InspectorMemoryAgent.cpp:

(WebCore):
(WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):

Tools:

  • TestWebKitAPI/TestWebKitAPI.gypi:
  • TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Added.

(TestWebKitAPI):
(HeapGraphReceiver):
(TestWebKitAPI::HeapGraphReceiver::HeapGraphReceiver):
(TestWebKitAPI::HeapGraphReceiver::printGraph):
(TestWebKitAPI::HeapGraphReceiver::dumpNodes):
(TestWebKitAPI::HeapGraphReceiver::dumpEdges):
(TestWebKitAPI::HeapGraphReceiver::dumpBaseToRealNodeId):
(TestWebKitAPI::HeapGraphReceiver::dumpStrings):
(TestWebKitAPI::HeapGraphReceiver::serializer):
(TestWebKitAPI::HeapGraphReceiver::chunkPart):
(TestWebKitAPI::HeapGraphReceiver::dumpPart):
(TestWebKitAPI::HeapGraphReceiver::stringValue):
(TestWebKitAPI::HeapGraphReceiver::intValue):
(TestWebKitAPI::HeapGraphReceiver::nodeToString):
(TestWebKitAPI::HeapGraphReceiver::edgeToString):
(TestWebKitAPI::HeapGraphReceiver::printNode):
(Helper):
(TestWebKitAPI::Helper::Helper):
(TestWebKitAPI::Helper::addNode):
(TestWebKitAPI::Helper::addEdge):
(TestWebKitAPI::Helper::done):
(Object):
(TestWebKitAPI::Helper::Object::Object):
(TestWebKitAPI::TEST):
(Owner):
(TestWebKitAPI::Owner::Owner):
(TestWebKitAPI::Owner::reportMemoryUsage):

Location:
trunk
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r143174 r143175  
     12013-02-13  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
     4        https://bugs.webkit.org/show_bug.cgi?id=109554
     5
     6        In some cases leaves have no pointer so with the old schema we can't generate nodeId for them because we
     7        can't insert 0 into hashmap. It happens when we call addPrivateBuffer method.
     8
     9        Drive by fix: I introduced a client interface for the HeapGraphSerializer.
     10        It helps me to do the tests for the serializer.
     11
     12        Reviewed by Yury Semikhatsky.
     13
     14        It is covered by newly added tests in TestWebKitAPI.
     15
     16        * inspector/HeapGraphSerializer.cpp:
     17        (WebCore::HeapGraphSerializer::HeapGraphSerializer):
     18        (WebCore::HeapGraphSerializer::pushUpdate):
     19        (WebCore::HeapGraphSerializer::reportNode):
     20        (WebCore::HeapGraphSerializer::toNodeId):
     21        (WebCore::HeapGraphSerializer::addRootNode):
     22        * inspector/HeapGraphSerializer.h:
     23        (HeapGraphSerializer):
     24        (Client):
     25        (WebCore::HeapGraphSerializer::Client::~Client):
     26        * inspector/InspectorMemoryAgent.cpp:
     27        (WebCore):
     28        (WebCore::InspectorMemoryAgent::getProcessMemoryDistributionImpl):
     29
    1302013-02-18  Sheriff Bot  <webkit.review.bot@gmail.com>
    231
  • trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp

    r142795 r143175  
    4444namespace WebCore {
    4545
    46 HeapGraphSerializer::HeapGraphSerializer(InspectorFrontend::Memory* frontend)
    47     : m_frontend(frontend)
     46HeapGraphSerializer::HeapGraphSerializer(Client* client)
     47    : m_client(client)
    4848    , m_strings(Strings::create())
    4949    , m_edges(Edges::create())
     
    5151    , m_nodes(Nodes::create())
    5252    , m_baseToRealNodeIdMap(BaseToRealNodeIdMap::create())
    53 {
    54     ASSERT(m_frontend);
     53    , m_leafCount(0)
     54{
     55    ASSERT(m_client);
    5556    m_strings->addItem(String()); // An empty string with 0 index.
    5657
     
    9293        .setBaseToRealNodeId(m_baseToRealNodeIdMap.release());
    9394
    94     m_frontend->addNativeSnapshotChunk(chunk);
     95    m_client->addNativeSnapshotChunk(chunk.release());
    9596
    9697    m_strings = Strings::create();
     
    102103void HeapGraphSerializer::reportNode(const WTF::MemoryObjectInfo& info)
    103104{
     105    ASSERT(info.reportedPointer());
    104106    reportNodeImpl(info, m_nodeEdgesCount);
    105107    m_nodeEdgesCount = 0;
     
    183185int HeapGraphSerializer::toNodeId(const void* to)
    184186{
    185     ASSERT(to);
    186     Address2NodeId::AddResult result = m_address2NodeIdMap.add(to, m_address2NodeIdMap.size());
     187    if (!to)
     188        return s_firstNodeId + m_address2NodeIdMap.size() + m_leafCount++;
     189
     190    Address2NodeId::AddResult result = m_address2NodeIdMap.add(to, s_firstNodeId + m_leafCount + m_address2NodeIdMap.size());
    187191    return result.iterator->value;
    188192}
     
    195199    m_nodes->addItem(addString("Root"));
    196200    m_nodes->addItem(0);
    197     m_nodes->addItem(m_address2NodeIdMap.size());
     201    m_nodes->addItem(s_firstNodeId + m_address2NodeIdMap.size() + m_leafCount);
    198202    m_nodes->addItem(0);
    199203    m_nodes->addItem(m_roots.size());
  • trunk/Source/WebCore/inspector/HeapGraphSerializer.h

    r142795 r143175  
    4444namespace WebCore {
    4545
    46 class HeapGraphEdge;
    47 class HeapGraphNode;
    48 class InspectorObject;
    49 
    5046class HeapGraphSerializer {
    5147    WTF_MAKE_NONCOPYABLE(HeapGraphSerializer);
    5248public:
    53     explicit HeapGraphSerializer(InspectorFrontend::Memory*);
     49
     50    class Client {
     51    public:
     52        virtual ~Client() { }
     53        virtual void addNativeSnapshotChunk(PassRefPtr<TypeBuilder::Memory::HeapSnapshotChunk>) = 0;
     54    };
     55
     56    explicit HeapGraphSerializer(Client*);
    5457    ~HeapGraphSerializer();
    5558    void reportNode(const WTF::MemoryObjectInfo&);
     
    7477    int reportNodeImpl(const WTF::MemoryObjectInfo&, int edgesCount);
    7578
    76     InspectorFrontend::Memory* m_frontend;
     79    Client* m_client;
    7780
    7881    typedef HashMap<String, int> StringMap;
     
    101104    size_t m_edgeTypes[WTF::LastMemberTypeEntry];
    102105    int m_unknownClassNameId;
     106    int m_leafCount;
     107
     108    static const int s_firstNodeId = 1;
    103109};
    104110
  • trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp

    r142858 r143175  
    334334}
    335335
     336namespace {
     337
     338class FrontendWrapper : public HeapGraphSerializer::Client {
     339public:
     340    explicit FrontendWrapper(InspectorFrontend::Memory* frontend) : m_frontend(frontend) { }
     341    virtual void addNativeSnapshotChunk(PassRefPtr<TypeBuilder::Memory::HeapSnapshotChunk> heapSnapshotChunk) OVERRIDE
     342    {
     343        m_frontend->addNativeSnapshotChunk(heapSnapshotChunk);
     344    }
     345private:
     346    InspectorFrontend::Memory* m_frontend;
     347};
     348
     349}
     350
    336351void InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
    337352{
    338353    OwnPtr<HeapGraphSerializer> graphSerializer;
    339     if (reportGraph)
    340         graphSerializer = adoptPtr(new HeapGraphSerializer(m_frontend));
     354    OwnPtr<FrontendWrapper> frontendWrapper;
     355
     356    if (reportGraph) {
     357        frontendWrapper = adoptPtr(new FrontendWrapper(m_frontend));
     358        graphSerializer = adoptPtr(new HeapGraphSerializer(frontendWrapper.get()));
     359    }
     360
    341361    MemoryInstrumentationClientImpl memoryInstrumentationClient(graphSerializer.get());
    342362    m_inspectorClient->getAllocatedObjects(memoryInstrumentationClient.allocatedObjects());
     
    356376        memoryInstrumentation.addRootObject(graphSerializer.get());
    357377        graphSerializer->finish();
     378        graphSerializer.release(); // Release it earlier than frontendWrapper
     379        frontendWrapper.release();
    358380    }
    359381
  • trunk/Tools/ChangeLog

    r143162 r143175  
     12013-02-13  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: Native Memory Instrumentation: reportLeaf method doesn't report the leaf node properly.
     4        https://bugs.webkit.org/show_bug.cgi?id=109554
     5
     6        In some cases leaves have no pointer so with the old schema we can't generate nodeId for them because we
     7        can't insert 0 into hashmap. It happens when we call addPrivateBuffer method.
     8
     9        Drive by fix: I introduced a client interface for the HeapGraphSerializer.
     10        It helps me to do the tests for the serializer.
     11
     12        Reviewed by Yury Semikhatsky.
     13
     14        It is covered by newly added tests in TestWebKitAPI.
     15
     16        * TestWebKitAPI/TestWebKitAPI.gypi:
     17        * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: Added.
     18        (TestWebKitAPI):
     19        (HeapGraphReceiver):
     20        (TestWebKitAPI::HeapGraphReceiver::HeapGraphReceiver):
     21        (TestWebKitAPI::HeapGraphReceiver::printGraph):
     22        (TestWebKitAPI::HeapGraphReceiver::dumpNodes):
     23        (TestWebKitAPI::HeapGraphReceiver::dumpEdges):
     24        (TestWebKitAPI::HeapGraphReceiver::dumpBaseToRealNodeId):
     25        (TestWebKitAPI::HeapGraphReceiver::dumpStrings):
     26        (TestWebKitAPI::HeapGraphReceiver::serializer):
     27        (TestWebKitAPI::HeapGraphReceiver::chunkPart):
     28        (TestWebKitAPI::HeapGraphReceiver::dumpPart):
     29        (TestWebKitAPI::HeapGraphReceiver::stringValue):
     30        (TestWebKitAPI::HeapGraphReceiver::intValue):
     31        (TestWebKitAPI::HeapGraphReceiver::nodeToString):
     32        (TestWebKitAPI::HeapGraphReceiver::edgeToString):
     33        (TestWebKitAPI::HeapGraphReceiver::printNode):
     34        (Helper):
     35        (TestWebKitAPI::Helper::Helper):
     36        (TestWebKitAPI::Helper::addNode):
     37        (TestWebKitAPI::Helper::addEdge):
     38        (TestWebKitAPI::Helper::done):
     39        (Object):
     40        (TestWebKitAPI::Helper::Object::Object):
     41        (TestWebKitAPI::TEST):
     42        (Owner):
     43        (TestWebKitAPI::Owner::Owner):
     44        (TestWebKitAPI::Owner::reportMemoryUsage):
     45
    1462013-02-18  Ryosuke Niwa  <rniwa@webkit.org>
    247
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.gyp/TestWebKitAPI.gyp

    r139895 r143175  
    7878            ],
    7979            'conditions': [
     80                ['component!="shared_library"', {
     81                    'sources': [
     82                        '../Tests/WebCore/HeapGraphSerializerTest.cpp'
     83                    ],
     84                }],
    8085                ['inside_chromium_build==1 and component=="shared_library"', {
    8186                    'sources': [
Note: See TracChangeset for help on using the changeset viewer.