private void AddProcessesToIdleProcessors(int numToAdd) { var processors = Processors; var idlingProcessors = processors.Where(processor => processor.IsIdling); var idlingProcessorsAsList = idlingProcessors.ToList(); foreach (var processor in idlingProcessorsAsList) { if (ProcessProducer.CanProduce(numToAdd)) { processor.AddToLocalQueue(ProcessProducer.ProduceProcesses(numToAdd, processor.CurrentClockCycle)); } else if (!ProcessProducer.IsDoneProducing) { var leftoverProcesses = ProcessProducer.ProcessesCanProduce; processor.AddToLocalQueue( ProcessProducer.ProduceProcesses(leftoverProcesses, processor.CurrentClockCycle)); } else if (ProcessProducer.IsDoneProducing) { break; } } Processors.RemoveAll(processor => processor.IsIdling); Processors.AddRange(idlingProcessorsAsList); }
/// <summary> /// Adds processes to each producer by at most the given amount. /// </summary> /// <param name="numToAddPerProcessor">The maximum number of processes to allot to each processor.</param> private void AddProcessesToProcessors(int numToAddPerProcessor) { foreach (var processor in Processors) { if (ProcessProducer.CanProduce(numToAddPerProcessor)) { processor.AddToLocalQueue(ProcessProducer.ProduceProcesses(numToAddPerProcessor, 0)); } else if (ProcessProducer.IsDoneProducing) { break; } else { var producerCanProduce = ProcessProducer.ProcessesCanProduce; processor.AddToLocalQueue(ProcessProducer.ProduceProcesses(producerCanProduce, 0)); } } }