From 7f39909dc82bb88ba00f99e075f32eca22db45d1 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 24 Feb 2011 17:26:14 +1300 Subject: [PATCH] Throw an exception if a reservation is eaten by the GC. Better to die early with a known error than to desync later. --- OpenRA.FileFormats/Primitives/DisposableAction.cs | 13 +++++++++---- OpenRA.Mods.RA/Reservable.cs | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) 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)