From c755d651cce43fda558052dc3b2b207785e32434 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 5 Oct 2016 13:41:35 -0600 Subject: [PATCH 1/3] Removed all destructors since they were a very bad idea to implement --- .../Connections/Multiuser/RemoteConnectionsSyncronizer.cs | 5 +---- .../Connections/Multiuser/SqlConnectionsUpdateChecker.cs | 6 ------ mRemoteV1/Config/DataProviders/SqlDataProvider.cs | 5 ----- mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs | 5 ----- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs index 44e720cce..6be9165bf 100644 --- a/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs +++ b/mRemoteV1/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs @@ -70,10 +70,7 @@ namespace mRemoteNG.Config.Connections public event UpdateCheckFinishedEventHandler UpdateCheckFinished; public event ConnectionsUpdateAvailableEventHandler ConnectionsUpdateAvailable; - ~RemoteConnectionsSyncronizer() - { - Dispose(false); - } + public void Dispose() { Dispose(true); diff --git a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs index eb9f26456..007237280 100644 --- a/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs +++ b/mRemoteV1/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs @@ -101,12 +101,6 @@ namespace mRemoteNG.Config.Connections _lastUpdateTime = _lastDatabaseUpdateTime; } - - ~SqlConnectionsUpdateChecker() - { - Dispose(false); - } - public void Dispose() { Dispose(true); diff --git a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs index 2b91c955d..26d81e5e6 100644 --- a/mRemoteV1/Config/DataProviders/SqlDataProvider.cs +++ b/mRemoteV1/Config/DataProviders/SqlDataProvider.cs @@ -14,11 +14,6 @@ namespace mRemoteNG.Config.DataProviders SqlDatabaseConnector = sqlDatabaseConnector; } - ~SqlDataProvider() - { - SqlDatabaseConnector.Dispose(); - } - public DataTable Load() { var dataTable = new DataTable(); diff --git a/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs b/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs index ba13a1967..b8b3c9194 100644 --- a/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs +++ b/mRemoteV1/Config/DatabaseConnectors/SqlDatabaseConnector.cs @@ -21,11 +21,6 @@ namespace mRemoteNG.Config.DatabaseConnectors Initialize(); } - ~SqlDatabaseConnector() - { - Dispose(false); - } - private void Initialize() { BuildSqlConnectionString(); From 67c01046be36e0b938a5239f2f3fb62831faf37f Mon Sep 17 00:00:00 2001 From: David Sparer Date: Wed, 5 Oct 2016 13:50:55 -0600 Subject: [PATCH 2/3] Removed unnecessary implementations of IDisposable --- mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs | 1 - mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs | 1 - mRemoteV1/Connection/ConnectionInfo.cs | 7 +------ mRemoteV1/Container/ContainerInfo.cs | 8 -------- mRemoteV1/Tree/ConnectionTreeModel.cs | 2 +- 5 files changed, 2 insertions(+), 17 deletions(-) diff --git a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs index 7956a757c..402a32016 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsRegistryProvider.cs @@ -110,7 +110,6 @@ namespace mRemoteNG.Config.Putty if (_eventWatcher == null) return; _eventWatcher.Stop(); _eventWatcher.Dispose(); - _eventWatcher = null; } #endregion diff --git a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs index 79278964d..5461a8dbc 100644 --- a/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs +++ b/mRemoteV1/Config/Putty/PuttySessionsXmingProvider.cs @@ -162,7 +162,6 @@ namespace mRemoteNG.Config.Putty } _eventWatcher.EnableRaisingEvents = false; _eventWatcher.Dispose(); - _eventWatcher = null; } #endregion diff --git a/mRemoteV1/Connection/ConnectionInfo.cs b/mRemoteV1/Connection/ConnectionInfo.cs index 75b4d331d..f1f520986 100644 --- a/mRemoteV1/Connection/ConnectionInfo.cs +++ b/mRemoteV1/Connection/ConnectionInfo.cs @@ -23,7 +23,7 @@ using mRemoteNG.Tree; namespace mRemoteNG.Connection { [DefaultProperty("Name")] - public class ConnectionInfo : AbstractConnectionInfoData, IHasParent, IInheritable, IDisposable + public class ConnectionInfo : AbstractConnectionInfoData, IHasParent, IInheritable { #region Public Properties [Browsable(false)] @@ -137,11 +137,6 @@ namespace mRemoteNG.Connection { Parent?.RemoveChild(this); } - - public virtual void Dispose() - { - RemoveParent(); - } #endregion #region Public Enumerations diff --git a/mRemoteV1/Container/ContainerInfo.cs b/mRemoteV1/Container/ContainerInfo.cs index 6cec738fe..ecccd08c4 100644 --- a/mRemoteV1/Container/ContainerInfo.cs +++ b/mRemoteV1/Container/ContainerInfo.cs @@ -173,14 +173,6 @@ namespace mRemoteNG.Container SortOn(propertyToCompare, sortDirection); } - public override void Dispose() - { - var tempChildList = Children.ToArray(); - foreach (var child in tempChildList) - child.Dispose(); - RemoveParent(); - } - // Deep clone, recursive public override ConnectionInfo Clone() { diff --git a/mRemoteV1/Tree/ConnectionTreeModel.cs b/mRemoteV1/Tree/ConnectionTreeModel.cs index b36c75ecb..8915f2db4 100644 --- a/mRemoteV1/Tree/ConnectionTreeModel.cs +++ b/mRemoteV1/Tree/ConnectionTreeModel.cs @@ -60,7 +60,7 @@ namespace mRemoteNG.Tree if (connectionInfo is RootNodeInfo) return; - connectionInfo?.Dispose(); + connectionInfo?.RemoveParent(); } public void CloneNode(ConnectionInfo connectionInfo) From 2ffcccdc6ff6a14fe75bb0693a9250066659a482 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Thu, 6 Oct 2016 11:04:00 -0600 Subject: [PATCH 3/3] Fixed minor memory leak of Collection and Property changed event handlers when changing the ConnectionTreeModel associated to the ConnectionTreeWindow --- mRemoteV1/UI/Window/ConnectionTreeWindow.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs index 2374c49d3..73001c41a 100644 --- a/mRemoteV1/UI/Window/ConnectionTreeWindow.cs +++ b/mRemoteV1/UI/Window/ConnectionTreeWindow.cs @@ -222,21 +222,34 @@ namespace mRemoteNG.UI.Window private void PopulateTreeView() { + UnregisterModelUpdateHandlers(); olvConnections.SetObjects(ConnectionTreeModel.RootNodes); - SetModelUpdateHandlers(); + RegisterModelUpdateHandlers(); _nodeSearcher = new NodeSearcher(ConnectionTreeModel); ExpandPreviouslyOpenedFolders(); ExpandRootConnectionNode(); OpenConnectionsFromLastSession(); } - private void SetModelUpdateHandlers() + private void RegisterModelUpdateHandlers() { - _puttySessionsManager.PuttySessionsCollectionChanged += (sender, args) => RefreshTreeObjects(GetRootPuttyNodes().ToList()); + _puttySessionsManager.PuttySessionsCollectionChanged += OnPuttySessionsCollectionChanged; ConnectionTreeModel.CollectionChanged += HandleCollectionChanged; ConnectionTreeModel.PropertyChanged += HandleCollectionPropertyChanged; } + private void UnregisterModelUpdateHandlers() + { + _puttySessionsManager.PuttySessionsCollectionChanged -= OnPuttySessionsCollectionChanged; + ConnectionTreeModel.CollectionChanged -= HandleCollectionChanged; + ConnectionTreeModel.PropertyChanged -= HandleCollectionPropertyChanged; + } + + private void OnPuttySessionsCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) + { + RefreshTreeObjects(GetRootPuttyNodes().ToList()); + } + private void HandleCollectionPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { //TODO for some reason property changed events are getting triggered twice for each changed property. should be just once. cant find source of duplication