OLD | NEW |
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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 | 129 |
130 void BaseArena::takeSnapshot(const String& dumpBaseName, | 130 void BaseArena::takeSnapshot(const String& dumpBaseName, |
131 ThreadState::GCSnapshotInfo& info) { | 131 ThreadState::GCSnapshotInfo& info) { |
132 // |dumpBaseName| at this point is "blink_gc/thread_X/heaps/HeapName" | 132 // |dumpBaseName| at this point is "blink_gc/thread_X/heaps/HeapName" |
133 base::trace_event::MemoryAllocatorDump* allocatorDump = | 133 base::trace_event::MemoryAllocatorDump* allocatorDump = |
134 BlinkGCMemoryDumpProvider::instance() | 134 BlinkGCMemoryDumpProvider::instance() |
135 ->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); | 135 ->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); |
136 size_t pageCount = 0; | 136 size_t pageCount = 0; |
137 BasePage::HeapSnapshotInfo heapInfo; | 137 BasePage::HeapSnapshotInfo heapInfo; |
138 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { | 138 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
139 String dumpName = | 139 String dumpName = dumpBaseName + |
140 dumpBaseName + String::format("/pages/page_%lu", | 140 String::format("/pages/page_%lu", |
141 static_cast<unsigned long>(pageCount++)); | 141 static_cast<unsigned long>(pageCount++)); |
142 base::trace_event::MemoryAllocatorDump* pageDump = | 142 base::trace_event::MemoryAllocatorDump* pageDump = |
143 BlinkGCMemoryDumpProvider::instance() | 143 BlinkGCMemoryDumpProvider::instance() |
144 ->createMemoryAllocatorDumpForCurrentGC(dumpName); | 144 ->createMemoryAllocatorDumpForCurrentGC(dumpName); |
145 | 145 |
146 page->takeSnapshot(pageDump, info, heapInfo); | 146 page->takeSnapshot(pageDump, info, heapInfo); |
147 } | 147 } |
148 allocatorDump->AddScalar("blink_page_count", "objects", pageCount); | 148 allocatorDump->AddScalar("blink_page_count", "objects", pageCount); |
149 | 149 |
150 // 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 |
151 // 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. |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); | 692 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); |
693 freedSize += size; | 693 freedSize += size; |
694 headerAddress += size; | 694 headerAddress += size; |
695 continue; | 695 continue; |
696 } | 696 } |
697 if (header->isFree()) { | 697 if (header->isFree()) { |
698 // Zero the memory in the free list header to maintain the | 698 // Zero the memory in the free list header to maintain the |
699 // invariant that memory on the free list is zero filled. | 699 // invariant that memory on the free list is zero filled. |
700 // The rest of the memory is already on the free list and is | 700 // The rest of the memory is already on the free list and is |
701 // therefore already zero filled. | 701 // therefore already zero filled. |
702 SET_MEMORY_INACCESSIBLE(headerAddress, size < sizeof(FreeListEntry) | 702 SET_MEMORY_INACCESSIBLE( |
703 ? size | 703 headerAddress, |
704 : sizeof(FreeListEntry)); | 704 size < sizeof(FreeListEntry) ? size : sizeof(FreeListEntry)); |
705 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); | 705 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); |
706 headerAddress += size; | 706 headerAddress += size; |
707 continue; | 707 continue; |
708 } | 708 } |
709 ASSERT(header->checkHeader()); | 709 ASSERT(header->checkHeader()); |
710 if (startOfGap != headerAddress) | 710 if (startOfGap != headerAddress) |
711 addToFreeList(startOfGap, headerAddress - startOfGap); | 711 addToFreeList(startOfGap, headerAddress - startOfGap); |
712 | 712 |
713 headerAddress += size; | 713 headerAddress += size; |
714 startOfGap = headerAddress; | 714 startOfGap = headerAddress; |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 bool FreeList::takeSnapshot(const String& dumpBaseName) { | 1210 bool FreeList::takeSnapshot(const String& dumpBaseName) { |
1211 bool didDumpBucketStats = false; | 1211 bool didDumpBucketStats = false; |
1212 for (size_t i = 0; i < blinkPageSizeLog2; ++i) { | 1212 for (size_t i = 0; i < blinkPageSizeLog2; ++i) { |
1213 size_t entryCount = 0; | 1213 size_t entryCount = 0; |
1214 size_t freeSize = 0; | 1214 size_t freeSize = 0; |
1215 for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next()) { | 1215 for (FreeListEntry* entry = m_freeLists[i]; entry; entry = entry->next()) { |
1216 ++entryCount; | 1216 ++entryCount; |
1217 freeSize += entry->size(); | 1217 freeSize += entry->size(); |
1218 } | 1218 } |
1219 | 1219 |
1220 String dumpName = | 1220 String dumpName = dumpBaseName + |
1221 dumpBaseName + String::format("/buckets/bucket_%lu", | 1221 String::format("/buckets/bucket_%lu", |
1222 static_cast<unsigned long>(1 << i)); | 1222 static_cast<unsigned long>(1 << i)); |
1223 base::trace_event::MemoryAllocatorDump* bucketDump = | 1223 base::trace_event::MemoryAllocatorDump* bucketDump = |
1224 BlinkGCMemoryDumpProvider::instance() | 1224 BlinkGCMemoryDumpProvider::instance() |
1225 ->createMemoryAllocatorDumpForCurrentGC(dumpName); | 1225 ->createMemoryAllocatorDumpForCurrentGC(dumpName); |
1226 bucketDump->AddScalar("free_count", "objects", entryCount); | 1226 bucketDump->AddScalar("free_count", "objects", entryCount); |
1227 bucketDump->AddScalar("free_size", "bytes", freeSize); | 1227 bucketDump->AddScalar("free_size", "bytes", freeSize); |
1228 didDumpBucketStats = true; | 1228 didDumpBucketStats = true; |
1229 } | 1229 } |
1230 return didDumpBucketStats; | 1230 return didDumpBucketStats; |
1231 } | 1231 } |
1232 | 1232 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 ASSERT(size > 0); | 1291 ASSERT(size > 0); |
1292 ASSERT(size < blinkPagePayloadSize()); | 1292 ASSERT(size < blinkPagePayloadSize()); |
1293 | 1293 |
1294 if (header->isPromptlyFreed()) | 1294 if (header->isPromptlyFreed()) |
1295 pageArena->decreasePromptlyFreedSize(size); | 1295 pageArena->decreasePromptlyFreedSize(size); |
1296 if (header->isFree()) { | 1296 if (header->isFree()) { |
1297 // Zero the memory in the free list header to maintain the | 1297 // Zero the memory in the free list header to maintain the |
1298 // invariant that memory on the free list is zero filled. | 1298 // invariant that memory on the free list is zero filled. |
1299 // The rest of the memory is already on the free list and is | 1299 // The rest of the memory is already on the free list and is |
1300 // therefore already zero filled. | 1300 // therefore already zero filled. |
1301 SET_MEMORY_INACCESSIBLE(headerAddress, size < sizeof(FreeListEntry) | 1301 SET_MEMORY_INACCESSIBLE( |
1302 ? size | 1302 headerAddress, |
1303 : sizeof(FreeListEntry)); | 1303 size < sizeof(FreeListEntry) ? size : sizeof(FreeListEntry)); |
1304 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); | 1304 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); |
1305 headerAddress += size; | 1305 headerAddress += size; |
1306 continue; | 1306 continue; |
1307 } | 1307 } |
1308 if (!header->isMarked()) { | 1308 if (!header->isMarked()) { |
1309 // This is a fast version of header->payloadSize(). | 1309 // This is a fast version of header->payloadSize(). |
1310 size_t payloadSize = size - sizeof(HeapObjectHeader); | 1310 size_t payloadSize = size - sizeof(HeapObjectHeader); |
1311 Address payload = header->payload(); | 1311 Address payload = header->payload(); |
1312 // For ASan, unpoison the object before calling the finalizer. The | 1312 // For ASan, unpoison the object before calling the finalizer. The |
1313 // finalized object will be zero-filled and poison'ed afterwards. | 1313 // finalized object will be zero-filled and poison'ed afterwards. |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 reinterpret_cast<HeapObjectHeader*>(headerAddress); | 1463 reinterpret_cast<HeapObjectHeader*>(headerAddress); |
1464 size_t size = header->size(); | 1464 size_t size = header->size(); |
1465 ASSERT(size < blinkPagePayloadSize()); | 1465 ASSERT(size < blinkPagePayloadSize()); |
1466 if (header->isPromptlyFreed()) | 1466 if (header->isPromptlyFreed()) |
1467 arenaForNormalPage()->decreasePromptlyFreedSize(size); | 1467 arenaForNormalPage()->decreasePromptlyFreedSize(size); |
1468 if (header->isFree()) { | 1468 if (header->isFree()) { |
1469 // Zero the memory in the free list header to maintain the | 1469 // Zero the memory in the free list header to maintain the |
1470 // invariant that memory on the free list is zero filled. | 1470 // invariant that memory on the free list is zero filled. |
1471 // The rest of the memory is already on the free list and is | 1471 // The rest of the memory is already on the free list and is |
1472 // therefore already zero filled. | 1472 // therefore already zero filled. |
1473 SET_MEMORY_INACCESSIBLE(headerAddress, size < sizeof(FreeListEntry) | 1473 SET_MEMORY_INACCESSIBLE( |
1474 ? size | 1474 headerAddress, |
1475 : sizeof(FreeListEntry)); | 1475 size < sizeof(FreeListEntry) ? size : sizeof(FreeListEntry)); |
1476 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); | 1476 CHECK_MEMORY_INACCESSIBLE(headerAddress, size); |
1477 headerAddress += size; | 1477 headerAddress += size; |
1478 continue; | 1478 continue; |
1479 } | 1479 } |
1480 if (startOfGap != headerAddress) | 1480 if (startOfGap != headerAddress) |
1481 normalArena->addToFreeList(startOfGap, headerAddress - startOfGap); | 1481 normalArena->addToFreeList(startOfGap, headerAddress - startOfGap); |
1482 if (header->isMarked()) | 1482 if (header->isMarked()) |
1483 header->unmark(); | 1483 header->unmark(); |
1484 headerAddress += size; | 1484 headerAddress += size; |
1485 startOfGap = headerAddress; | 1485 startOfGap = headerAddress; |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1814 | 1814 |
1815 m_hasEntries = true; | 1815 m_hasEntries = true; |
1816 size_t index = hash(address); | 1816 size_t index = hash(address); |
1817 ASSERT(!(index & 1)); | 1817 ASSERT(!(index & 1)); |
1818 Address cachePage = roundToBlinkPageStart(address); | 1818 Address cachePage = roundToBlinkPageStart(address); |
1819 m_entries[index + 1] = m_entries[index]; | 1819 m_entries[index + 1] = m_entries[index]; |
1820 m_entries[index] = cachePage; | 1820 m_entries[index] = cachePage; |
1821 } | 1821 } |
1822 | 1822 |
1823 } // namespace blink | 1823 } // namespace blink |
OLD | NEW |