| 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 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 { | 307 { |
| 308 ASSERT(threadState()->isInGC()); | 308 ASSERT(threadState()->isInGC()); |
| 309 ASSERT(!m_firstUnsweptPage); | 309 ASSERT(!m_firstUnsweptPage); |
| 310 | 310 |
| 311 // Move all pages to a list of unswept pages. | 311 // Move all pages to a list of unswept pages. |
| 312 m_firstUnsweptPage = m_firstPage; | 312 m_firstUnsweptPage = m_firstPage; |
| 313 m_firstPage = nullptr; | 313 m_firstPage = nullptr; |
| 314 } | 314 } |
| 315 | 315 |
| 316 #if defined(ADDRESS_SANITIZER) | 316 #if defined(ADDRESS_SANITIZER) |
| 317 void BaseHeap::poisonHeap(ThreadState::ObjectsToPoison objectsToPoison, ThreadSt
ate::Poisoning poisoning) | 317 void BaseHeap::poisonHeap(BlinkGC::ObjectsToPoison objectsToPoison, BlinkGC::Poi
soning poisoning) |
| 318 { | 318 { |
| 319 // TODO(sof): support complete poisoning of all heaps. | 319 // TODO(sof): support complete poisoning of all heaps. |
| 320 ASSERT(objectsToPoison != ThreadState::MarkedAndUnmarked || heapIndex() == T
hreadState::EagerSweepHeapIndex); | 320 ASSERT(objectsToPoison != BlinkGC::MarkedAndUnmarked || heapIndex() == Blink
GC::EagerSweepHeapIndex); |
| 321 | 321 |
| 322 // This method may either be called to poison (SetPoison) heap | 322 // This method may either be called to poison (SetPoison) heap |
| 323 // object payloads prior to sweeping, or it may be called at | 323 // object payloads prior to sweeping, or it may be called at |
| 324 // the completion of a sweep to unpoison (ClearPoison) the | 324 // the completion of a sweep to unpoison (ClearPoison) the |
| 325 // objects remaining in the heap. Those will all be live and unmarked. | 325 // objects remaining in the heap. Those will all be live and unmarked. |
| 326 // | 326 // |
| 327 // Poisoning may be limited to unmarked objects only, or apply to all. | 327 // Poisoning may be limited to unmarked objects only, or apply to all. |
| 328 if (poisoning == ThreadState::SetPoison) { | 328 if (poisoning == BlinkGC::SetPoison) { |
| 329 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) | 329 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) |
| 330 page->poisonObjects(objectsToPoison, poisoning); | 330 page->poisonObjects(objectsToPoison, poisoning); |
| 331 return; | 331 return; |
| 332 } | 332 } |
| 333 // Support clearing of poisoning after sweeping has completed, | 333 // Support clearing of poisoning after sweeping has completed, |
| 334 // in which case the pages of the live objects are reachable | 334 // in which case the pages of the live objects are reachable |
| 335 // via m_firstPage. | 335 // via m_firstPage. |
| 336 ASSERT(!m_firstUnsweptPage); | 336 ASSERT(!m_firstUnsweptPage); |
| 337 for (BasePage* page = m_firstPage; page; page = page->next()) | 337 for (BasePage* page = m_firstPage; page; page = page->next()) |
| 338 page->poisonObjects(objectsToPoison, poisoning); | 338 page->poisonObjects(objectsToPoison, poisoning); |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 797 ASSERT(allocationSize > remainingAllocationSize()); | 797 ASSERT(allocationSize > remainingAllocationSize()); |
| 798 ASSERT(allocationSize >= allocationGranularity); | 798 ASSERT(allocationSize >= allocationGranularity); |
| 799 | 799 |
| 800 #if ENABLE(GC_PROFILING) | 800 #if ENABLE(GC_PROFILING) |
| 801 threadState()->snapshotFreeListIfNecessary(); | 801 threadState()->snapshotFreeListIfNecessary(); |
| 802 #endif | 802 #endif |
| 803 | 803 |
| 804 // 1. If this allocation is big enough, allocate a large object. | 804 // 1. If this allocation is big enough, allocate a large object. |
| 805 if (allocationSize >= largeObjectSizeThreshold) { | 805 if (allocationSize >= largeObjectSizeThreshold) { |
| 806 // TODO(sof): support eagerly finalized large objects, if ever needed. | 806 // TODO(sof): support eagerly finalized large objects, if ever needed. |
| 807 RELEASE_ASSERT(heapIndex() != ThreadState::EagerSweepHeapIndex); | 807 RELEASE_ASSERT(heapIndex() != BlinkGC::EagerSweepHeapIndex); |
| 808 LargeObjectHeap* largeObjectHeap = static_cast<LargeObjectHeap*>(threadS
tate()->heap(ThreadState::LargeObjectHeapIndex)); | 808 LargeObjectHeap* largeObjectHeap = static_cast<LargeObjectHeap*>(threadS
tate()->heap(BlinkGC::LargeObjectHeapIndex)); |
| 809 Address largeObject = largeObjectHeap->allocateLargeObjectPage(allocatio
nSize, gcInfoIndex); | 809 Address largeObject = largeObjectHeap->allocateLargeObjectPage(allocatio
nSize, gcInfoIndex); |
| 810 ASAN_MARK_LARGE_VECTOR_CONTAINER(this, largeObject); | 810 ASAN_MARK_LARGE_VECTOR_CONTAINER(this, largeObject); |
| 811 return largeObject; | 811 return largeObject; |
| 812 } | 812 } |
| 813 | 813 |
| 814 // 2. Try to allocate from a free list. | 814 // 2. Try to allocate from a free list. |
| 815 updateRemainingAllocationSize(); | 815 updateRemainingAllocationSize(); |
| 816 Address result = allocateFromFreeList(allocationSize, gcInfoIndex); | 816 Address result = allocateFromFreeList(allocationSize, gcInfoIndex); |
| 817 if (result) | 817 if (result) |
| 818 return result; | 818 return result; |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 header->unmark(); | 1330 header->unmark(); |
| 1331 headerAddress += size; | 1331 headerAddress += size; |
| 1332 startOfGap = headerAddress; | 1332 startOfGap = headerAddress; |
| 1333 ASSERT(headerAddress <= payloadEnd()); | 1333 ASSERT(headerAddress <= payloadEnd()); |
| 1334 } | 1334 } |
| 1335 if (startOfGap != payloadEnd()) | 1335 if (startOfGap != payloadEnd()) |
| 1336 heapForNormalPage()->addToFreeList(startOfGap, payloadEnd() - startOfGap
); | 1336 heapForNormalPage()->addToFreeList(startOfGap, payloadEnd() - startOfGap
); |
| 1337 } | 1337 } |
| 1338 | 1338 |
| 1339 #if defined(ADDRESS_SANITIZER) | 1339 #if defined(ADDRESS_SANITIZER) |
| 1340 void NormalPage::poisonObjects(ThreadState::ObjectsToPoison objectsToPoison, Thr
eadState::Poisoning poisoning) | 1340 void NormalPage::poisonObjects(BlinkGC::ObjectsToPoison objectsToPoison, BlinkGC
::Poisoning poisoning) |
| 1341 { | 1341 { |
| 1342 for (Address headerAddress = payload(); headerAddress < payloadEnd();) { | 1342 for (Address headerAddress = payload(); headerAddress < payloadEnd();) { |
| 1343 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(headerAdd
ress); | 1343 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(headerAdd
ress); |
| 1344 ASSERT(header->size() < blinkPagePayloadSize()); | 1344 ASSERT(header->size() < blinkPagePayloadSize()); |
| 1345 // Check if a free list entry first since we cannot call | 1345 // Check if a free list entry first since we cannot call |
| 1346 // isMarked on a free list entry. | 1346 // isMarked on a free list entry. |
| 1347 if (header->isFree()) { | 1347 if (header->isFree()) { |
| 1348 headerAddress += header->size(); | 1348 headerAddress += header->size(); |
| 1349 continue; | 1349 continue; |
| 1350 } | 1350 } |
| 1351 ASSERT(header->checkHeader()); | 1351 ASSERT(header->checkHeader()); |
| 1352 if (objectsToPoison == ThreadState::MarkedAndUnmarked || !header->isMark
ed()) { | 1352 if (objectsToPoison == BlinkGC::MarkedAndUnmarked || !header->isMarked()
) { |
| 1353 if (poisoning == ThreadState::SetPoison) | 1353 if (poisoning == BlinkGC::SetPoison) |
| 1354 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize
()); | 1354 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize
()); |
| 1355 else | 1355 else |
| 1356 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSi
ze()); | 1356 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSi
ze()); |
| 1357 } | 1357 } |
| 1358 headerAddress += header->size(); | 1358 headerAddress += header->size(); |
| 1359 } | 1359 } |
| 1360 } | 1360 } |
| 1361 #endif | 1361 #endif |
| 1362 | 1362 |
| 1363 void NormalPage::populateObjectStartBitMap() | 1363 void NormalPage::populateObjectStartBitMap() |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1670 } | 1670 } |
| 1671 | 1671 |
| 1672 void LargeObjectPage::makeConsistentForMutator() | 1672 void LargeObjectPage::makeConsistentForMutator() |
| 1673 { | 1673 { |
| 1674 HeapObjectHeader* header = heapObjectHeader(); | 1674 HeapObjectHeader* header = heapObjectHeader(); |
| 1675 if (header->isMarked()) | 1675 if (header->isMarked()) |
| 1676 header->unmark(); | 1676 header->unmark(); |
| 1677 } | 1677 } |
| 1678 | 1678 |
| 1679 #if defined(ADDRESS_SANITIZER) | 1679 #if defined(ADDRESS_SANITIZER) |
| 1680 void LargeObjectPage::poisonObjects(ThreadState::ObjectsToPoison objectsToPoison
, ThreadState::Poisoning poisoning) | 1680 void LargeObjectPage::poisonObjects(BlinkGC::ObjectsToPoison objectsToPoison, Bl
inkGC::Poisoning poisoning) |
| 1681 { | 1681 { |
| 1682 HeapObjectHeader* header = heapObjectHeader(); | 1682 HeapObjectHeader* header = heapObjectHeader(); |
| 1683 if (objectsToPoison == ThreadState::MarkedAndUnmarked || !header->isMarked()
) { | 1683 if (objectsToPoison == BlinkGC::MarkedAndUnmarked || !header->isMarked()) { |
| 1684 if (poisoning == ThreadState::SetPoison) | 1684 if (poisoning == BlinkGC::SetPoison) |
| 1685 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); | 1685 ASAN_POISON_MEMORY_REGION(header->payload(), header->payloadSize()); |
| 1686 else | 1686 else |
| 1687 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize()
); | 1687 ASAN_UNPOISON_MEMORY_REGION(header->payload(), header->payloadSize()
); |
| 1688 } | 1688 } |
| 1689 } | 1689 } |
| 1690 #endif | 1690 #endif |
| 1691 | 1691 |
| 1692 void LargeObjectPage::checkAndMarkPointer(Visitor* visitor, Address address) | 1692 void LargeObjectPage::checkAndMarkPointer(Visitor* visitor, Address address) |
| 1693 { | 1693 { |
| 1694 ASSERT(contains(address)); | 1694 ASSERT(contains(address)); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1840 | 1840 |
| 1841 m_hasEntries = true; | 1841 m_hasEntries = true; |
| 1842 size_t index = hash(address); | 1842 size_t index = hash(address); |
| 1843 ASSERT(!(index & 1)); | 1843 ASSERT(!(index & 1)); |
| 1844 Address cachePage = roundToBlinkPageStart(address); | 1844 Address cachePage = roundToBlinkPageStart(address); |
| 1845 m_entries[index + 1] = m_entries[index]; | 1845 m_entries[index + 1] = m_entries[index]; |
| 1846 m_entries[index] = cachePage; | 1846 m_entries[index] = cachePage; |
| 1847 } | 1847 } |
| 1848 | 1848 |
| 1849 } // namespace blink | 1849 } // namespace blink |
| OLD | NEW |