diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-25 15:09:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-25 15:09:11 +0200 |
commit | a89b2ebb8e192c5e8cea21079bda2ee2c0c7dddd (patch) | |
tree | b7abd9f49ae1d4d2e426a5883bfccd42b8e2ee12 /Source/JavaScriptCore/heap/CopiedSpace.cpp | |
parent | 8d473cf9743f1d30a16a27114e93bd5af5648d23 (diff) | |
download | qtwebkit-a89b2ebb8e192c5e8cea21079bda2ee2c0c7dddd.tar.gz |
Imported WebKit commit eb5c1b8fe4d4b1b90b5137433fc58a91da0e6878 (http://svn.webkit.org/repository/webkit/trunk@118516)
Diffstat (limited to 'Source/JavaScriptCore/heap/CopiedSpace.cpp')
-rw-r--r-- | Source/JavaScriptCore/heap/CopiedSpace.cpp | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/Source/JavaScriptCore/heap/CopiedSpace.cpp b/Source/JavaScriptCore/heap/CopiedSpace.cpp index d52c4e756..7f5a665df 100644 --- a/Source/JavaScriptCore/heap/CopiedSpace.cpp +++ b/Source/JavaScriptCore/heap/CopiedSpace.cpp @@ -40,6 +40,18 @@ CopiedSpace::CopiedSpace(Heap* heap) { } +CopiedSpace::~CopiedSpace() +{ + while (!m_toSpace->isEmpty()) + m_heap->blockAllocator().deallocate(CopiedBlock::destroy(static_cast<CopiedBlock*>(m_toSpace->removeHead()))); + + while (!m_fromSpace->isEmpty()) + m_heap->blockAllocator().deallocate(CopiedBlock::destroy(static_cast<CopiedBlock*>(m_fromSpace->removeHead()))); + + while (!m_oversizeBlocks.isEmpty()) + CopiedBlock::destroy(static_cast<CopiedBlock*>(m_oversizeBlocks.removeHead())).deallocate(); +} + void CopiedSpace::init() { m_toSpace = &m_blocks1; @@ -77,9 +89,10 @@ CheckedBoolean CopiedSpace::tryAllocateOversize(size_t bytes, void** outPtr) return false; } - CopiedBlock* block = new (NotNull, allocation.base()) CopiedBlock(allocation); + CopiedBlock* block = CopiedBlock::create(allocation); m_oversizeBlocks.push(block); - m_oversizeFilter.add(reinterpret_cast<Bits>(block)); + m_blockFilter.add(reinterpret_cast<Bits>(block)); + m_blockSet.add(block); *outPtr = allocateFromBlock(block, bytes); @@ -135,7 +148,8 @@ CheckedBoolean CopiedSpace::tryReallocateOversize(void** ptr, size_t oldSize, si if (isOversize(oldSize)) { CopiedBlock* oldBlock = oversizeBlockFor(oldPtr); m_oversizeBlocks.remove(oldBlock); - oldBlock->m_allocation.deallocate(); + m_blockSet.remove(oldBlock); + CopiedBlock::destroy(oldBlock).deallocate(); } *ptr = newPtr; @@ -156,8 +170,8 @@ void CopiedSpace::doneFillingBlock(CopiedBlock* block) { MutexLocker locker(m_toSpaceLock); m_toSpace->push(block); - m_toSpaceSet.add(block); - m_toSpaceFilter.add(reinterpret_cast<Bits>(block)); + m_blockSet.add(block); + m_blockFilter.add(reinterpret_cast<Bits>(block)); } { @@ -183,15 +197,15 @@ void CopiedSpace::doneCopying() CopiedBlock* block = static_cast<CopiedBlock*>(m_fromSpace->removeHead()); if (block->m_isPinned) { block->m_isPinned = false; - // We don't add the block to the toSpaceSet because it was never removed. - ASSERT(m_toSpaceSet.contains(block)); - m_toSpaceFilter.add(reinterpret_cast<Bits>(block)); + // We don't add the block to the blockSet because it was never removed. + ASSERT(m_blockSet.contains(block)); + m_blockFilter.add(reinterpret_cast<Bits>(block)); m_toSpace->push(block); continue; } - m_toSpaceSet.remove(block); - m_heap->blockAllocator().deallocate(block); + m_blockSet.remove(block); + m_heap->blockAllocator().deallocate(CopiedBlock::destroy(block)); } CopiedBlock* curr = static_cast<CopiedBlock*>(m_oversizeBlocks.head()); @@ -199,9 +213,12 @@ void CopiedSpace::doneCopying() CopiedBlock* next = static_cast<CopiedBlock*>(curr->next()); if (!curr->m_isPinned) { m_oversizeBlocks.remove(curr); - curr->m_allocation.deallocate(); - } else + m_blockSet.remove(curr); + CopiedBlock::destroy(curr).deallocate(); + } else { + m_blockFilter.add(reinterpret_cast<Bits>(curr)); curr->m_isPinned = false; + } curr = next; } @@ -215,15 +232,9 @@ void CopiedSpace::doneCopying() CheckedBoolean CopiedSpace::getFreshBlock(AllocationEffort allocationEffort, CopiedBlock** outBlock) { CopiedBlock* block = 0; - if (allocationEffort == AllocationMustSucceed) { - if (HeapBlock* heapBlock = m_heap->blockAllocator().allocate()) - block = new (NotNull, heapBlock) CopiedBlock(heapBlock->m_allocation); - else if (!allocateNewBlock(&block)) { - *outBlock = 0; - ASSERT_NOT_REACHED(); - return false; - } - } else { + if (allocationEffort == AllocationMustSucceed) + block = CopiedBlock::create(m_heap->blockAllocator().allocate()); + else { ASSERT(allocationEffort == AllocationCanFail); if (m_heap->shouldCollect()) m_heap->collect(Heap::DoNotSweep); @@ -240,18 +251,6 @@ CheckedBoolean CopiedSpace::getFreshBlock(AllocationEffort allocationEffort, Cop return true; } -void CopiedSpace::freeAllBlocks() -{ - while (!m_toSpace->isEmpty()) - m_heap->blockAllocator().deallocate(m_toSpace->removeHead()); - - while (!m_fromSpace->isEmpty()) - m_heap->blockAllocator().deallocate(m_fromSpace->removeHead()); - - while (!m_oversizeBlocks.isEmpty()) - m_oversizeBlocks.removeHead()->m_allocation.deallocate(); -} - size_t CopiedSpace::size() { size_t calculatedSize = 0; |