From d3ddefbaa374b26989d794755865367f5496560e Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 27 Jan 2011 21:46:36 +1300 Subject: [PATCH] add ActionQueue, rather than leaving random variables lying around in Game.cs --- OpenRA.FileFormats/OpenRA.FileFormats.csproj | 1 + OpenRA.FileFormats/Primitives/ActionQueue.cs | 40 ++++++++++++++++++++ OpenRA.Game/Game.cs | 13 +++---- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 OpenRA.FileFormats/Primitives/ActionQueue.cs diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj index 5955859895..bc3969d97d 100644 --- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj +++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj @@ -75,6 +75,7 @@ + diff --git a/OpenRA.FileFormats/Primitives/ActionQueue.cs b/OpenRA.FileFormats/Primitives/ActionQueue.cs new file mode 100644 index 0000000000..9ed04c0f86 --- /dev/null +++ b/OpenRA.FileFormats/Primitives/ActionQueue.cs @@ -0,0 +1,40 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see LICENSE. + */ +#endregion + +using System; + +namespace OpenRA.FileFormats +{ + /// + /// A thread-safe action queue, suitable for passing units of work between threads. + /// + public class ActionQueue + { + object syncRoot = new object(); + Action actions = () => { }; + + public void Add(Action a) + { + lock (syncRoot) + actions += a; + } + + public void PerformActions() + { + Action a; + lock (syncRoot) + { + a = actions; + actions = () => { }; + } + a(); + } + } +} diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 259a074c2a..3950b024c5 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -101,10 +101,10 @@ namespace OpenRA { return Widget.OpenWindow(widget, new Dictionary{{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }}); } - - static object syncroot = new object(); - static Action tickActions = () => {}; - public static void RunAfterTick(Action a) { lock(syncroot) tickActions += a; } + + static ActionQueue afterTickActions = new ActionQueue(); + public static void RunAfterTick(Action a) { afterTickActions.Add(a); } + static void Tick( OrderManager orderManager, Viewport viewPort ) { if (orderManager.Connection.ConnectionState != lastConnectionState) @@ -128,9 +128,8 @@ namespace OpenRA PerfHistory.items["batches"].Tick(); MasterServerQuery.Tick(); - Action a; - lock(syncroot) { a = tickActions; tickActions = () => {}; } - a(); + + afterTickActions.PerformActions(); } private static void Tick( OrderManager orderManager )