Changeset 142747 in webkit


Ignore:
Timestamp:
Feb 13, 2013 7:30:22 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

    r142746 r142747  
     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-13  Yury Semikhatsky  <yurys@chromium.org>
    231
  • trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp

    r142637 r142747  
    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

    r142637 r142747  
    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

    r142637 r142747  
    331331}
    332332
     333namespace {
     334
     335class FrontendWrapper : public HeapGraphSerializer::Client {
     336public:
     337    explicit FrontendWrapper(InspectorFrontend::Memory* frontend) : m_frontend(frontend) { }
     338    virtual void addNativeSnapshotChunk(PassRefPtr<TypeBuilder::Memory::HeapSnapshotChunk> heapSnapshotChunk) OVERRIDE
     339    {
     340        m_frontend->addNativeSnapshotChunk(heapSnapshotChunk);
     341    }
     342private:
     343    InspectorFrontend::Memory* m_frontend;
     344};
     345
     346}
     347
    333348void InspectorMemoryAgent::getProcessMemoryDistributionImpl(bool reportGraph, TypeNameToSizeMap* memoryInfo)
    334349{
    335350    OwnPtr<HeapGraphSerializer> graphSerializer;
    336     if (reportGraph)
    337         graphSerializer = adoptPtr(new HeapGraphSerializer(m_frontend));
     351    OwnPtr<FrontendWrapper> frontendWrapper;
     352
     353    if (reportGraph) {
     354        frontendWrapper = adoptPtr(new FrontendWrapper(m_frontend));
     355        graphSerializer = adoptPtr(new HeapGraphSerializer(frontendWrapper.get()));
     356    }
     357
    338358    MemoryInstrumentationClientImpl memoryInstrumentationClient(graphSerializer.get());
    339359    m_inspectorClient->getAllocatedObjects(memoryInstrumentationClient.allocatedObjects());
     
    353373        memoryInstrumentation.addRootObject(graphSerializer.get());
    354374        graphSerializer->finish();
     375        graphSerializer.release(); // Release it earlier than frontendWrapper
     376        frontendWrapper.release();
    355377    }
    356378
  • trunk/Tools/ChangeLog

    r142736 r142747  
     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-13  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
    247
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.gypi

    r142637 r142747  
    3232    'variables': {
    3333        'TestWebKitAPI_files': [
     34            'Tests/WebCore/HeapGraphSerializerTest.cpp',
    3435            'Tests/WebCore/LayoutUnit.cpp',
    3536            'Tests/WTF/AtomicString.cpp',
Note: See TracChangeset for help on using the changeset viewer.