diff --git a/OpenRA.FileFormats/Primitives/DisposableAction.cs b/OpenRA.FileFormats/Primitives/DisposableAction.cs index 78ed9ea942..65bb2b5676 100644 --- a/OpenRA.FileFormats/Primitives/DisposableAction.cs +++ b/OpenRA.FileFormats/Primitives/DisposableAction.cs @@ -14,22 +14,27 @@ namespace OpenRA { public class DisposableAction : IDisposable { - public DisposableAction(Action a) { this.a = a; } + public DisposableAction(Action onDispose, Action onFinalize) + { + this.onDispose = onDispose; + this.onFinalize = onFinalize; + } - Action a; + Action onDispose; + Action onFinalize; bool disposed; public void Dispose() { if (disposed) return; disposed = true; - a(); + onDispose(); GC.SuppressFinalize(this); } ~DisposableAction() { - Dispose(); + onFinalize(); } } } diff --git a/OpenRA.Mods.RA/Reservable.cs b/OpenRA.Mods.RA/Reservable.cs index feb23a124e..f32e37eae8 100755 --- a/OpenRA.Mods.RA/Reservable.cs +++ b/OpenRA.Mods.RA/Reservable.cs @@ -32,10 +32,10 @@ namespace OpenRA.Mods.RA { reservedFor = forActor; - return new DisposableAction(() => - { - reservedFor = null; - }); + return new DisposableAction(() => { reservedFor = null; }, + () => Game.RunAfterTick(() => + {throw new InvalidOperationException("Attempted to finalize an undisposed DisposableAction");}) + ); } public static bool IsReserved(Actor a)