From b5f6aa6ff271ef3db95570f48bdf0e4a2b775e33 Mon Sep 17 00:00:00 2001 From: Dr Scofield Date: Tue, 24 Mar 2009 08:21:50 +0000 Subject: [PATCH] From: Alan Webb Changes to AssetCache and DynamicTextureModule to eliminate opportunities for lost texture updates. --- .../Communications/Cache/AssetCache.cs | 22 ++++------ .../DynamicTexture/DynamicTextureModule.cs | 44 ++++++++++++++++--- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index 7d06a1e502..bd0b1b1d6e 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -350,7 +350,7 @@ namespace OpenSim.Framework.Communications.Cache // If it's a direct request for a script, drop it // because it's a hacked client if (req.AssetRequestSource != 2 || assetInf.Type != 10) - AssetRequests.Add(req); + lock(AssetRequests) AssetRequests.Add(req); } } @@ -487,7 +487,7 @@ namespace OpenSim.Framework.Communications.Cache req.Params = transferRequest.TransferInfo.Params; req.AssetInf = new AssetInfo(asset); req.NumPackets = CalculateNumPackets(asset.Data); - AssetRequests.Add(req); + lock(AssetRequests) AssetRequests.Add(req); } /// @@ -506,16 +506,16 @@ namespace OpenSim.Framework.Communications.Cache int num = Math.Min(5, AssetRequests.Count); AssetRequest req; - AssetRequestToClient req2 = null; + AssetRequestToClient req2 = new AssetRequestToClient(); + for (int i = 0; i < num; i++) { - req = AssetRequests[i]; - if (req2 == null) + lock(AssetRequests) { - req2 = new AssetRequestToClient(); + req = AssetRequests[0]; + AssetRequests.RemoveAt(0); } - - // Trying to limit memory usage by only creating AssetRequestToClient if needed + req2.AssetInf = req.AssetInf; req2.AssetRequestSource = req.AssetRequestSource; req2.DataPointer = req.DataPointer; @@ -528,13 +528,9 @@ namespace OpenSim.Framework.Communications.Cache req2.RequestAssetID = req.RequestAssetID; req2.TransferRequestID = req.TransferRequestID; req.RequestUser.SendAsset(req2); + } - //remove requests that have been completed - for (int i = 0; i < num; i++) - { - AssetRequests.RemoveAt(0); - } } public class AssetRequest diff --git a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs index b4ec7ae496..dedd37fb60 100644 --- a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs @@ -66,15 +66,37 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture /// public void ReturnData(UUID id, byte[] data) { - if (Updaters.ContainsKey(id)) + + DynamicTextureUpdater updater = null; + + lock(Updaters) + { + if (Updaters.ContainsKey(id)) + { + updater = Updaters[id]; + } + } + + if(updater != null) { - DynamicTextureUpdater updater = Updaters[id]; if (RegisteredScenes.ContainsKey(updater.SimUUID)) { Scene scene = RegisteredScenes[updater.SimUUID]; updater.DataReceived(data, scene); } } + + if(updater.UpdateTimer == 0) + { + lock(Updaters) + { + if (!Updaters.ContainsKey(updater.UpdaterID)) + { + Updaters.Remove(updater.UpdaterID); + } + } + } + } public UUID AddDynamicTextureURL(UUID simID, UUID primID, string contentType, string url, @@ -101,9 +123,12 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture updater.BlendWithOldTexture = SetBlending; updater.FrontAlpha = AlphaValue; - if (!Updaters.ContainsKey(updater.UpdaterID)) + lock(Updaters) { - Updaters.Add(updater.UpdaterID, updater); + if (!Updaters.ContainsKey(updater.UpdaterID)) + { + Updaters.Add(updater.UpdaterID, updater); + } } RenderPlugins[contentType].AsyncConvertUrl(updater.UpdaterID, url, extraParams); @@ -134,9 +159,12 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture updater.BlendWithOldTexture = SetBlending; updater.FrontAlpha = AlphaValue; - if (!Updaters.ContainsKey(updater.UpdaterID)) + lock(Updaters) { - Updaters.Add(updater.UpdaterID, updater); + if (!Updaters.ContainsKey(updater.UpdaterID)) + { + Updaters.Add(updater.UpdaterID, updater); + } } RenderPlugins[contentType].AsyncConvertData(updater.UpdaterID, data, extraParams); @@ -270,7 +298,6 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture // remove the old asset from the cache UUID oldID = tmptex.DefaultTexture.TextureID; - scene.CommsManager.AssetCache.ExpireAsset(oldID); tmptex.DefaultTexture.TextureID = asset.FullID; // I'm pretty sure we always want to force this to true @@ -278,6 +305,9 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture part.Shape.Textures = tmptex; part.ScheduleFullUpdate(); + + scene.CommsManager.AssetCache.ExpireAsset(oldID); + } private byte[] BlendTextures(byte[] frontImage, byte[] backImage, bool setNewAlpha, byte newAlpha)