Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: third_party/WebKit/Source/platform/heap/HeapPage.cpp

Issue 1977783002: BlinkGCMemoryDumpProvider should inherit from MemoryDumpProvider directly (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 12 matching lines...) Expand all
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "platform/heap/HeapPage.h" 31 #include "platform/heap/HeapPage.h"
32 32
33 #include "base/trace_event/process_memory_dump.h"
33 #include "platform/ScriptForbiddenScope.h" 34 #include "platform/ScriptForbiddenScope.h"
34 #include "platform/TraceEvent.h" 35 #include "platform/TraceEvent.h"
35 #include "platform/heap/BlinkGCMemoryDumpProvider.h" 36 #include "platform/heap/BlinkGCMemoryDumpProvider.h"
36 #include "platform/heap/CallbackStack.h" 37 #include "platform/heap/CallbackStack.h"
37 #include "platform/heap/Heap.h" 38 #include "platform/heap/Heap.h"
38 #include "platform/heap/MarkingVisitor.h" 39 #include "platform/heap/MarkingVisitor.h"
39 #include "platform/heap/PageMemory.h" 40 #include "platform/heap/PageMemory.h"
40 #include "platform/heap/PagePool.h" 41 #include "platform/heap/PagePool.h"
41 #include "platform/heap/SafePoint.h" 42 #include "platform/heap/SafePoint.h"
42 #include "platform/heap/ThreadState.h" 43 #include "platform/heap/ThreadState.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 for (BasePage* page = m_firstPage; page; page = page->next()) { 129 for (BasePage* page = m_firstPage; page; page = page->next()) {
129 getThreadState()->heap().heapStats().decreaseAllocatedSpace(page->size() ); 130 getThreadState()->heap().heapStats().decreaseAllocatedSpace(page->size() );
130 getThreadState()->heap().getOrphanedPagePool()->addOrphanedPage(arenaInd ex(), page); 131 getThreadState()->heap().getOrphanedPagePool()->addOrphanedPage(arenaInd ex(), page);
131 } 132 }
132 m_firstPage = nullptr; 133 m_firstPage = nullptr;
133 } 134 }
134 135
135 void BaseArena::takeSnapshot(const String& dumpBaseName, ThreadState::GCSnapshot Info& info) 136 void BaseArena::takeSnapshot(const String& dumpBaseName, ThreadState::GCSnapshot Info& info)
136 { 137 {
137 // |dumpBaseName| at this point is "blink_gc/thread_X/heaps/HeapName" 138 // |dumpBaseName| at this point is "blink_gc/thread_X/heaps/HeapName"
138 WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance( )->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); 139 base::trace_event::MemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpPro vider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpBaseName);
139 size_t pageCount = 0; 140 size_t pageCount = 0;
140 BasePage::HeapSnapshotInfo heapInfo; 141 BasePage::HeapSnapshotInfo heapInfo;
141 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { 142 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) {
142 String dumpName = dumpBaseName + String::format("/pages/page_%lu", stati c_cast<unsigned long>(pageCount++)); 143 String dumpName = dumpBaseName + String::format("/pages/page_%lu", stati c_cast<unsigned long>(pageCount++));
143 WebMemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProvider::instance() ->createMemoryAllocatorDumpForCurrentGC(dumpName); 144 base::trace_event::MemoryAllocatorDump* pageDump = BlinkGCMemoryDumpProv ider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName);
144 145
145 page->takeSnapshot(pageDump, info, heapInfo); 146 page->takeSnapshot(pageDump, info, heapInfo);
146 } 147 }
147 allocatorDump->addScalar("blink_page_count", "objects", pageCount); 148 allocatorDump->AddScalar("blink_page_count", "objects", pageCount);
148 149
149 // When taking a full dump (w/ freelist), both the /buckets and /pages 150 // When taking a full dump (w/ freelist), both the /buckets and /pages
150 // report their free size but they are not meant to be added together. 151 // report their free size but they are not meant to be added together.
151 // Therefore, here we override the free_size of the parent heap to be 152 // Therefore, here we override the free_size of the parent heap to be
152 // equal to the free_size of the sum of its heap pages. 153 // equal to the free_size of the sum of its heap pages.
153 allocatorDump->addScalar("free_size", "bytes", heapInfo.freeSize); 154 allocatorDump->AddScalar("free_size", "bytes", heapInfo.freeSize);
154 allocatorDump->addScalar("free_count", "objects", heapInfo.freeCount); 155 allocatorDump->AddScalar("free_count", "objects", heapInfo.freeCount);
155 } 156 }
156 157
157 #if ENABLE(ASSERT) 158 #if ENABLE(ASSERT)
158 BasePage* BaseArena::findPageFromAddress(Address address) 159 BasePage* BaseArena::findPageFromAddress(Address address)
159 { 160 {
160 for (BasePage* page = m_firstPage; page; page = page->next()) { 161 for (BasePage* page = m_firstPage; page; page = page->next()) {
161 if (page->contains(address)) 162 if (page->contains(address))
162 return page; 163 return page;
163 } 164 }
164 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { 165 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 if (page->contains(address)) 383 if (page->contains(address))
383 return true; 384 return true;
384 } 385 }
385 return false; 386 return false;
386 } 387 }
387 #endif 388 #endif
388 389
389 void NormalPageArena::takeFreelistSnapshot(const String& dumpName) 390 void NormalPageArena::takeFreelistSnapshot(const String& dumpName)
390 { 391 {
391 if (m_freeList.takeSnapshot(dumpName)) { 392 if (m_freeList.takeSnapshot(dumpName)) {
392 WebMemoryAllocatorDump* bucketsDump = BlinkGCMemoryDumpProvider::instanc e()->createMemoryAllocatorDumpForCurrentGC(dumpName + "/buckets"); 393 base::trace_event::MemoryAllocatorDump* bucketsDump = BlinkGCMemoryDumpP rovider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName + "/buckets" );
393 WebMemoryAllocatorDump* pagesDump = BlinkGCMemoryDumpProvider::instance( )->createMemoryAllocatorDumpForCurrentGC(dumpName + "/pages"); 394 base::trace_event::MemoryAllocatorDump* pagesDump = BlinkGCMemoryDumpPro vider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName + "/pages");
394 BlinkGCMemoryDumpProvider::instance()->currentProcessMemoryDump()->addOw nershipEdge(pagesDump->guid(), bucketsDump->guid()); 395 BlinkGCMemoryDumpProvider::instance()->currentProcessMemoryDump()->AddOw nershipEdge(pagesDump->guid(), bucketsDump->guid());
395 } 396 }
396 } 397 }
397 398
398 void NormalPageArena::allocatePage() 399 void NormalPageArena::allocatePage()
399 { 400 {
400 getThreadState()->shouldFlushHeapDoesNotContainCache(); 401 getThreadState()->shouldFlushHeapDoesNotContainCache();
401 PageMemory* pageMemory = getThreadState()->heap().getFreePagePool()->takeFre ePage(arenaIndex()); 402 PageMemory* pageMemory = getThreadState()->heap().getFreePagePool()->takeFre ePage(arenaIndex());
402 403
403 if (!pageMemory) { 404 if (!pageMemory) {
404 // Allocate a memory region for blinkPagesPerRegion pages that 405 // Allocate a memory region for blinkPagesPerRegion pages that
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 bool didDumpBucketStats = false; 1013 bool didDumpBucketStats = false;
1013 for (size_t i = 0; i < blinkPageSizeLog2; ++i) { 1014 for (size_t i = 0; i < blinkPageSizeLog2; ++i) {
1014 size_t entryCount = 0; 1015 size_t entryCount = 0;
1015 size_t freeSize = 0; 1016 size_t freeSize = 0;
1016 for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next() ) { 1017 for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next() ) {
1017 ++entryCount; 1018 ++entryCount;
1018 freeSize += entry->size(); 1019 freeSize += entry->size();
1019 } 1020 }
1020 1021
1021 String dumpName = dumpBaseName + String::format("/buckets/bucket_%lu", s tatic_cast<unsigned long>(1 << i)); 1022 String dumpName = dumpBaseName + String::format("/buckets/bucket_%lu", s tatic_cast<unsigned long>(1 << i));
1022 WebMemoryAllocatorDump* bucketDump = BlinkGCMemoryDumpProvider::instance ()->createMemoryAllocatorDumpForCurrentGC(dumpName); 1023 base::trace_event::MemoryAllocatorDump* bucketDump = BlinkGCMemoryDumpPr ovider::instance()->createMemoryAllocatorDumpForCurrentGC(dumpName);
1023 bucketDump->addScalar("free_count", "objects", entryCount); 1024 bucketDump->AddScalar("free_count", "objects", entryCount);
1024 bucketDump->addScalar("free_size", "bytes", freeSize); 1025 bucketDump->AddScalar("free_size", "bytes", freeSize);
1025 didDumpBucketStats = true; 1026 didDumpBucketStats = true;
1026 } 1027 }
1027 return didDumpBucketStats; 1028 return didDumpBucketStats;
1028 } 1029 }
1029 1030
1030 BasePage::BasePage(PageMemory* storage, BaseArena* arena) 1031 BasePage::BasePage(PageMemory* storage, BaseArena* arena)
1031 : m_storage(storage) 1032 : m_storage(storage)
1032 , m_arena(arena) 1033 , m_arena(arena)
1033 , m_next(nullptr) 1034 , m_next(nullptr)
1034 , m_terminating(false) 1035 , m_terminating(false)
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1353 // cross thread pointer usage. 1354 // cross thread pointer usage.
1354 #if defined(ADDRESS_SANITIZER) 1355 #if defined(ADDRESS_SANITIZER)
1355 // This needs to zap poisoned memory as well. 1356 // This needs to zap poisoned memory as well.
1356 // Force unpoison memory before memset. 1357 // Force unpoison memory before memset.
1357 ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize()); 1358 ASAN_UNPOISON_MEMORY_REGION(payload(), payloadSize());
1358 #endif 1359 #endif
1359 OrphanedPagePool::asanDisabledMemset(payload(), OrphanedPagePool::orphanedZa pValue, payloadSize()); 1360 OrphanedPagePool::asanDisabledMemset(payload(), OrphanedPagePool::orphanedZa pValue, payloadSize());
1360 BasePage::markOrphaned(); 1361 BasePage::markOrphaned();
1361 } 1362 }
1362 1363
1363 void NormalPage::takeSnapshot(WebMemoryAllocatorDump* pageDump, ThreadState::GCS napshotInfo& info, HeapSnapshotInfo& heapInfo) 1364 void NormalPage::takeSnapshot(base::trace_event::MemoryAllocatorDump* pageDump, ThreadState::GCSnapshotInfo& info, HeapSnapshotInfo& heapInfo)
1364 { 1365 {
1365 HeapObjectHeader* header = nullptr; 1366 HeapObjectHeader* header = nullptr;
1366 size_t liveCount = 0; 1367 size_t liveCount = 0;
1367 size_t deadCount = 0; 1368 size_t deadCount = 0;
1368 size_t freeCount = 0; 1369 size_t freeCount = 0;
1369 size_t liveSize = 0; 1370 size_t liveSize = 0;
1370 size_t deadSize = 0; 1371 size_t deadSize = 0;
1371 size_t freeSize = 0; 1372 size_t freeSize = 0;
1372 for (Address headerAddress = payload(); headerAddress < payloadEnd(); header Address += header->size()) { 1373 for (Address headerAddress = payload(); headerAddress < payloadEnd(); header Address += header->size()) {
1373 header = reinterpret_cast<HeapObjectHeader*>(headerAddress); 1374 header = reinterpret_cast<HeapObjectHeader*>(headerAddress);
(...skipping 10 matching lines...) Expand all
1384 } else { 1385 } else {
1385 deadCount++; 1386 deadCount++;
1386 deadSize += header->size(); 1387 deadSize += header->size();
1387 1388
1388 size_t gcInfoIndex = header->gcInfoIndex(); 1389 size_t gcInfoIndex = header->gcInfoIndex();
1389 info.deadCount[gcInfoIndex]++; 1390 info.deadCount[gcInfoIndex]++;
1390 info.deadSize[gcInfoIndex] += header->size(); 1391 info.deadSize[gcInfoIndex] += header->size();
1391 } 1392 }
1392 } 1393 }
1393 1394
1394 pageDump->addScalar("live_count", "objects", liveCount); 1395 pageDump->AddScalar("live_count", "objects", liveCount);
1395 pageDump->addScalar("dead_count", "objects", deadCount); 1396 pageDump->AddScalar("dead_count", "objects", deadCount);
1396 pageDump->addScalar("free_count", "objects", freeCount); 1397 pageDump->AddScalar("free_count", "objects", freeCount);
1397 pageDump->addScalar("live_size", "bytes", liveSize); 1398 pageDump->AddScalar("live_size", "bytes", liveSize);
1398 pageDump->addScalar("dead_size", "bytes", deadSize); 1399 pageDump->AddScalar("dead_size", "bytes", deadSize);
1399 pageDump->addScalar("free_size", "bytes", freeSize); 1400 pageDump->AddScalar("free_size", "bytes", freeSize);
1400 heapInfo.freeSize += freeSize; 1401 heapInfo.freeSize += freeSize;
1401 heapInfo.freeCount += freeCount; 1402 heapInfo.freeCount += freeCount;
1402 } 1403 }
1403 1404
1404 #if ENABLE(ASSERT) 1405 #if ENABLE(ASSERT)
1405 bool NormalPage::contains(Address addr) 1406 bool NormalPage::contains(Address addr)
1406 { 1407 {
1407 Address blinkPageStart = roundToBlinkPageStart(getAddress()); 1408 Address blinkPageStart = roundToBlinkPageStart(getAddress());
1408 ASSERT(blinkPageStart == getAddress() - blinkGuardPageSize); // Page is at a ligned address plus guard page size. 1409 ASSERT(blinkPageStart == getAddress() - blinkGuardPageSize); // Page is at a ligned address plus guard page size.
1409 return blinkPageStart <= addr && addr < blinkPageStart + blinkPageSize; 1410 return blinkPageStart <= addr && addr < blinkPageStart + blinkPageSize;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 } 1483 }
1483 1484
1484 void LargeObjectPage::markOrphaned() 1485 void LargeObjectPage::markOrphaned()
1485 { 1486 {
1486 // Zap the payload with a recognizable value to detect any incorrect 1487 // Zap the payload with a recognizable value to detect any incorrect
1487 // cross thread pointer usage. 1488 // cross thread pointer usage.
1488 OrphanedPagePool::asanDisabledMemset(payload(), OrphanedPagePool::orphanedZa pValue, payloadSize()); 1489 OrphanedPagePool::asanDisabledMemset(payload(), OrphanedPagePool::orphanedZa pValue, payloadSize());
1489 BasePage::markOrphaned(); 1490 BasePage::markOrphaned();
1490 } 1491 }
1491 1492
1492 void LargeObjectPage::takeSnapshot(WebMemoryAllocatorDump* pageDump, ThreadState ::GCSnapshotInfo& info, HeapSnapshotInfo&) 1493 void LargeObjectPage::takeSnapshot(base::trace_event::MemoryAllocatorDump* pageD ump, ThreadState::GCSnapshotInfo& info, HeapSnapshotInfo&)
1493 { 1494 {
1494 size_t liveSize = 0; 1495 size_t liveSize = 0;
1495 size_t deadSize = 0; 1496 size_t deadSize = 0;
1496 size_t liveCount = 0; 1497 size_t liveCount = 0;
1497 size_t deadCount = 0; 1498 size_t deadCount = 0;
1498 HeapObjectHeader* header = heapObjectHeader(); 1499 HeapObjectHeader* header = heapObjectHeader();
1499 size_t gcInfoIndex = header->gcInfoIndex(); 1500 size_t gcInfoIndex = header->gcInfoIndex();
1500 size_t payloadSize = header->payloadSize(); 1501 size_t payloadSize = header->payloadSize();
1501 if (header->isMarked()) { 1502 if (header->isMarked()) {
1502 liveCount = 1; 1503 liveCount = 1;
1503 liveSize += payloadSize; 1504 liveSize += payloadSize;
1504 info.liveCount[gcInfoIndex]++; 1505 info.liveCount[gcInfoIndex]++;
1505 info.liveSize[gcInfoIndex] += payloadSize; 1506 info.liveSize[gcInfoIndex] += payloadSize;
1506 } else { 1507 } else {
1507 deadCount = 1; 1508 deadCount = 1;
1508 deadSize += payloadSize; 1509 deadSize += payloadSize;
1509 info.deadCount[gcInfoIndex]++; 1510 info.deadCount[gcInfoIndex]++;
1510 info.deadSize[gcInfoIndex] += payloadSize; 1511 info.deadSize[gcInfoIndex] += payloadSize;
1511 } 1512 }
1512 1513
1513 pageDump->addScalar("live_count", "objects", liveCount); 1514 pageDump->AddScalar("live_count", "objects", liveCount);
1514 pageDump->addScalar("dead_count", "objects", deadCount); 1515 pageDump->AddScalar("dead_count", "objects", deadCount);
1515 pageDump->addScalar("live_size", "bytes", liveSize); 1516 pageDump->AddScalar("live_size", "bytes", liveSize);
1516 pageDump->addScalar("dead_size", "bytes", deadSize); 1517 pageDump->AddScalar("dead_size", "bytes", deadSize);
1517 } 1518 }
1518 1519
1519 #if ENABLE(ASSERT) 1520 #if ENABLE(ASSERT)
1520 bool LargeObjectPage::contains(Address object) 1521 bool LargeObjectPage::contains(Address object)
1521 { 1522 {
1522 return roundToBlinkPageStart(getAddress()) <= object && object < roundToBlin kPageEnd(getAddress() + size()); 1523 return roundToBlinkPageStart(getAddress()) <= object && object < roundToBlin kPageEnd(getAddress() + size());
1523 } 1524 }
1524 #endif 1525 #endif
1525 1526
1526 void HeapDoesNotContainCache::flush() 1527 void HeapDoesNotContainCache::flush()
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 1562
1562 m_hasEntries = true; 1563 m_hasEntries = true;
1563 size_t index = hash(address); 1564 size_t index = hash(address);
1564 ASSERT(!(index & 1)); 1565 ASSERT(!(index & 1));
1565 Address cachePage = roundToBlinkPageStart(address); 1566 Address cachePage = roundToBlinkPageStart(address);
1566 m_entries[index + 1] = m_entries[index]; 1567 m_entries[index + 1] = m_entries[index];
1567 m_entries[index] = cachePage; 1568 m_entries[index] = cachePage;
1568 } 1569 }
1569 1570
1570 } // namespace blink 1571 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/heap/HeapPage.h ('k') | third_party/WebKit/Source/platform/heap/ThreadState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698