Skip to content

Commit

Permalink
Dispose of disposable ApiHawk libs when reinitialising
Browse files Browse the repository at this point in the history
  • Loading branch information
YoshiRulz committed Jan 18, 2021
1 parent 5c89d0c commit bba4286
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
7 changes: 6 additions & 1 deletion src/BizHawk.Client.Common/Api/ApiContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace BizHawk.Client.Common
{
public sealed class ApiContainer
public sealed class ApiContainer : IDisposable
{
public readonly IReadOnlyDictionary<Type, IExternalApi> Libraries;

Expand All @@ -26,5 +26,10 @@ public sealed class ApiContainer
public IToolApi Tool => (IToolApi) Libraries[typeof(IToolApi)];

public ApiContainer(IReadOnlyDictionary<Type, IExternalApi> libs) => Libraries = libs;

public void Dispose()
{
foreach (var lib in Libraries.Values) if (lib is IDisposable disposableLib) disposableLib.Dispose();
}
}
}
17 changes: 12 additions & 5 deletions src/BizHawk.Client.EmuHawk/Api/ApiManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ static ApiManager()
_apiTypes = list.ToArray();
}

/// <remarks>TODO do we need to keep references to these because of GC weirdness? --yoshi</remarks>
private static ApiContainer? _container;

private static ApiContainer? _luaContainer;
Expand Down Expand Up @@ -78,8 +77,12 @@ public static IExternalApiProvider Restart(
ToolManager toolManager,
Config config,
IEmulator emulator,
IGameInfo game
) => new BasicApiProvider(_container = Register( serviceProvider, Console.WriteLine, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game));
IGameInfo game)
{
_container?.Dispose();
_container = Register(serviceProvider, Console.WriteLine, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game);
return new BasicApiProvider(_container);
}

public static ApiContainer RestartLua(
IEmulatorServiceProvider serviceProvider,
Expand All @@ -91,7 +94,11 @@ public static ApiContainer RestartLua(
ToolManager toolManager,
Config config,
IEmulator emulator,
IGameInfo game
) => _luaContainer = Register(serviceProvider, logCallback, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game);
IGameInfo game)
{
_luaContainer?.Dispose();
_luaContainer = Register(serviceProvider, logCallback, mainForm, displayManager, inputManager, movieSession, toolManager, config, emulator, game);
return _luaContainer;
}
}
}

0 comments on commit bba4286

Please sign in to comment.