fix: wait for services to unload in framework destroy

This commit is contained in:
goat 2023-03-09 11:45:24 +01:00
parent 48611dcb74
commit 01efbf358a
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
2 changed files with 16 additions and 4 deletions

View file

@ -492,10 +492,7 @@ public sealed class Framework : IDisposable, IServiceType
Log.Information("Framework::Destroy!");
Service<Dalamud>.Get().Unload();
this.RunPendingTickTasks();
// why did we do this here? EntryPoint also does it when the signal is set, what sense does that make
// we should definitely wait for pending tick tasks though
// ServiceManager.UnloadAllServices();
ServiceManager.WaitForServiceUnload();
Log.Information("Framework::Destroy OK!");
return this.destroyHook.OriginalDisposeSafe(framework);

View file

@ -4,6 +4,7 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Dalamud.Configuration.Internal;
@ -35,6 +36,8 @@ internal static class ServiceManager
private static readonly TaskCompletionSource BlockingServicesLoadedTaskCompletionSource = new();
private static readonly List<Type> LoadedServices = new();
private static ManualResetEvent unloadResetEvent = new(false);
/// <summary>
/// Kinds of services.
@ -285,6 +288,8 @@ internal static class ServiceManager
return;
}
unloadResetEvent.Reset();
var dependencyServicesMap = new Dictionary<Type, List<Type>>();
var allToUnload = new HashSet<Type>();
var unloadOrder = new List<Type>();
@ -351,6 +356,16 @@ internal static class ServiceManager
{
LoadedServices.Clear();
}
unloadResetEvent.Set();
}
/// <summary>
/// Wait until all services have been unloaded.
/// </summary>
public static void WaitForServiceUnload()
{
unloadResetEvent.WaitOne();
}
/// <summary>