Added extra locking in TrayIconViewModel

This commit is contained in:
Travis Nickles 2019-12-26 15:00:37 -06:00
parent 9d04c0c177
commit ee34544f6f

View File

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Threading;
using System.Windows.Controls; using System.Windows.Controls;
using DS4Windows; using DS4Windows;
@ -42,6 +42,7 @@ namespace DS4WinWPF.DS4Forms.ViewModels
public event EventHandler RequestOpen; public event EventHandler RequestOpen;
public event EventHandler RequestMinimize; public event EventHandler RequestMinimize;
private ReaderWriterLockSlim _colLocker = new ReaderWriterLockSlim();
private List<ControllerHolder> controllerList = new List<ControllerHolder>(); private List<ControllerHolder> controllerList = new List<ControllerHolder>();
private ProfileList profileListHolder; private ProfileList profileListHolder;
private ControlService controlService; private ControlService controlService;
@ -79,22 +80,28 @@ namespace DS4WinWPF.DS4Forms.ViewModels
private void ClearControllerList(object sender, EventArgs e) private void ClearControllerList(object sender, EventArgs e)
{ {
_colLocker.EnterWriteLock();
controllerList.Clear(); controllerList.Clear();
_colLocker.ExitWriteLock();
} }
private void UnhookEvents(object sender, EventArgs e) private void UnhookEvents(object sender, EventArgs e)
{ {
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
RemoveDeviceEvents(currentDev); RemoveDeviceEvents(currentDev);
} }
_colLocker.ExitReadLock();
} }
private void Service_HotplugController(ControlService sender, DS4Device device, int index) private void Service_HotplugController(ControlService sender, DS4Device device, int index)
{ {
SetupDeviceEvents(device); SetupDeviceEvents(device);
_colLocker.EnterWriteLock();
controllerList.Add(new ControllerHolder(device, index)); controllerList.Add(new ControllerHolder(device, index));
_colLocker.ExitWriteLock();
} }
private void ProfileListCol_CollectionChanged(object sender, private void ProfileListCol_CollectionChanged(object sender,
@ -115,6 +122,7 @@ namespace DS4WinWPF.DS4Forms.ViewModels
MenuItem item; MenuItem item;
int idx = 0; int idx = 0;
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
@ -156,6 +164,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
idx++; idx++;
} }
_colLocker.ExitReadLock();
items.Add(item); items.Add(item);
items.Add(new Separator()); items.Add(new Separator());
item = new MenuItem() { Header = "Open" }; item = new MenuItem() { Header = "Open" };
@ -188,7 +198,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
ProfileSelected?.Invoke(this, holder, item.Header.ToString()); ProfileSelected?.Invoke(this, holder, item.Header.ToString());
} }
private void DisconnectMenuItem_Click(object sender, System.Windows.RoutedEventArgs e) private void DisconnectMenuItem_Click(object sender,
System.Windows.RoutedEventArgs e)
{ {
MenuItem item = sender as MenuItem; MenuItem item = sender as MenuItem;
int idx = Convert.ToInt32(item.Tag); int idx = Convert.ToInt32(item.Tag);
@ -214,11 +225,13 @@ namespace DS4WinWPF.DS4Forms.ViewModels
{ {
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
int idx = 0; int idx = 0;
_colLocker.EnterWriteLock();
foreach (DS4Device currentDev in controlService.slotManager.ControllerColl) foreach (DS4Device currentDev in controlService.slotManager.ControllerColl)
{ {
controllerList.Add(new ControllerHolder(currentDev, idx)); controllerList.Add(new ControllerHolder(currentDev, idx));
idx++; idx++;
} }
_colLocker.ExitWriteLock();
} }
private void StartPopulateText(object sender, EventArgs e) private void StartPopulateText(object sender, EventArgs e)
@ -234,12 +247,14 @@ namespace DS4WinWPF.DS4Forms.ViewModels
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
int idx = 1; int idx = 1;
//foreach (DS4Device currentDev in devices) //foreach (DS4Device currentDev in devices)
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
items.Add($"{idx}: {currentDev.ConnectionType} {currentDev.Battery}%{(currentDev.Charging ? "+" : "")}"); items.Add($"{idx}: {currentDev.ConnectionType} {currentDev.Battery}%{(currentDev.Charging ? "+" : "")}");
idx++; idx++;
} }
_colLocker.ExitReadLock();
TooltipText = string.Join("\n", items); TooltipText = string.Join("\n", items);
} }
@ -248,11 +263,13 @@ namespace DS4WinWPF.DS4Forms.ViewModels
{ {
//IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers(); //IEnumerable<DS4Device> devices = DS4Devices.getDS4Controllers();
//foreach (DS4Device currentDev in devices) //foreach (DS4Device currentDev in devices)
_colLocker.EnterReadLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
DS4Device currentDev = holder.Device; DS4Device currentDev = holder.Device;
SetupDeviceEvents(currentDev); SetupDeviceEvents(currentDev);
} }
_colLocker.ExitReadLock();
} }
private void SetupDeviceEvents(DS4Device device) private void SetupDeviceEvents(DS4Device device)
@ -274,6 +291,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
DS4Device currentDev = sender as DS4Device; DS4Device currentDev = sender as DS4Device;
ControllerHolder item = null; ControllerHolder item = null;
int idx = 0; int idx = 0;
_colLocker.EnterWriteLock();
foreach (ControllerHolder holder in controllerList) foreach (ControllerHolder holder in controllerList)
{ {
if (currentDev == holder.Device) if (currentDev == holder.Device)
@ -291,6 +310,8 @@ namespace DS4WinWPF.DS4Forms.ViewModels
RemoveDeviceEvents(currentDev); RemoveDeviceEvents(currentDev);
PopulateToolText(); PopulateToolText();
} }
_colLocker.ExitWriteLock();
} }
private void HookEvents(object sender, EventArgs e) private void HookEvents(object sender, EventArgs e)