From 6103e06a3425de19213746e1cd6933fa2468c979 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sun, 22 Apr 2007 18:00:01 +0000 Subject: Added lock around World.Update to prevent multiple updates occuring simultaneously (it happened!) --- OpenSim.RegionServer/world/World.cs | 69 ++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 32 deletions(-) (limited to 'OpenSim.RegionServer') diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs index 693db4d..0291467 100644 --- a/OpenSim.RegionServer/world/World.cs +++ b/OpenSim.RegionServer/world/World.cs @@ -41,6 +41,7 @@ namespace OpenSim.world private string m_regionName; private InventoryCache _inventoryCache; private AssetCache _assetCache; + private int updateLock; /// /// Creates a new World class, and a region to go with it. @@ -52,6 +53,7 @@ namespace OpenSim.world { try { + updateLock = 0; m_clientThreads = clientThreads; m_regionHandle = regionHandle; m_regionName = regionName; @@ -183,49 +185,52 @@ namespace OpenSim.world /// public void Update() { - try + lock (updateLock) { - if (this.phyScene.IsThreaded) + try { - this.phyScene.GetResults(); + if (this.phyScene.IsThreaded) + { + this.phyScene.GetResults(); - } + } - foreach (libsecondlife.LLUUID UUID in Entities.Keys) - { - Entities[UUID].addForces(); - } + foreach (libsecondlife.LLUUID UUID in Entities.Keys) + { + Entities[UUID].addForces(); + } - lock (this.LockPhysicsEngine) - { - this.phyScene.Simulate(timeStep); - } + lock (this.LockPhysicsEngine) + { + this.phyScene.Simulate(timeStep); + } - foreach (libsecondlife.LLUUID UUID in Entities.Keys) - { - Entities[UUID].update(); - } + foreach (libsecondlife.LLUUID UUID in Entities.Keys) + { + Entities[UUID].update(); + } - foreach (ScriptHandler scriptHandler in m_scriptHandlers.Values) - { - scriptHandler.OnFrame(); - } - foreach (IScriptEngine scripteng in this.scriptEngines.Values) - { - scripteng.OnFrame(); + foreach (ScriptHandler scriptHandler in m_scriptHandlers.Values) + { + scriptHandler.OnFrame(); + } + foreach (IScriptEngine scripteng in this.scriptEngines.Values) + { + scripteng.OnFrame(); + } + //backup world data + this.storageCount++; + if (storageCount > 1200) //set to how often you want to backup + { + this.Backup(); + storageCount = 0; + } } - //backup world data - this.storageCount++; - if (storageCount > 1200) //set to how often you want to backup + catch (Exception e) { - this.Backup(); - storageCount = 0; + OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: Update() - Failed with exception " + e.ToString()); } } - catch (Exception e) - { - OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: Update() - Failed with exception " + e.ToString()); - } } /// -- cgit v1.1