Beispiel #1
0
void CodeBlockSet::deleteUnmarkedAndUnreferenced(HeapOperation collectionType)
{
    HashSet<CodeBlock*>& set = collectionType == EdenCollection ? m_newCodeBlocks : m_oldCodeBlocks;

    // This needs to be a fixpoint because code blocks that are unmarked may
    // refer to each other. For example, a DFG code block that is owned by
    // the GC may refer to an FTL for-entry code block that is also owned by
    // the GC.
    Vector<CodeBlock*, 16> toRemove;
    if (verbose)
        dataLog("Fixpointing over unmarked, set size = ", set.size(), "...\n");
    for (;;) {
        for (CodeBlock* codeBlock : set) {
            if (!codeBlock->hasOneRef())
                continue;
            codeBlock->deref();
            toRemove.append(codeBlock);
        }
        if (verbose)
            dataLog("    Removing ", toRemove.size(), " blocks.\n");
        if (toRemove.isEmpty())
            break;
        for (CodeBlock* codeBlock : toRemove)
            set.remove(codeBlock);
        toRemove.resize(0);
    }

    // Any remaining young CodeBlocks are live and need to be promoted to the set of old CodeBlocks.
    if (collectionType == EdenCollection)
        promoteYoungCodeBlocks();
}
Beispiel #2
0
void CodeBlockSet::deleteUnmarkedAndUnreferenced(VM& vm, CollectionScope scope)
{
    LockHolder locker(&m_lock);
    Vector<CodeBlock*> unmarked;
    
    auto consider = [&] (HashSet<CodeBlock*>& set) {
        for (CodeBlock* codeBlock : set) {
            if (Heap::isMarked(codeBlock))
                continue;;
            unmarked.append(codeBlock);
        }
        for (CodeBlock* codeBlock : unmarked) {
            codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock);
            set.remove(codeBlock);
        }
        unmarked.resize(0);
    };

    switch (scope) {
    case CollectionScope::Eden:
        consider(m_newCodeBlocks);
        break;
    case CollectionScope::Full:
        consider(m_oldCodeBlocks);
        consider(m_newCodeBlocks);
        break;
    }

    // Any remaining young CodeBlocks are live and need to be promoted to the set of old CodeBlocks.
    promoteYoungCodeBlocks(locker);
}
Beispiel #3
0
void CodeBlockSet::clearMarksForFullCollection()
{
    for (CodeBlock* codeBlock : m_oldCodeBlocks)
        codeBlock->clearMarks();

    // We promote after we clear marks on the old generation CodeBlocks because
    // none of the young generations CodeBlocks need to be cleared.
    promoteYoungCodeBlocks();
}