3 using System.Collections.Generic;
5 using System.Threading;
6 using System.Threading.Tasks;
8 namespace SiliconStudio.BuildEngine
15 private const int MaxParallelism = 8;
20 private readonly AutoResetEvent newWorkAvailable =
new AutoResetEvent(
false);
24 this.buildStepProvider = buildStepProvider;
32 newWorkAvailable.Set();
37 var buildStepsToWait =
new List<BuildStep>();
43 return ResultStatus.Cancelled;
46 if (buildStepsToWait.Count >= MaxParallelism)
47 await CompleteOneBuildStep(executeContext, buildStepsToWait);
50 var buildStep = buildStepProvider.GetNextBuildStep();
53 if (buildStep == null)
55 newWorkAvailable.WaitOne();
61 if(buildStep.Processed)
67 while (buildStepsToWait.Count>0)
68 await CompleteOneBuildStep(executeContext, buildStepsToWait);
74 executeContext.ScheduleBuildStep(buildStep);
75 buildStepsToWait.Add(buildStep);
89 return "DynamicBuildStep";
92 private async
Task CompleteOneBuildStep(
IExecuteContext executeContext, List<BuildStep> buildStepsToWait)
95 var completeBuildStep = await Task.WhenAny(buildStepsToWait.Select(x => x.ExecutedAsync()));
99 outputObjects.Clear();
102 await CompleteCommands(executeContext,
new List<BuildStep> { completeBuildStep.Result });
105 IndexFileCommand.MergeOutputObjects(outputObjects);
108 buildStepsToWait.Remove(completeBuildStep.Result);
A BuildStep that can spawn multiple BuildStep. Input and output tracking and merging will be performe...
async override Task< ResultStatus > Execute(IExecuteContext executeContext, BuilderContext builderContext)
Execute the BuildStep, usually resulting in scheduling tasks in the scheduler
override BuildStep Clone()
Clone this Build Step.
override string ToString()
When embedded in a EnumerableBuildStep, this build step will force all previous computations to be fi...
void NotifyNewWorkAvailable()
Notify the dynamic build step new work is available.
CancellationTokenSource CancellationTokenSource
This interface describes a class that is capable of providing build steps to a DynamicBuildStep.
DynamicBuildStep(IBuildStepProvider buildStepProvider)