Ignore:
Timestamp:
Jan 10, 2018, 11:41:12 AM (8 years ago)
Author:
[email protected]
Message:

Unreviewed, rolling out r226667 and r226673.
https://bugs.webkit.org/show_bug.cgi?id=181488

This caused a flaky crash. (Requested by mlewis13 on #webkit).

Reverted changesets:

"CodeBlocks should be in IsoSubspaces"
https://bugs.webkit.org/show_bug.cgi?id=180884
https://trac.webkit.org/changeset/226667

"REGRESSION (r226667): CodeBlocks should be in IsoSubspaces"
https://bugs.webkit.org/show_bug.cgi?id=180884
https://trac.webkit.org/changeset/226673

File:
1 edited

Legend:

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

    r226667 r226725  
    4242}
    4343
     44void CodeBlockSet::add(CodeBlock* codeBlock)
     45{
     46    LockHolder locker(&m_lock);
     47    bool isNewEntry = m_newCodeBlocks.add(codeBlock).isNewEntry;
     48    ASSERT_UNUSED(isNewEntry, isNewEntry);
     49}
     50
     51void CodeBlockSet::promoteYoungCodeBlocks(const AbstractLocker&)
     52{
     53    ASSERT(m_lock.isLocked());
     54    m_oldCodeBlocks.add(m_newCodeBlocks.begin(), m_newCodeBlocks.end());
     55    m_newCodeBlocks.clear();
     56}
     57
     58void CodeBlockSet::clearMarksForFullCollection()
     59{
     60    LockHolder locker(&m_lock);
     61    for (CodeBlock* codeBlock : m_oldCodeBlocks)
     62        codeBlock->clearVisitWeaklyHasBeenCalled();
     63}
     64
     65void CodeBlockSet::lastChanceToFinalize(VM& vm)
     66{
     67    LockHolder locker(&m_lock);
     68    for (CodeBlock* codeBlock : m_newCodeBlocks)
     69        codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock);
     70
     71    for (CodeBlock* codeBlock : m_oldCodeBlocks)
     72        codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock);
     73}
     74
     75void CodeBlockSet::deleteUnmarkedAndUnreferenced(VM& vm, CollectionScope scope)
     76{
     77    LockHolder locker(&m_lock);
     78   
     79    // Destroying a CodeBlock takes about 1us on average in Speedometer. Full collections in Speedometer
     80    // usually have ~2000 CodeBlocks to process. The time it takes to process the whole list varies a
     81    // lot. In one extreme case I saw 18ms (on my fast MBP).
     82    //
     83    // FIXME: use Subspace instead of HashSet and adopt Subspace-based constraint solving. This may
     84    // remove the need to eagerly destruct CodeBlocks.
     85    // https://bugs.webkit.org/show_bug.cgi?id=180089
     86    //
     87    // FIXME: make CodeBlock::~CodeBlock a lot faster. It seems insane for that to take 1us or more.
     88    // https://bugs.webkit.org/show_bug.cgi?id=180109
     89   
     90    auto consider = [&] (HashSet<CodeBlock*>& set) {
     91        set.removeIf(
     92            [&] (CodeBlock* codeBlock) -> bool {
     93                if (Heap::isMarked(codeBlock))
     94                    return false;
     95                codeBlock->structure(vm)->classInfo()->methodTable.destroy(codeBlock);
     96                return true;
     97            });
     98    };
     99
     100    switch (scope) {
     101    case CollectionScope::Eden:
     102        consider(m_newCodeBlocks);
     103        break;
     104    case CollectionScope::Full:
     105        consider(m_oldCodeBlocks);
     106        consider(m_newCodeBlocks);
     107        break;
     108    }
     109
     110    // Any remaining young CodeBlocks are live and need to be promoted to the set of old CodeBlocks.
     111    promoteYoungCodeBlocks(locker);
     112}
     113
    44114bool CodeBlockSet::contains(const AbstractLocker&, void* candidateCodeBlock)
    45115{
     
    48118    if (!HashSet<CodeBlock*>::isValidValue(codeBlock))
    49119        return false;
    50     return m_codeBlocks.contains(codeBlock);
     120    return m_oldCodeBlocks.contains(codeBlock) || m_newCodeBlocks.contains(codeBlock) || m_currentlyExecuting.contains(codeBlock);
    51121}
    52122
     
    59129{
    60130    CommaPrinter comma;
    61     out.print("{codeBlocks = [");
    62     for (CodeBlock* codeBlock : m_codeBlocks)
     131    out.print("{old = [");
     132    for (CodeBlock* codeBlock : m_oldCodeBlocks)
     133        out.print(comma, pointerDump(codeBlock));
     134    out.print("], new = [");
     135    comma = CommaPrinter();
     136    for (CodeBlock* codeBlock : m_newCodeBlocks)
    63137        out.print(comma, pointerDump(codeBlock));
    64138    out.print("], currentlyExecuting = [");
     
    69143}
    70144
    71 void CodeBlockSet::add(CodeBlock* codeBlock)
    72 {
    73     auto locker = holdLock(m_lock);
    74     auto result = m_codeBlocks.add(codeBlock);
    75     RELEASE_ASSERT(result);
    76 }
    77 
    78 void CodeBlockSet::remove(CodeBlock* codeBlock)
    79 {
    80     auto locker = holdLock(m_lock);
    81     bool result = m_codeBlocks.remove(codeBlock);
    82     RELEASE_ASSERT(result);
    83 }
    84 
    85145} // namespace JSC
    86146
Note: See TracChangeset for help on using the changeset viewer.