ServerManagers/src/ServerManager.Common/Model/ProcessorAffinityList.cs
2021-01-07 16:23:23 +10:00

67 lines
2.1 KiB
C#

using ServerManagerTool.Common.Utils;
using System.Linq;
using System.Numerics;
namespace ServerManagerTool.Common.Model
{
public class ProcessorAffinityList : SortableObservableCollection<ProcessorAffinityItem>
{
private bool _allProcessors;
public ProcessorAffinityList(BigInteger affinityValue)
{
AllProcessors = true;
PopulateAffinities(affinityValue);
}
public bool AllProcessors
{
get { return this._allProcessors; }
set
{
this._allProcessors = value;
OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs(nameof(AllProcessors)));
}
}
public BigInteger AffinityValue
{
get
{
if (AllProcessors || this.Count(i => i.Selected) == this.Count)
return BigInteger.Zero;
var affinity = BigInteger.Zero;
foreach (var value in this.Where(i => i.Selected).Select(i => i.AffinityValue))
affinity += value;
return affinity;
}
}
private void PopulateAffinities(BigInteger affinityValue)
{
var list = ProcessUtils.GetProcessorAffinityList();
var index = 0;
if (!ProcessUtils.IsProcessorAffinityValid(affinityValue))
affinityValue = BigInteger.Zero;
foreach (var item in list)
{
if (item == 0)
continue;
this.Add(new ProcessorAffinityItem() { Selected = affinityValue == BigInteger.Zero || ((affinityValue & item) == item), AffinityValue = item, Description = $"{index}" });
index++;
}
var affinity = BigInteger.Zero;
if (this.Count(i => i.Selected) != this.Count)
{
foreach (var value in this.Where(i => i.Selected).Select(i => i.AffinityValue))
affinity += value;
}
AllProcessors = affinity == BigInteger.Zero;
}
}
}