Skip to content

Commit 66717c7

Browse files
committed
Several changes to improve unloadability of assemblies.
1 parent 3f199a9 commit 66717c7

5 files changed

Lines changed: 17 additions & 10 deletions

File tree

Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Plugins/AssemblyLoader.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ public void Dispose()
558558
IsDisposed = true;
559559
this.Unload();
560560
this.DisposeInternal();
561-
GC.SuppressFinalize(this);
561+
// we want to call base finalizers
562+
//GC.SuppressFinalize(this);
562563
}
563564

564565
~AssemblyLoader()
@@ -579,6 +580,7 @@ private void OnUnload(AssemblyLoadContext context)
579580
}
580581

581582
var wf = new WeakReference<IAssemblyLoaderService>(this);
583+
_loadedAssemblyData.Clear();
582584
_onUnload?.Invoke(this);
583585
}
584586

Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ModConfigFileParserService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public sealed partial class ModConfigFileParserService :
2323
public ModConfigFileParserService(IStorageService storageService)
2424
{
2525
_storageService = storageService;
26+
_storageService.UseCaching = false;
2627
}
2728

2829
#region Dispose

Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/ModConfigService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public ModConfigService(IStorageService storageService,
4545
#if CLIENT
4646
_stylesParserService = stylesParserService;
4747
#endif
48+
_storageService.UseCaching = false;
4849
}
4950

5051
#region Dispose

Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PluginManagementService.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ private void UnsafeDisposeResourcesInternal()
174174
_pluginInjectorContainer?.Dispose();
175175
_pluginInjectorContainer = null;
176176

177+
ReflectionUtils.ResetCache();
177178
foreach (var loader in _assemblyLoaders)
178179
{
179180
try
@@ -184,14 +185,6 @@ private void UnsafeDisposeResourcesInternal()
184185
catch (Exception e)
185186
{
186187
_logger?.LogError($"Failed to dispose of {nameof(IAssemblyLoaderService)} for ContentPackage {loader.Key.Name}: \n{e.Message}");
187-
if (loader.Value.Assemblies.Any())
188-
{
189-
foreach (var ass in loader.Value.Assemblies)
190-
{
191-
_logger?.LogWarning($"{nameof(PluginManagementService)}: Fallback manual unsubscription of assemblies: {ass.GetName()}");
192-
ReflectionUtils.RemoveAssemblyFromCache(ass);
193-
}
194-
}
195188
}
196189
}
197190
_assemblyLoaders.Clear();
@@ -837,7 +830,9 @@ public FluentResults.Result UnloadManagedAssemblies()
837830

838831
_assemblyLoaders.Clear();
839832
_storageService.PurgeCache();
833+
GC.Collect();
840834
GC.Collect(GC.MaxGeneration, GCCollectionMode.Aggressive, true);
835+
GC.WaitForFullGCComplete(1000);
841836

842837
#if DEBUG
843838
// Print still loaded assembly load ctx after giving some time
@@ -917,6 +912,14 @@ private FluentResults.Result UnsafeDisposeManagedTypeInstances()
917912
_eventService.Value.RemoveDispatcherEventService(_pluginEventService);
918913
_pluginEventService = null;
919914
}
915+
try
916+
{
917+
_pluginInjectorContainer.Dispose();
918+
}
919+
catch (Exception e)
920+
{
921+
results.WithError(new ExceptionalError(e));
922+
}
920923
_pluginInjectorContainer = null;
921924

922925
_pluginInstances.Clear();

Libraries/BarotraumaLibs/BarotraumaCore/Utils/ReflectionUtils.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ public static void RemoveAssemblyFromCache(Assembly assembly)
114114
public static void ResetCache()
115115
{
116116
CachedNonAbstractTypes.Clear();
117-
CachedNonAbstractTypes.TryAdd(typeof(ReflectionUtils).Assembly, typeof(ReflectionUtils).Assembly.GetTypes().Where(t => !t.IsAbstract).ToImmutableArray());
118117
TypeSearchCache.Clear();
118+
CachedNonAbstractTypes.TryAdd(typeof(ReflectionUtils).Assembly, typeof(ReflectionUtils).Assembly.GetTypes().Where(t => !t.IsAbstract).ToImmutableArray());
119119
}
120120

121121
public static Type? GetType(string nameWithNamespace)

0 commit comments

Comments
 (0)