@@ -188,12 +188,16 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
188
188
& self ,
189
189
solvable_id : SolvableId ,
190
190
) -> 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;
195
200
196
- while let Some ( solvable_id) = queue. pop ( ) {
197
201
let mutex = {
198
202
let mut clauses = self . clauses_added_for_solvable . borrow_mut ( ) ;
199
203
let mutex = clauses
@@ -237,6 +241,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
237
241
. alloc ( ClauseState :: exclude ( solvable_id, * reason) ) ;
238
242
239
243
// Exclusions are negative assertions, tracked outside of the watcher system
244
+ let mut output = output. borrow_mut ( ) ;
240
245
output. negative_assertions . push ( ( solvable_id, clause_id) ) ;
241
246
242
247
// There might be a conflict now
@@ -251,14 +256,10 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
251
256
} ;
252
257
253
258
// 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 {
255
260
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 ?;
262
263
263
264
// Find all the solvables that match for the given version set
264
265
let candidates = self
@@ -268,6 +269,8 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
268
269
269
270
// Queue requesting the dependencies of the candidates as well if they are cheaply
270
271
// available from the dependency provider.
272
+ let mut queue = queue. borrow_mut ( ) ;
273
+ let mut seen = seen. borrow_mut ( ) ;
271
274
for & candidate in candidates {
272
275
if seen. insert ( candidate)
273
276
&& self . cache . are_dependencies_available_for ( candidate)
@@ -292,6 +295,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
292
295
unreachable ! ( ) ;
293
296
} ;
294
297
298
+ let mut output = output. borrow_mut ( ) ;
295
299
if clause. has_watches ( ) {
296
300
output. clauses_to_watch . push ( clause_id) ;
297
301
}
@@ -306,17 +310,14 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
306
310
// Add assertions for unit clauses (i.e. those with no matching candidates)
307
311
output. negative_assertions . push ( ( solvable_id, clause_id) ) ;
308
312
}
309
- }
310
313
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 {
313
318
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 ?;
320
321
321
322
// Find all the solvables that match for the given version set
322
323
let constrained_candidates = self
@@ -325,6 +326,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
325
326
. await ?;
326
327
327
328
// Add forbidden clauses for the candidates
329
+ let mut output = output. borrow_mut ( ) ;
328
330
for forbidden_candidate in constrained_candidates. iter ( ) . copied ( ) . collect_vec ( ) {
329
331
let ( clause, conflict) = ClauseState :: constrains (
330
332
solvable_id,
@@ -340,12 +342,22 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
340
342
output. conflicting_clauses . push ( clause_id) ;
341
343
}
342
344
}
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?;
343
355
}
344
356
345
357
* clauses_added = true ;
346
358
}
347
359
348
- Ok ( output)
360
+ Ok ( output. into_inner ( ) )
349
361
}
350
362
351
363
/// Adds all clauses for a specific package name.
@@ -366,8 +378,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
366
378
/// will be returned as an `Err(...)`.
367
379
async fn add_clauses_for_package (
368
380
& self ,
369
- negative_assertions : & mut Vec < ( SolvableId , ClauseId ) > ,
370
- clauses_to_watch : & mut Vec < ClauseId > ,
381
+ output : & RefCell < AddClauseOutput > ,
371
382
package_name : NameId ,
372
383
) -> Result < ( ) , Box < dyn Any > > {
373
384
let mutex = {
@@ -402,6 +413,8 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
402
413
) ;
403
414
}
404
415
416
+ let mut output = output. borrow_mut ( ) ;
417
+
405
418
// Each candidate gets a clause to disallow other candidates.
406
419
for ( i, & candidate) in candidates. iter ( ) . enumerate ( ) {
407
420
for & other_candidate in & candidates[ i + 1 ..] {
@@ -411,7 +424,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
411
424
. alloc ( ClauseState :: forbid_multiple ( candidate, other_candidate) ) ;
412
425
413
426
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) ;
415
428
}
416
429
}
417
430
@@ -425,7 +438,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
425
438
. alloc ( ClauseState :: lock ( locked_solvable_id, other_candidate) ) ;
426
439
427
440
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) ;
429
442
}
430
443
}
431
444
}
@@ -438,7 +451,7 @@ impl<VS: VersionSet, N: PackageName + Display, D: DependencyProvider<VS, N>> Sol
438
451
. alloc ( ClauseState :: exclude ( solvable, reason) ) ;
439
452
440
453
// 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) ) ;
442
455
443
456
// Conflicts should be impossible here
444
457
debug_assert ! ( self . decision_tracker. assigned_value( solvable) != Some ( true ) ) ;
0 commit comments