diff --git a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs index 4e96572f17..6ebf47fbe7 100644 --- a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs +++ b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs @@ -49,7 +49,7 @@ namespace OpenSim.Region.Environment.Modules private readonly BlockingQueue m_queueSenders = new BlockingQueue(); - private Dictionary m_userTextureServices = + private readonly Dictionary m_userTextureServices = new Dictionary(); private Thread m_thread; @@ -73,6 +73,22 @@ namespace OpenSim.Region.Environment.Modules m_scenes.Add(scene); m_scene = scene; m_scene.EventManager.OnNewClient += NewClient; + m_scene.EventManager.OnRemovePresence += EventManager_OnRemovePresence; + } + } + + private void EventManager_OnRemovePresence(LLUUID agentId) + { + UserTextureDownloadService textureService; + + lock (m_userTextureServices) + { + if( m_userTextureServices.TryGetValue( agentId, out textureService )) + { + textureService.Close(); + + m_userTextureServices.Remove(agentId); + } } } diff --git a/OpenSim/Region/Environment/Modules/UserTextureDownloadService.cs b/OpenSim/Region/Environment/Modules/UserTextureDownloadService.cs index 9a5b362bcd..5e768eefea 100644 --- a/OpenSim/Region/Environment/Modules/UserTextureDownloadService.cs +++ b/OpenSim/Region/Environment/Modules/UserTextureDownloadService.cs @@ -94,5 +94,18 @@ namespace OpenSim.Region.Environment.Modules m_sharedSendersQueue.Enqueue(textureSender); } } + + internal void Close() + { + lock (m_textureSenders) + { + foreach( TextureSender textureSender in m_textureSenders.Values ) + { + textureSender.Cancel = true; + } + + m_textureSenders.Clear(); + } + } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/SceneEvents.cs b/OpenSim/Region/Environment/Scenes/SceneEvents.cs index 5bf23aca2c..d3822f0be0 100644 --- a/OpenSim/Region/Environment/Scenes/SceneEvents.cs +++ b/OpenSim/Region/Environment/Scenes/SceneEvents.cs @@ -60,7 +60,7 @@ namespace OpenSim.Region.Environment.Scenes public event OnNewPresenceDelegate OnNewPresence; - public delegate void OnRemovePresenceDelegate(LLUUID uuid); + public delegate void OnRemovePresenceDelegate(LLUUID agentId); public event OnRemovePresenceDelegate OnRemovePresence; @@ -165,11 +165,11 @@ namespace OpenSim.Region.Environment.Scenes OnNewPresence(presence); } - public void TriggerOnRemovePresence(LLUUID uuid) + public void TriggerOnRemovePresence(LLUUID agentId) { if (OnRemovePresence != null) { - OnRemovePresence(uuid); + OnRemovePresence(agentId); } }