Changeset 226667 in webkit for trunk/Source/JavaScriptCore/heap/MarkingConstraintSolver.cpp
- Timestamp:
- Jan 9, 2018, 4:30:38 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/MarkingConstraintSolver.cpp
r226437 r226667 79 79 RELEASE_ASSERT(!m_numThreadsThatMayProduceWork); 80 80 81 for (unsigned indexToRun : m_didExecuteInParallel)82 m_set.m_set[indexToRun]->finishParallelWork(m_mainVisitor);83 m_didExecuteInParallel.clear();84 85 81 if (!m_toExecuteSequentially.isEmpty()) { 86 82 for (unsigned indexToRun : m_toExecuteSequentially) … … 90 86 91 87 RELEASE_ASSERT(m_toExecuteInParallel.isEmpty()); 92 RELEASE_ASSERT(!m_toExecuteInParallelSet.bitCount());93 88 } 94 89 … … 157 152 158 153 constraint.prepareToExecute(NoLockingNecessary, m_mainVisitor); 159 ConstraintParallelism parallelism = constraint.execute(m_mainVisitor); 160 didExecute(parallelism, constraint.index()); 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)); 161 162 } 162 163 … … 165 166 for (;;) { 166 167 bool doParallelWorkMode; 167 unsigned indexToRun; 168 MarkingConstraint* constraint = nullptr; 169 unsigned indexToRun = UINT_MAX; 170 TaskWithConstraint task; 168 171 { 169 172 auto locker = holdLock(m_lock); … … 174 177 return false; 175 178 176 indexToRun = m_toExecuteInParallel.first(); 179 task = m_toExecuteInParallel.first(); 180 constraint = task.constraint; 177 181 doParallelWorkMode = true; 178 182 return true; 179 183 }; 180 184 181 185 auto tryNextConstraint = [&] () -> bool { 182 186 if (!m_pickNextIsStillActive) … … 193 197 continue; 194 198 195 MarkingConstraint& c onstraint = *m_set.m_set[*pickResult];196 if (c onstraint.concurrency() == ConstraintConcurrency::Sequential) {199 MarkingConstraint& candidateConstraint = *m_set.m_set[*pickResult]; 200 if (candidateConstraint.concurrency() == ConstraintConcurrency::Sequential) { 197 201 m_toExecuteSequentially.append(*pickResult); 198 202 continue; 199 203 } 200 if (c onstraint.parallelism() == ConstraintParallelism::Parallel)204 if (candidateConstraint.parallelism() == ConstraintParallelism::Parallel) 201 205 m_numThreadsThatMayProduceWork++; 202 206 indexToRun = *pickResult; 207 constraint = &candidateConstraint; 203 208 doParallelWorkMode = false; 204 constraint .prepareToExecute(locker, visitor);209 constraint->prepareToExecute(locker, visitor); 205 210 return true; 206 211 } … … 227 232 } 228 233 229 ConstraintParallelism parallelism = ConstraintParallelism::Sequential;230 231 MarkingConstraint& constraint = *m_set.m_set[indexToRun];232 233 234 if (doParallelWorkMode) 234 constraint.doParallelWork(visitor); 235 else 236 parallelism = constraint.execute(visitor); 237 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 238 248 { 239 249 auto locker = holdLock(m_lock); 240 250 241 251 if (doParallelWorkMode) { 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 } 252 if (!m_toExecuteInParallel.isEmpty() 253 && task == m_toExecuteInParallel.first()) 254 m_toExecuteInParallel.takeFirst(); 255 else 256 ASSERT(!m_toExecuteInParallel.contains(task)); 249 257 } else { 250 if (constraint .parallelism() == ConstraintParallelism::Parallel)258 if (constraint->parallelism() == ConstraintParallelism::Parallel) 251 259 m_numThreadsThatMayProduceWork--; 252 260 m_executed.set(indexToRun); 253 if (parallelism == ConstraintParallelism::Parallel) {254 m_toExecuteInParallel.append(indexToRun);255 m_toExecuteInParallelSet.set(indexToRun);256 }257 261 } 258 262 … … 262 266 } 263 267 264 void 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 273 268 } // namespace JSC 274 269
Note:
See TracChangeset
for help on using the changeset viewer.