aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authordiva2008-12-19 20:31:32 +0000
committerdiva2008-12-19 20:31:32 +0000
commit7691be377a49ec1d0e359b081d6b51c439920265 (patch)
treecfa4c34e4eee56e5b98f95672ec1331ae4ea0c25
parent* minor: Just some method commentary before turning to another subject (diff)
downloadopensim-SC_OLD-7691be377a49ec1d0e359b081d6b51c439920265.zip
opensim-SC_OLD-7691be377a49ec1d0e359b081d6b51c439920265.tar.gz
opensim-SC_OLD-7691be377a49ec1d0e359b081d6b51c439920265.tar.bz2
opensim-SC_OLD-7691be377a49ec1d0e359b081d6b51c439920265.tar.xz
Fix for more child agent mismanagement (like #2846). On enqueueing events, we should not be creating new queues; if the queue doesn't exist -- too bad, event is dropped. That tends to happen just after the client is closed, and the EQ also closed. If someone places an event in that queue after that, that event should be dropped instead of creating a new, erroneous queue.
-rw-r--r--OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs49
1 files changed, 44 insertions, 5 deletions
diff --git a/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs b/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs
index f1f70ff..436231b 100644
--- a/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs
+++ b/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs
@@ -136,7 +136,12 @@ namespace OpenSim.Region.Environment.Modules.Framework
136 } 136 }
137 #endregion 137 #endregion
138 138
139 private BlockingLLSDQueue GetQueue(UUID agentId) 139 /// <summary>
140 /// Always returns a valid queue
141 /// </summary>
142 /// <param name="agentId"></param>
143 /// <returns></returns>
144 private BlockingLLSDQueue TryGetQueue(UUID agentId)
140 { 145 {
141 lock (queues) 146 lock (queues)
142 { 147 {
@@ -150,15 +155,34 @@ namespace OpenSim.Region.Environment.Modules.Framework
150 } 155 }
151 } 156 }
152 157
153 158 /// <summary>
159 /// May return a null queue
160 /// </summary>
161 /// <param name="agentId"></param>
162 /// <returns></returns>
163 private BlockingLLSDQueue GetQueue(UUID agentId)
164 {
165 lock (queues)
166 {
167 if (queues.ContainsKey(agentId))
168 {
169 return queues[agentId];
170 }
171 else
172 return null;
173 }
174 }
175
154 #region IEventQueue Members 176 #region IEventQueue Members
177
155 public bool Enqueue(OSD ev, UUID avatarID) 178 public bool Enqueue(OSD ev, UUID avatarID)
156 { 179 {
157 m_log.DebugFormat("[EVENTQUEUE]: Enqueuing event for {0} in region {1}", avatarID, m_scene.RegionInfo.RegionName); 180 m_log.DebugFormat("[EVENTQUEUE]: Enqueuing event for {0} in region {1}", avatarID, m_scene.RegionInfo.RegionName);
158 try 181 try
159 { 182 {
160 BlockingLLSDQueue queue = GetQueue(avatarID); 183 BlockingLLSDQueue queue = GetQueue(avatarID);
161 queue.Enqueue(ev); 184 if (queue != null)
185 queue.Enqueue(ev);
162 } catch(NullReferenceException e) 186 } catch(NullReferenceException e)
163 { 187 {
164 m_log.Debug("[EVENTQUEUE] Caught exception: " + e); 188 m_log.Debug("[EVENTQUEUE] Caught exception: " + e);
@@ -166,11 +190,26 @@ namespace OpenSim.Region.Environment.Modules.Framework
166 } 190 }
167 return true; 191 return true;
168 } 192 }
193
169 #endregion 194 #endregion
170 195
171 private void OnNewClient(IClientAPI client) 196 private void OnNewClient(IClientAPI client)
172 { 197 {
173 m_log.DebugFormat("[EVENTQUEUE]: New client {0} detected in region {1}", client.AgentId, m_scene.RegionInfo.RegionName); 198 //m_log.DebugFormat("[EVENTQUEUE]: New client {0} detected in region {1}", client.AgentId, m_scene.RegionInfo.RegionName);
199 //lock (queues)
200 //{
201 // if (queues.ContainsKey(client.AgentId))
202 // {
203 // m_log.DebugFormat("[EVENTQUEUE]: Removing old queue for agent {0} in region {1}", client.AgentId,
204 // m_scene.RegionInfo.RegionName);
205 // queues.Remove(client.AgentId);
206 // }
207
208 // m_log.DebugFormat("[EVENTQUEUE]: Adding new queue for agent {0} in region {1}", client.AgentId,
209 // m_scene.RegionInfo.RegionName);
210 // queues[client.AgentId] = new BlockingLLSDQueue();
211 //}
212
174 client.OnLogout += ClientClosed; 213 client.OnLogout += ClientClosed;
175 } 214 }
176 215
@@ -317,7 +356,7 @@ namespace OpenSim.Region.Environment.Modules.Framework
317// m_log.DebugFormat(debug + " ]", agentID, m_scene.RegionInfo.RegionName, System.Threading.Thread.CurrentThread.Name); 356// m_log.DebugFormat(debug + " ]", agentID, m_scene.RegionInfo.RegionName, System.Threading.Thread.CurrentThread.Name);
318// } 357// }
319 358
320 BlockingLLSDQueue queue = GetQueue(agentID); 359 BlockingLLSDQueue queue = TryGetQueue(agentID);
321 OSD element = queue.Dequeue(15000); // 15s timeout 360 OSD element = queue.Dequeue(15000); // 15s timeout
322 361
323 Hashtable responsedata = new Hashtable(); 362 Hashtable responsedata = new Hashtable();