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/MarkingConstraintSolver.cpp

    r226667 r226725  
    7979    RELEASE_ASSERT(!m_numThreadsThatMayProduceWork);
    8080       
     81    for (unsigned indexToRun : m_didExecuteInParallel)
     82        m_set.m_set[indexToRun]->finishParallelWork(m_mainVisitor);
     83    m_didExecuteInParallel.clear();
     84   
    8185    if (!m_toExecuteSequentially.isEmpty()) {
    8286        for (unsigned indexToRun : m_toExecuteSequentially)
     
    8690       
    8791    RELEASE_ASSERT(m_toExecuteInParallel.isEmpty());
     92    RELEASE_ASSERT(!m_toExecuteInParallelSet.bitCount());
    8893}
    8994
     
    152157   
    153158    constraint.prepareToExecute(NoLockingNecessary, m_mainVisitor);
    154     constraint.execute(m_mainVisitor);
    155     m_executed.set(constraint.index());
    156 }
    157 
    158 void MarkingConstraintSolver::addParallelTask(RefPtr<SharedTask<void(SlotVisitor&)>> task, MarkingConstraint& constraint)
    159 {
    160     auto locker = holdLock(m_lock);
    161     m_toExecuteInParallel.append(TaskWithConstraint(WTFMove(task), &constraint));
     159    ConstraintParallelism parallelism = constraint.execute(m_mainVisitor);
     160    didExecute(parallelism, constraint.index());
    162161}
    163162
     
    166165    for (;;) {
    167166        bool doParallelWorkMode;
    168         MarkingConstraint* constraint = nullptr;
    169         unsigned indexToRun = UINT_MAX;
    170         TaskWithConstraint task;
     167        unsigned indexToRun;
    171168        {
    172169            auto locker = holdLock(m_lock);
     
    177174                        return false;
    178175                   
    179                     task = m_toExecuteInParallel.first();
    180                     constraint = task.constraint;
     176                    indexToRun = m_toExecuteInParallel.first();
    181177                    doParallelWorkMode = true;
    182178                    return true;
    183179                };
    184                
     180                           
    185181                auto tryNextConstraint = [&] () -> bool {
    186182                    if (!m_pickNextIsStillActive)
     
    197193                            continue;
    198194                                   
    199                         MarkingConstraint& candidateConstraint = *m_set.m_set[*pickResult];
    200                         if (candidateConstraint.concurrency() == ConstraintConcurrency::Sequential) {
     195                        MarkingConstraint& constraint = *m_set.m_set[*pickResult];
     196                        if (constraint.concurrency() == ConstraintConcurrency::Sequential) {
    201197                            m_toExecuteSequentially.append(*pickResult);
    202198                            continue;
    203199                        }
    204                         if (candidateConstraint.parallelism() == ConstraintParallelism::Parallel)
     200                        if (constraint.parallelism() == ConstraintParallelism::Parallel)
    205201                            m_numThreadsThatMayProduceWork++;
    206202                        indexToRun = *pickResult;
    207                         constraint = &candidateConstraint;
    208203                        doParallelWorkMode = false;
    209                         constraint->prepareToExecute(locker, visitor);
     204                        constraint.prepareToExecute(locker, visitor);
    210205                        return true;
    211206                    }
     
    232227        }
    233228                   
     229        ConstraintParallelism parallelism = ConstraintParallelism::Sequential;
     230                   
     231        MarkingConstraint& constraint = *m_set.m_set[indexToRun];
     232                   
    234233        if (doParallelWorkMode)
    235             constraint->doParallelWork(visitor, *task.task);
    236         else {
    237             if (constraint->parallelism() == ConstraintParallelism::Parallel) {
    238                 visitor.m_currentConstraint = constraint;
    239                 visitor.m_currentSolver = this;
    240             }
    241            
    242             constraint->execute(visitor);
    243            
    244             visitor.m_currentConstraint = nullptr;
    245             visitor.m_currentSolver = nullptr;
    246         }
    247        
     234            constraint.doParallelWork(visitor);
     235        else
     236            parallelism = constraint.execute(visitor);
     237                   
    248238        {
    249239            auto locker = holdLock(m_lock);
    250            
     240                       
    251241            if (doParallelWorkMode) {
    252                 if (!m_toExecuteInParallel.isEmpty()
    253                     && task == m_toExecuteInParallel.first())
    254                     m_toExecuteInParallel.takeFirst();
    255                 else
    256                     ASSERT(!m_toExecuteInParallel.contains(task));
     242                if (m_toExecuteInParallelSet.get(indexToRun)) {
     243                    m_didExecuteInParallel.append(indexToRun);
     244                               
     245                    m_toExecuteInParallel.takeFirst(
     246                        [&] (unsigned value) { return value == indexToRun; });
     247                    m_toExecuteInParallelSet.clear(indexToRun);
     248                }
    257249            } else {
    258                 if (constraint->parallelism() == ConstraintParallelism::Parallel)
     250                if (constraint.parallelism() == ConstraintParallelism::Parallel)
    259251                    m_numThreadsThatMayProduceWork--;
    260252                m_executed.set(indexToRun);
     253                if (parallelism == ConstraintParallelism::Parallel) {
     254                    m_toExecuteInParallel.append(indexToRun);
     255                    m_toExecuteInParallelSet.set(indexToRun);
     256                }
    261257            }
    262258                       
     
    266262}
    267263
     264void MarkingConstraintSolver::didExecute(ConstraintParallelism parallelism, unsigned index)
     265{
     266    m_executed.set(index);
     267    if (parallelism == ConstraintParallelism::Parallel) {
     268        m_toExecuteInParallel.append(index);
     269        m_toExecuteInParallelSet.set(index);
     270    }
     271}
     272
    268273} // namespace JSC
    269274
Note: See TracChangeset for help on using the changeset viewer.