Fixes #266
Groups must be locked during reset, otherwise the collection can be modified while enumerating.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user