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