Ignore:
Timestamp:
Jan 14, 2014, 3:03:01 PM (12 years ago)
Author:
[email protected]
Message:

Copying should be generational
https://bugs.webkit.org/show_bug.cgi?id=126555

Reviewed by Geoffrey Garen.

This patch adds support for copying to our generational collector. Eden collections
always trigger copying. Full collections use our normal fragmentation-based heuristics.

The way this works is that the CopiedSpace now has the notion of an old generation set of CopiedBlocks
and a new generation of CopiedBlocks. During each mutator cycle new CopiedSpace allocations reside
in the new generation. When a collection occurs, those blocks are moved to the old generation.

One key thing to remember is that both new and old generation objects in the MarkedSpace can
refer to old or new generation allocations in CopiedSpace. This is why we must fire write barriers
when assigning to an old (MarkedSpace) object's Butterfly.

  • heap/CopiedAllocator.h:

(JSC::CopiedAllocator::tryAllocateDuringCopying):

  • heap/CopiedBlock.h:

(JSC::CopiedBlock::CopiedBlock):
(JSC::CopiedBlock::didEvacuateBytes):
(JSC::CopiedBlock::isOld):
(JSC::CopiedBlock::didPromote):

  • heap/CopiedBlockInlines.h:

(JSC::CopiedBlock::reportLiveBytes):
(JSC::CopiedBlock::reportLiveBytesDuringCopying):

  • heap/CopiedSpace.cpp:

(JSC::CopiedSpace::CopiedSpace):
(JSC::CopiedSpace::~CopiedSpace):
(JSC::CopiedSpace::init):
(JSC::CopiedSpace::tryAllocateOversize):
(JSC::CopiedSpace::tryReallocateOversize):
(JSC::CopiedSpace::doneFillingBlock):
(JSC::CopiedSpace::didStartFullCollection):
(JSC::CopiedSpace::doneCopying):
(JSC::CopiedSpace::size):
(JSC::CopiedSpace::capacity):
(JSC::CopiedSpace::isPagedOut):

  • heap/CopiedSpace.h:

(JSC::CopiedSpace::CopiedGeneration::CopiedGeneration):

  • heap/CopiedSpaceInlines.h:

(JSC::CopiedSpace::contains):
(JSC::CopiedSpace::recycleEvacuatedBlock):
(JSC::CopiedSpace::allocateBlock):
(JSC::CopiedSpace::startedCopying):

  • heap/CopyVisitor.cpp:

(JSC::CopyVisitor::copyFromShared):

  • heap/CopyVisitorInlines.h:

(JSC::CopyVisitor::allocateNewSpace):
(JSC::CopyVisitor::allocateNewSpaceSlow):

  • heap/GCThreadSharedData.cpp:

(JSC::GCThreadSharedData::didStartCopying):

  • heap/Heap.cpp:

(JSC::Heap::copyBackingStores):

  • heap/SlotVisitorInlines.h:

(JSC::SlotVisitor::copyLater):

  • heap/TinyBloomFilter.h:

(JSC::TinyBloomFilter::add):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/heap/GCThreadSharedData.cpp

    r155317 r162017  
    182182    {
    183183        SpinLockHolder locker(&m_copyLock);
    184         WTF::copyToVector(m_copiedSpace->m_blockSet, m_blocksToCopy);
     184        if (m_vm->heap.operationInProgress() == EdenCollection) {
     185            // Reset the vector to be empty, but don't throw away the backing store.
     186            m_blocksToCopy.shrink(0);
     187            for (CopiedBlock* block = m_copiedSpace->m_newGen.fromSpace->head(); block; block = block->next())
     188                m_blocksToCopy.append(block);
     189        } else {
     190            ASSERT(m_vm->heap.operationInProgress() == FullCollection);
     191            WTF::copyToVector(m_copiedSpace->m_blockSet, m_blocksToCopy);
     192        }
    185193        m_copyIndex = 0;
    186194    }
Note: See TracChangeset for help on using the changeset viewer.