1 package org.apache.maven.plugin.surefire.runorder;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25
26 /**
27 * @author Kristian Rosenvold
28 */
29 public class ThreadedExecutionScheduler
30 {
31 private final int numThreads;
32
33 private final int runTime[];
34
35 private final List[] lists;
36
37 public ThreadedExecutionScheduler( int numThreads )
38 {
39 this.numThreads = numThreads;
40 runTime = new int[numThreads];
41 lists = new List[numThreads];
42 for ( int i = 0; i < numThreads; i++ )
43 {
44 lists[i] = new ArrayList<Class>();
45 }
46 }
47
48 public void addTest( PrioritizedTest prioritizedTest )
49 {
50 final int leastBusySlot = findLeastBusySlot();
51 runTime[leastBusySlot] += prioritizedTest.getTotalRuntime();
52 //noinspection unchecked
53 lists[leastBusySlot].add( prioritizedTest.getClazz() );
54 }
55
56 public List<Class> getResult()
57 {
58 List<Class> result = new ArrayList<Class>();
59 int index = 0;
60 boolean added;
61 do
62 {
63 added = false;
64 for ( int i = 0; i < numThreads; i++ )
65 {
66 if ( lists[i].size() > index )
67 {
68 result.add( (Class) lists[i].get( index ) );
69 added = true;
70 }
71 }
72 index++;
73 }
74 while ( added );
75 return result;
76 }
77
78 private int findLeastBusySlot()
79 {
80 int leastBusy = 0;
81 int minRuntime = runTime[0];
82 for ( int i = 1; i < numThreads; i++ )
83 {
84 if ( runTime[i] < minRuntime )
85 {
86 leastBusy = i;
87 minRuntime = runTime[i];
88 }
89 }
90 return leastBusy;
91 }
92 }