1414import static java .util .Objects .requireNonNull ;
1515import static java .util .concurrent .CompletableFuture .completedFuture ;
1616import static java .util .concurrent .TimeUnit .SECONDS ;
17+ import static java .util .function .Predicate .isEqual ;
1718import static org .apiguardian .api .API .Status .EXPERIMENTAL ;
1819import static org .junit .platform .commons .util .ExceptionUtils .throwAsUncheckedException ;
1920import static org .junit .platform .engine .support .hierarchical .ExclusiveResource .GLOBAL_READ_WRITE ;
4546import java .util .function .BiFunction ;
4647import java .util .function .BooleanSupplier ;
4748import java .util .function .Consumer ;
49+ import java .util .function .Predicate ;
4850
4951import org .apiguardian .api .API ;
5052import org .jspecify .annotations .Nullable ;
@@ -292,7 +294,8 @@ void processQueueEntries(WorkerLease workerLease, BooleanSupplier doneCondition)
292294 }
293295
294296 private void processQueueEntries () {
295- var queueEntriesByResult = tryToStealWorkWithoutBlocking (workQueue );
297+ var queueEntriesByResult = tryToStealWorkWithoutBlocking (workQueue ,
298+ isEqual (WorkStealResult .EXECUTED_BY_THIS_WORKER ));
296299 var queueModified = queueEntriesByResult .containsKey (WorkStealResult .EXECUTED_BY_THIS_WORKER ) //
297300 || queueEntriesByResult .containsKey (WorkStealResult .EXECUTED_BY_DIFFERENT_WORKER );
298301 if (queueModified ) {
@@ -336,7 +339,7 @@ void invokeAll(List<? extends TestTask> testTasks) {
336339 List <TestTask > sameThreadTasks = new ArrayList <>(testTasks .size ());
337340 var queueEntries = forkConcurrentChildren (testTasks , isolatedTasks ::add , sameThreadTasks );
338341 executeAll (sameThreadTasks );
339- var queueEntriesByResult = tryToStealWorkWithoutBlocking (queueEntries );
342+ var queueEntriesByResult = tryToStealWorkWithoutBlocking (queueEntries , __ -> false );
340343 tryToStealWorkWithBlocking (queueEntriesByResult );
341344 waitFor (queueEntriesByResult );
342345 executeAll (isolatedTasks );
@@ -371,10 +374,10 @@ else if (child.getExecutionMode() == SAME_THREAD) {
371374 }
372375
373376 private Map <WorkStealResult , List <WorkQueue .Entry >> tryToStealWorkWithoutBlocking (
374- Iterable <WorkQueue .Entry > queueEntries ) {
377+ Iterable <WorkQueue .Entry > queueEntries , Predicate <? super WorkStealResult > stopCondition ) {
375378
376379 Map <WorkStealResult , List <WorkQueue .Entry >> queueEntriesByResult = new EnumMap <>(WorkStealResult .class );
377- tryToStealWork (queueEntries , BlockingMode .NON_BLOCKING , queueEntriesByResult );
380+ tryToStealWork (queueEntries , BlockingMode .NON_BLOCKING , queueEntriesByResult , stopCondition );
378381 return queueEntriesByResult ;
379382 }
380383
@@ -383,14 +386,18 @@ private void tryToStealWorkWithBlocking(Map<WorkStealResult, List<WorkQueue.Entr
383386 if (entriesRequiringResourceLocks == null ) {
384387 return ;
385388 }
386- tryToStealWork (entriesRequiringResourceLocks , BlockingMode .BLOCKING , queueEntriesByResult );
389+ tryToStealWork (entriesRequiringResourceLocks , BlockingMode .BLOCKING , queueEntriesByResult , __ -> false );
387390 }
388391
389392 private void tryToStealWork (Iterable <WorkQueue .Entry > entries , BlockingMode blocking ,
390- Map <WorkStealResult , List <WorkQueue .Entry >> queueEntriesByResult ) {
393+ Map <WorkStealResult , List <WorkQueue .Entry >> queueEntriesByResult ,
394+ Predicate <? super WorkStealResult > stopCondition ) {
391395 for (var entry : entries ) {
392- var state = tryToStealWork (entry , blocking );
393- queueEntriesByResult .computeIfAbsent (state , __ -> new ArrayList <>()).add (entry );
396+ var result = tryToStealWork (entry , blocking );
397+ queueEntriesByResult .computeIfAbsent (result , __ -> new ArrayList <>()).add (entry );
398+ if (stopCondition .test (result )) {
399+ break ;
400+ }
394401 }
395402 }
396403
0 commit comments