Skip to content
  • mhahnenberg@apple.com's avatar
    MarkedBlocks should use something other than the mark bits to indicate... · 4cbe13c3
    mhahnenberg@apple.com authored
    MarkedBlocks should use something other than the mark bits to indicate liveness for newly allocated objects
    https://bugs.webkit.org/show_bug.cgi?id=100877
    
    Reviewed by Filip Pizlo.
    
    Currently when we canonicalize cell liveness data in MarkedBlocks, we set the mark bit for every cell in the
    block except for those in the free list. This allows us to consider objects that were allocated since the
    previous collection to be considered live until they have a chance to be properly marked by the collector.
    
    If we want to use the mark bits to signify other types of information, e.g. using sticky mark bits for generational
    collection, we will have to keep track of newly allocated objects in a different fashion when we canonicalize cell liveness.
    
    One method would be to allocate a separate set of bits while canonicalizing liveness data. These bits would
    track the newly allocated objects in the block separately from those objects who had already been marked. We would
    then check these bits, along with the mark bits, when determining liveness.
    
    * heap/Heap.h:
    (Heap):
    (JSC::Heap::isLive): We now check for the presence of the newlyAllocated Bitmap.
    (JSC):
    * heap/MarkedBlock.cpp:
    (JSC::MarkedBlock::specializedSweep): We clear the newlyAllocated Bitmap if we're creating a free list. This
    will happen if we canonicalize liveness data for some other reason than collection (e.g. forEachCell) and
    then start allocating again.
    (JSC::SetNewlyAllocatedFunctor::SetNewlyAllocatedFunctor):
    (SetNewlyAllocatedFunctor):
    (JSC::SetNewlyAllocatedFunctor::operator()): We set the newlyAllocated bits for all the objects
    that aren't already marked. We undo the bits for the objects in the free list later in canonicalizeCellLivenessData.
    (JSC::MarkedBlock::canonicalizeCellLivenessData): We should never have a FreeListed block with a newlyAllocated Bitmap.
    We allocate the new Bitmap, set the bits for all the objects that aren't already marked, and then unset all of the
    bits for the items currently in the FreeList.
    * heap/MarkedBlock.h:
    (JSC::MarkedBlock::clearMarks): We clear the newlyAllocated bitmap if it exists because at this point we don't need it
    any more.
    (JSC::MarkedBlock::isEmpty): If we have some objects that are newlyAllocated, we are not empty.
    (JSC::MarkedBlock::isNewlyAllocated):
    (JSC):
    (JSC::MarkedBlock::setNewlyAllocated):
    (JSC::MarkedBlock::clearNewlyAllocated):
    (JSC::MarkedBlock::isLive): We now check the newlyAllocated Bitmap, if it exists, when determining liveness of a cell in
    a block that is Marked.
    * heap/WeakBlock.cpp:
    (JSC::WeakBlock::visit): We need to make sure we don't finalize objects that are in the newlyAllocated Bitmap.
    (JSC::WeakBlock::reap): Ditto.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@133358 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    4cbe13c3