From 63e4490194f8f59183a314f821842f2826c9c7dc Mon Sep 17 00:00:00 2001 From: Aireil <33433913+Aireil@users.noreply.github.com> Date: Thu, 4 Aug 2022 22:54:09 +0200 Subject: [PATCH] Do not try to dispose undisposable plugins (#949) --- Dalamud/Plugin/Internal/PluginManager.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dalamud/Plugin/Internal/PluginManager.cs b/Dalamud/Plugin/Internal/PluginManager.cs index 1889cbd50..b19f89bbb 100644 --- a/Dalamud/Plugin/Internal/PluginManager.cs +++ b/Dalamud/Plugin/Internal/PluginManager.cs @@ -265,10 +265,12 @@ internal partial class PluginManager : IDisposable, IServiceType /// public void Dispose() { - if (this.InstalledPlugins.Any()) + var disposablePlugins = + this.InstalledPlugins.Where(plugin => plugin.State is PluginState.Loaded or PluginState.LoadError).ToArray(); + if (disposablePlugins.Any()) { // Unload them first, just in case some of plugin codes are still running via callbacks initiated externally. - foreach (var plugin in this.InstalledPlugins.Where(plugin => !plugin.Manifest.CanUnloadAsync)) + foreach (var plugin in disposablePlugins.Where(plugin => !plugin.Manifest.CanUnloadAsync)) { try { @@ -280,7 +282,7 @@ internal partial class PluginManager : IDisposable, IServiceType } } - Task.WaitAll(this.InstalledPlugins + Task.WaitAll(disposablePlugins .Where(plugin => plugin.Manifest.CanUnloadAsync) .Select(plugin => Task.Run(async () => { @@ -300,7 +302,7 @@ internal partial class PluginManager : IDisposable, IServiceType // Now that we've waited enough, dispose the whole plugin. // Since plugins should have been unloaded above, this should be done quickly. - foreach (var plugin in this.InstalledPlugins) + foreach (var plugin in disposablePlugins) plugin.ExplicitDisposeIgnoreExceptions($"Error disposing {plugin.Name}", Log); }