Groups must be locked during reset, otherwise the collection can be modified while enumerating.
This commit is contained in:
Phyxion
2020-07-17 09:48:35 +02:00
parent 988dcd58b3
commit 5d7f476711
16 changed files with 77 additions and 52 deletions
+3 -5
View File
@@ -375,7 +375,6 @@ namespace LibreHardwareMonitor.UI
private void PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs eventArgs)
{
if (eventArgs.Mode == Microsoft.Win32.PowerModes.Resume)
{
_computer.Reset();
@@ -618,14 +617,12 @@ namespace LibreHardwareMonitor.UI
private void NodeTextBoxText_EditorShowing(object sender, CancelEventArgs e)
{
e.Cancel = !(treeView.CurrentNode != null &&
(treeView.CurrentNode.Tag is SensorNode ||
treeView.CurrentNode.Tag is HardwareNode));
e.Cancel = !(treeView.CurrentNode != null && (treeView.CurrentNode.Tag is SensorNode || treeView.CurrentNode.Tag is HardwareNode));
}
private void NodeCheckBox_IsVisibleValueNeeded(object sender, NodeControlValueEventArgs e)
{
e.Value = (e.Node.Tag is SensorNode node) && plotMenuItem.Checked;
e.Value = e.Node.Tag is SensorNode && plotMenuItem.Checked;
}
private void ExitClick(object sender, EventArgs e)
@@ -636,6 +633,7 @@ namespace LibreHardwareMonitor.UI
private void Timer_Tick(object sender, EventArgs e)
{
_computer.Accept(_updateVisitor);
treeView.Invalidate();
_plotPanel.InvalidatePlot();
_systemTray.Redraw();
+58 -27
View File
@@ -12,7 +12,7 @@ using System.Security.Permissions;
using LibreHardwareMonitor.Hardware.Controller.AeroCool;
using LibreHardwareMonitor.Hardware.Controller.AquaComputer;
using LibreHardwareMonitor.Hardware.Controller.Heatmaster;
using LibreHardwareMonitor.Hardware.Controller.Nzxt;
using LibreHardwareMonitor.Hardware.Controller.Nzxt;
using LibreHardwareMonitor.Hardware.Controller.TBalancer;
using LibreHardwareMonitor.Hardware.Gpu;
using LibreHardwareMonitor.Hardware.Memory;
@@ -29,6 +29,7 @@ namespace LibreHardwareMonitor.Hardware
private bool _controllerEnabled;
private bool _cpuEnabled;
private bool _gpuEnabled;
private readonly object _lock = new object();
private bool _memoryEnabled;
private bool _motherboardEnabled;
private bool _networkEnabled;
@@ -46,18 +47,19 @@ namespace LibreHardwareMonitor.Hardware
_settings = settings ?? new Settings();
}
public IHardware[] Hardware
public IList<IHardware> Hardware
{
get
{
List<IHardware> list = new List<IHardware>();
foreach (IGroup group in _groups)
lock (_lock)
{
foreach (IHardware hardware in group.Hardware)
list.Add(hardware);
}
List<IHardware> list = new List<IHardware>();
return list.ToArray();
foreach (IGroup group in _groups)
list.AddRange(group.Hardware);
return list;
}
}
}
@@ -218,8 +220,10 @@ namespace LibreHardwareMonitor.Hardware
public string GetReport()
{
using (StringWriter w = new StringWriter(CultureInfo.InvariantCulture))
lock (_lock)
{
using StringWriter w = new StringWriter(CultureInfo.InvariantCulture);
w.WriteLine();
w.WriteLine(nameof(LibreHardwareMonitor) + " Report");
w.WriteLine();
@@ -251,6 +255,7 @@ namespace LibreHardwareMonitor.Hardware
NewSection(w);
w.WriteLine("Sensors");
w.WriteLine();
foreach (IGroup group in _groups)
{
foreach (IHardware hardware in group.Hardware)
@@ -262,6 +267,7 @@ namespace LibreHardwareMonitor.Hardware
NewSection(w);
w.WriteLine("Parameters");
w.WriteLine();
foreach (IGroup group in _groups)
{
foreach (IHardware hardware in group.Hardware)
@@ -299,20 +305,26 @@ namespace LibreHardwareMonitor.Hardware
public void Traverse(IVisitor visitor)
{
foreach (IGroup group in _groups)
lock (_lock)
{
foreach (IHardware hardware in group.Hardware)
hardware.Accept(visitor);
foreach (IGroup group in _groups)
{
foreach (IHardware hardware in group.Hardware)
hardware.Accept(visitor);
}
}
}
private void Add(IGroup group)
{
if (_groups.Contains(group))
return;
lock (_lock)
{
if (_groups.Contains(group))
return;
_groups.Add(group);
_groups.Add(group);
}
if (HardwareAdded != null)
{
@@ -323,11 +335,16 @@ namespace LibreHardwareMonitor.Hardware
private void Remove(IGroup group)
{
if (!_groups.Contains(group))
return;
lock (_lock)
{
if (!_groups.Contains(group))
return;
_groups.Remove(group);
}
_groups.Remove(group);
if (HardwareRemoved != null)
{
foreach (IHardware hardware in group.Hardware)
@@ -340,10 +357,14 @@ namespace LibreHardwareMonitor.Hardware
private void RemoveType<T>() where T : IGroup
{
List<IGroup> list = new List<IGroup>();
foreach (IGroup group in _groups)
lock (_lock)
{
if (group is T)
list.Add(group);
foreach (IGroup group in _groups)
{
if (group is T)
list.Add(group);
}
}
foreach (IGroup group in list)
@@ -423,6 +444,7 @@ namespace LibreHardwareMonitor.Hardware
{
w.WriteLine("{0}|", space);
w.WriteLine("{0}+- {1} ({2})", space, hardware.Name, hardware.Identifier);
ISensor[] sensors = hardware.Sensors;
Array.Sort(sensors, CompareSensor);
@@ -437,8 +459,10 @@ namespace LibreHardwareMonitor.Hardware
{
w.WriteLine("{0}|", space);
w.WriteLine("{0}+- {1} ({2})", space, hardware.Name, hardware.Identifier);
ISensor[] sensors = hardware.Sensors;
Array.Sort(sensors, CompareSensor);
foreach (ISensor sensor in sensors)
{
string innerSpace = space + "| ";
@@ -446,6 +470,7 @@ namespace LibreHardwareMonitor.Hardware
{
w.WriteLine("{0}|", innerSpace);
w.WriteLine("{0}+- {1} ({2})", innerSpace, sensor.Name, sensor.Identifier);
foreach (IParameter parameter in sensor.Parameters)
{
string innerInnerSpace = innerSpace + "| ";
@@ -477,10 +502,13 @@ namespace LibreHardwareMonitor.Hardware
return;
while (_groups.Count > 0)
lock (_lock)
{
IGroup group = _groups[_groups.Count - 1];
Remove(group);
while (_groups.Count > 0)
{
IGroup group = _groups[_groups.Count - 1];
Remove(group);
}
}
OpCode.Close();
@@ -502,10 +530,13 @@ namespace LibreHardwareMonitor.Hardware
private void RemoveGroups()
{
while (_groups.Count > 0)
lock (_lock)
{
IGroup group = _groups[_groups.Count - 1];
Remove(group);
while (_groups.Count > 0)
{
IGroup group = _groups[_groups.Count - 1];
Remove(group);
}
}
}
@@ -39,7 +39,7 @@ namespace LibreHardwareMonitor.Hardware.Controller.AeroCool
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public void Close()
{
@@ -63,7 +63,7 @@ namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public void Close()
{
@@ -131,7 +131,7 @@ namespace LibreHardwareMonitor.Hardware.Controller.Heatmaster
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -51,7 +51,7 @@ namespace LibreHardwareMonitor.Hardware.Controller.Nzxt
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public void Close()
{
@@ -160,7 +160,7 @@ namespace LibreHardwareMonitor.Hardware.Controller.TBalancer
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -68,7 +68,7 @@ namespace LibreHardwareMonitor.Hardware.CPU
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -103,7 +103,7 @@ namespace LibreHardwareMonitor.Hardware.Gpu
}
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -85,7 +85,7 @@ namespace LibreHardwareMonitor.Hardware.Gpu
_report.AppendLine();
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -4,6 +4,8 @@
// Partial Copyright (C) Michael Möller <mmoeller@openhardwaremonitor.org> and Contributors.
// All Rights Reserved.
using System.Collections.Generic;
namespace LibreHardwareMonitor.Hardware
{
public delegate void HardwareEventHandler(IHardware hardware);
@@ -16,7 +18,7 @@ namespace LibreHardwareMonitor.Hardware
bool IsGpuEnabled { get; }
IHardware[] Hardware { get; }
IList<IHardware> Hardware { get; }
bool IsStorageEnabled { get; }
+1 -1
View File
@@ -10,7 +10,7 @@ namespace LibreHardwareMonitor.Hardware
{
internal interface IGroup
{
IEnumerable<IHardware> Hardware { get; }
IReadOnlyList<IHardware> Hardware { get; }
string GetReport();
@@ -28,7 +28,7 @@ namespace LibreHardwareMonitor.Hardware.Memory
return null;
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public void Close()
{
@@ -18,10 +18,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard
_motherboards[0] = new Motherboard(smbios, settings);
}
public IEnumerable<IHardware> Hardware
{
get { return _motherboards; }
}
public IReadOnlyList<IHardware> Hardware => _motherboards;
public void Close()
{
@@ -26,10 +26,7 @@ namespace LibreHardwareMonitor.Hardware.Network
NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAddressChanged;
}
public IEnumerable<IHardware> Hardware
{
get { return _hardware; }
}
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{
@@ -44,7 +44,7 @@ namespace LibreHardwareMonitor.Hardware.Storage
mosDisks.Dispose();
}
public IEnumerable<IHardware> Hardware => _hardware;
public IReadOnlyList<IHardware> Hardware => _hardware;
public string GetReport()
{