Skip to content

Commit 96c8b60

Browse files
committed
more concurrency
1 parent 0938551 commit 96c8b60

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

src/solver/mod.rs

+40-27
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,16 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
188188
&self,
189189
solvable_id: SolvableId,
190190
) -> Result<AddClauseOutput, Box<dyn Any>> {
191-
let mut output = AddClauseOutput::default();
192-
let mut queue = vec![solvable_id];
193-
let mut seen = HashSet::new();
194-
seen.insert(solvable_id);
191+
let output = RefCell::new(AddClauseOutput::default());
192+
let queue = RefCell::new(vec![solvable_id]);
193+
let seen = RefCell::new(HashSet::new());
194+
seen.borrow_mut().insert(solvable_id);
195+
196+
while let Some(solvable_id) = queue.borrow_mut().pop() {
197+
let output = &output;
198+
let queue = &queue;
199+
let seen = &seen;
195200

196-
while let Some(solvable_id) = queue.pop() {
197201
let mutex = {
198202
let mut clauses = self.clauses_added_for_solvable.borrow_mut();
199203
let mutex = clauses
@@ -237,6 +241,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
237241
.alloc(ClauseState::exclude(solvable_id, *reason));
238242

239243
// Exclusions are negative assertions, tracked outside of the watcher system
244+
let mut output = output.borrow_mut();
240245
output.negative_assertions.push((solvable_id, clause_id));
241246

242247
// There might be a conflict now
@@ -251,14 +256,10 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
251256
};
252257

253258
// Add clauses for the requirements
254-
for version_set_id in requirements {
259+
let add_requirements = requirements.into_iter().map(|version_set_id| async move {
255260
let dependency_name = self.pool.resolve_version_set_package_name(version_set_id);
256-
self.add_clauses_for_package(
257-
&mut output.negative_assertions,
258-
&mut output.clauses_to_watch,
259-
dependency_name,
260-
)
261-
.await?;
261+
self.add_clauses_for_package(&output, dependency_name)
262+
.await?;
262263

263264
// Find all the solvables that match for the given version set
264265
let candidates = self
@@ -268,6 +269,8 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
268269

269270
// Queue requesting the dependencies of the candidates as well if they are cheaply
270271
// available from the dependency provider.
272+
let mut queue = queue.borrow_mut();
273+
let mut seen = seen.borrow_mut();
271274
for &candidate in candidates {
272275
if seen.insert(candidate)
273276
&& self.cache.are_dependencies_available_for(candidate)
@@ -292,6 +295,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
292295
unreachable!();
293296
};
294297

298+
let mut output = output.borrow_mut();
295299
if clause.has_watches() {
296300
output.clauses_to_watch.push(clause_id);
297301
}
@@ -306,17 +310,14 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
306310
// Add assertions for unit clauses (i.e. those with no matching candidates)
307311
output.negative_assertions.push((solvable_id, clause_id));
308312
}
309-
}
310313

311-
// Add clauses for the constraints
312-
for version_set_id in constrains {
314+
Ok::<_, Box<dyn Any>>(())
315+
});
316+
317+
let add_constrains = constrains.into_iter().map(|version_set_id| async move {
313318
let dependency_name = self.pool.resolve_version_set_package_name(version_set_id);
314-
self.add_clauses_for_package(
315-
&mut output.negative_assertions,
316-
&mut output.clauses_to_watch,
317-
dependency_name,
318-
)
319-
.await?;
319+
self.add_clauses_for_package(&output, dependency_name)
320+
.await?;
320321

321322
// Find all the solvables that match for the given version set
322323
let constrained_candidates = self
@@ -325,6 +326,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
325326
.await?;
326327

327328
// Add forbidden clauses for the candidates
329+
let mut output = output.borrow_mut();
328330
for forbidden_candidate in constrained_candidates.iter().copied().collect_vec() {
329331
let (clause, conflict) = ClauseState::constrains(
330332
solvable_id,
@@ -340,12 +342,22 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
340342
output.conflicting_clauses.push(clause_id);
341343
}
342344
}
345+
346+
Ok::<_, Box<dyn Any>>(())
347+
});
348+
349+
let add_requirements = futures::future::join_all(add_requirements);
350+
let add_constrains = futures::future::join_all(add_constrains);
351+
let (results1, results2) =
352+
futures::future::join(add_requirements, add_constrains).await;
353+
for result in results1.into_iter().chain(results2) {
354+
result?;
343355
}
344356

345357
*clauses_added = true;
346358
}
347359

348-
Ok(output)
360+
Ok(output.into_inner())
349361
}
350362

351363
/// Adds all clauses for a specific package name.
@@ -366,8 +378,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
366378
/// will be returned as an `Err(...)`.
367379
async fn add_clauses_for_package(
368380
&self,
369-
negative_assertions: &mut Vec<(SolvableId, ClauseId)>,
370-
clauses_to_watch: &mut Vec<ClauseId>,
381+
output: &RefCell<AddClauseOutput>,
371382
package_name: NameId,
372383
) -> Result<(), Box<dyn Any>> {
373384
let mutex = {
@@ -402,6 +413,8 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
402413
);
403414
}
404415

416+
let mut output = output.borrow_mut();
417+
405418
// Each candidate gets a clause to disallow other candidates.
406419
for (i, &candidate) in candidates.iter().enumerate() {
407420
for &other_candidate in &candidates[i + 1..] {
@@ -411,7 +424,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
411424
.alloc(ClauseState::forbid_multiple(candidate, other_candidate));
412425

413426
debug_assert!(self.clauses.borrow_mut()[clause_id].has_watches());
414-
clauses_to_watch.push(clause_id);
427+
output.clauses_to_watch.push(clause_id);
415428
}
416429
}
417430

@@ -425,7 +438,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
425438
.alloc(ClauseState::lock(locked_solvable_id, other_candidate));
426439

427440
debug_assert!(self.clauses.borrow_mut()[clause_id].has_watches());
428-
clauses_to_watch.push(clause_id);
441+
output.clauses_to_watch.push(clause_id);
429442
}
430443
}
431444
}
@@ -438,7 +451,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
438451
.alloc(ClauseState::exclude(solvable, reason));
439452

440453
// Exclusions are negative assertions, tracked outside of the watcher system
441-
negative_assertions.push((solvable, clause_id));
454+
output.negative_assertions.push((solvable, clause_id));
442455

443456
// Conflicts should be impossible here
444457
debug_assert!(self.decision_tracker.assigned_value(solvable) != Some(true));

0 commit comments

Comments
 (0)