aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authordiva2008-12-18 18:11:29 +0000
committerdiva2008-12-18 18:11:29 +0000
commit3a56d91974db98116b8e524dd5fe0d661df30b19 (patch)
tree963522b16dbf35d096b6aca0990c34545f5c523d /OpenSim/Region
parentEnabled complex meshing for simple box prims with non-zero shear (diff)
downloadopensim-SC-3a56d91974db98116b8e524dd5fe0d661df30b19.zip
opensim-SC-3a56d91974db98116b8e524dd5fe0d661df30b19.tar.gz
opensim-SC-3a56d91974db98116b8e524dd5fe0d661df30b19.tar.bz2
opensim-SC-3a56d91974db98116b8e524dd5fe0d661df30b19.tar.xz
This may fix mantis #2855. There was a race condition on the TextureDownloadModule upon clients (ScenePresences) being closed. If there were still textures to send, the UserTextureServices was created again, but pointing to the old IClient that had just been closed, which made things not work upon that user returning to that region.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs58
1 files changed, 49 insertions, 9 deletions
diff --git a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs
index a7ad37d..35fa5ed 100644
--- a/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs
+++ b/OpenSim/Region/Environment/Modules/Agent/TextureDownload/TextureDownloadModule.cs
@@ -121,7 +121,7 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload
121 if (m_userTextureServices.TryGetValue(agentId, out textureService)) 121 if (m_userTextureServices.TryGetValue(agentId, out textureService))
122 { 122 {
123 textureService.Close(); 123 textureService.Close();
124 m_log.DebugFormat("[TEXTURE MODULE]: Removing UserTextureServices from {0}", m_scene.RegionInfo.RegionName); 124 //m_log.DebugFormat("[TEXTURE MODULE]: Removing UserTextureServices from {0}", m_scene.RegionInfo.RegionName);
125 m_userTextureServices.Remove(agentId); 125 m_userTextureServices.Remove(agentId);
126 } 126 }
127 } 127 }
@@ -129,17 +129,60 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload
129 129
130 public void NewClient(IClientAPI client) 130 public void NewClient(IClientAPI client)
131 { 131 {
132 UserTextureDownloadService textureService;
133
134 lock (m_userTextureServices)
135 {
136 if (m_userTextureServices.TryGetValue(client.AgentId, out textureService))
137 {
138 textureService.Close();
139 //m_log.DebugFormat("[TEXTURE MODULE]: Removing outdated UserTextureServices from {0}", m_scene.RegionInfo.RegionName);
140 m_userTextureServices.Remove(client.AgentId);
141 }
142 m_userTextureServices.Add(client.AgentId, new UserTextureDownloadService(client, m_scene, m_queueSenders));
143 }
144
132 client.OnRequestTexture += TextureRequest; 145 client.OnRequestTexture += TextureRequest;
133 } 146 }
134 147
148 /// I'm commenting this out, and replacing it with the implementation below, which
149 /// may return a null value. This is necessary for avoiding race conditions
150 /// recreating UserTextureServices for clients that have just been closed.
151 /// That behavior of always returning a UserTextureServices was causing the
152 /// A-B-A problem (mantis #2855).
153 ///
154 ///// <summary>
155 ///// Does this user have a registered texture download service?
156 ///// </summary>
157 ///// <param name="userID"></param>
158 ///// <param name="textureService"></param>
159 ///// <returns>Always returns true, since a service is created if one does not already exist</returns>
160 //private bool TryGetUserTextureService(
161 // IClientAPI client, out UserTextureDownloadService textureService)
162 //{
163 // lock (m_userTextureServices)
164 // {
165 // if (m_userTextureServices.TryGetValue(client.AgentId, out textureService))
166 // {
167 // //m_log.DebugFormat("[TEXTURE MODULE]: Found existing UserTextureServices in ", m_scene.RegionInfo.RegionName);
168 // return true;
169 // }
170
171 // m_log.DebugFormat("[TEXTURE MODULE]: Creating new UserTextureServices in ", m_scene.RegionInfo.RegionName);
172 // textureService = new UserTextureDownloadService(client, m_scene, m_queueSenders);
173 // m_userTextureServices.Add(client.AgentId, textureService);
174
175 // return true;
176 // }
177 //}
178
135 /// <summary> 179 /// <summary>
136 /// Does this user have a registered texture download service? 180 /// Does this user have a registered texture download service?
137 /// </summary> 181 /// </summary>
138 /// <param name="userID"></param> 182 /// <param name="userID"></param>
139 /// <param name="textureService"></param> 183 /// <param name="textureService"></param>
140 /// <returns>Always returns true, since a service is created if one does not already exist</returns> 184 /// <returns>A UserTextureDownloadService or null in the output parameter, and true or false accordingly.</returns>
141 private bool TryGetUserTextureService( 185 private bool TryGetUserTextureService(IClientAPI client, out UserTextureDownloadService textureService)
142 IClientAPI client, out UserTextureDownloadService textureService)
143 { 186 {
144 lock (m_userTextureServices) 187 lock (m_userTextureServices)
145 { 188 {
@@ -149,11 +192,8 @@ namespace OpenSim.Region.Environment.Modules.Agent.TextureDownload
149 return true; 192 return true;
150 } 193 }
151 194
152 m_log.DebugFormat("[TEXTURE MODULE]: Creating new UserTextureServices in ", m_scene.RegionInfo.RegionName); 195 textureService = null;
153 textureService = new UserTextureDownloadService(client, m_scene, m_queueSenders); 196 return false;
154 m_userTextureServices.Add(client.AgentId, textureService);
155
156 return true;
157 } 197 }
158 } 198 }
159 199