From 4b4ee9807054bdb06d7b1c3e0a5205836aff4f3c Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Wed, 2 Jan 2008 09:07:11 +0000 Subject: * Trying to address TextureSender issues * The BlockingQueue exposes Contains so we can make sure we don't add a TextureSender to the queue if there's already one present * introduced some TryGetValue and various code convention stuff --- .../Environment/Modules/TextureDownloadModule.cs | 75 +++++++++++++--------- 1 file changed, 43 insertions(+), 32 deletions(-) (limited to 'OpenSim/Region/Environment/Modules') diff --git a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs index 813be8d..6d5d5e8 100644 --- a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs +++ b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs @@ -47,7 +47,7 @@ namespace OpenSim.Region.Environment.Modules private Scene m_scene; private List m_scenes = new List(); - private BlockingQueue QueueSenders = new BlockingQueue(); + private readonly BlockingQueue m_queueSenders = new BlockingQueue(); private Dictionary m_userTextureServices = new Dictionary(); @@ -108,7 +108,7 @@ namespace OpenSim.Region.Environment.Modules return true; } - textureService = new UserTextureDownloadService(m_scene, QueueSenders); + textureService = new UserTextureDownloadService(m_scene, m_queueSenders); m_userTextureServices.Add(userID, textureService); return true; } @@ -128,7 +128,7 @@ namespace OpenSim.Region.Environment.Modules { while (true) { - TextureSender sender = QueueSenders.Dequeue(); + TextureSender sender = m_queueSenders.Dequeue(); if (sender.Cancel) { TextureSent(sender); @@ -142,7 +142,7 @@ namespace OpenSim.Region.Environment.Modules } else { - QueueSenders.Enqueue(sender); + m_queueSenders.Enqueue(sender); } } } @@ -155,11 +155,9 @@ namespace OpenSim.Region.Environment.Modules public class UserTextureDownloadService { - private Dictionary m_textureSenders = new Dictionary(); - - private BlockingQueue m_sharedSendersQueue; - - private Scene m_scene; + private readonly Dictionary m_textureSenders = new Dictionary(); + private readonly BlockingQueue m_sharedSendersQueue; + private readonly Scene m_scene; public UserTextureDownloadService(Scene scene, BlockingQueue sharedQueue) { @@ -169,38 +167,45 @@ namespace OpenSim.Region.Environment.Modules public void HandleTextureRequest(IClientAPI client, TextureRequestArgs e) { + TextureSender textureSender; + //TODO: should be working out the data size/ number of packets to be sent for each discard level if ((e.DiscardLevel >= 0) || (e.Priority != 0)) { lock (m_textureSenders) { - if (!m_textureSenders.ContainsKey(e.RequestedAssetID)) + if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) + { + textureSender.UpdateRequest(e.DiscardLevel, e.PacketNumber); + textureSender.counter = 0; + + if ((textureSender.ImageLoaded) && + (textureSender.Sending == false)) + { + textureSender.Sending = true; + + if (!m_sharedSendersQueue.Contains(textureSender)) + { + m_sharedSendersQueue.Enqueue(textureSender); + } + } + } + else { TextureSender requestHandler = new TextureSender(client, e.RequestedAssetID, e.DiscardLevel, e.PacketNumber); m_textureSenders.Add(e.RequestedAssetID, requestHandler); m_scene.AssetCache.GetAsset(e.RequestedAssetID, TextureCallback); } - else - { - m_textureSenders[e.RequestedAssetID].UpdateRequest(e.DiscardLevel, e.PacketNumber); - m_textureSenders[e.RequestedAssetID].counter = 0; - if ((m_textureSenders[e.RequestedAssetID].ImageLoaded) && - (m_textureSenders[e.RequestedAssetID].Sending == false)) - { - m_textureSenders[e.RequestedAssetID].Sending = true; - m_sharedSendersQueue.Enqueue(m_textureSenders[e.RequestedAssetID]); - } - } } } else { lock (m_textureSenders) { - if (m_textureSenders.ContainsKey(e.RequestedAssetID)) + if (m_textureSenders.TryGetValue(e.RequestedAssetID, out textureSender)) { - m_textureSenders[e.RequestedAssetID].Cancel = true; + textureSender.Cancel = true; } } } @@ -210,19 +215,25 @@ namespace OpenSim.Region.Environment.Modules { lock (m_textureSenders) { - if (m_textureSenders.ContainsKey(textureID)) + TextureSender textureSender; + + if (m_textureSenders.TryGetValue(textureID, out textureSender)) { - if (!m_textureSenders[textureID].ImageLoaded) + if (!textureSender.ImageLoaded) { - m_textureSenders[textureID].TextureReceived(asset); - m_textureSenders[textureID].Sending = true; - m_textureSenders[textureID].counter = 0; - m_sharedSendersQueue.Enqueue(m_textureSenders[textureID]); + textureSender.TextureReceived(asset); + textureSender.Sending = true; + textureSender.counter = 0; + + if (!m_sharedSendersQueue.Contains(textureSender)) + { + m_sharedSendersQueue.Enqueue(textureSender); + } } } else { - // Got a texture with no sender object to handle it, this shouldn't happen + throw new Exception("Got a texture with no sender object to handle it, this shouldn't happen"); } } } @@ -329,9 +340,9 @@ namespace OpenSim.Region.Environment.Modules } catch (ArgumentOutOfRangeException) { - MainLog.Instance.Warn("TEXTURE", + MainLog.Instance.Error("TEXTURE", "Unable to separate texture into multiple packets: Array bounds failure on asset:" + - m_asset.FullID.ToString() + "- TextureDownloadModule.cs. line:328"); + m_asset.FullID.ToString() ); return; } RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); -- cgit v1.1