Improve locking when access queue in EventQueueGetModule

0.7.2-post-fixes
Justin Clark-Casey (justincc) 2011-09-24 01:10:23 +01:00
parent ee78c4d2a8
commit 353170589b
1 changed files with 17 additions and 14 deletions

View File

@ -179,9 +179,10 @@ namespace OpenSim.Region.ClientStack.Linden
{ {
Queue<OSD> queue = GetQueue(avatarID); Queue<OSD> queue = GetQueue(avatarID);
if (queue != null) if (queue != null)
queue.Enqueue(ev); lock (queue)
queue.Enqueue(ev);
} }
catch(NullReferenceException e) catch (NullReferenceException e)
{ {
m_log.Error("[EVENTQUEUE] Caught exception: " + e); m_log.Error("[EVENTQUEUE] Caught exception: " + e);
return false; return false;
@ -338,12 +339,8 @@ namespace OpenSim.Region.ClientStack.Linden
Queue<OSD> queue = GetQueue(agentID); Queue<OSD> queue = GetQueue(agentID);
if (queue != null) if (queue != null)
lock (queue) lock (queue)
{ return queue.Count > 0;
if (queue.Count > 0)
return true;
else
return false;
}
return false; return false;
} }
@ -358,8 +355,6 @@ namespace OpenSim.Region.ClientStack.Linden
element = queue.Dequeue(); // 15s timeout element = queue.Dequeue(); // 15s timeout
} }
int thisID = 0; int thisID = 0;
lock (m_ids) lock (m_ids)
thisID = m_ids[pAgentId]; thisID = m_ids[pAgentId];
@ -431,7 +426,10 @@ namespace OpenSim.Region.ClientStack.Linden
// } // }
Queue<OSD> queue = TryGetQueue(agentID); Queue<OSD> queue = TryGetQueue(agentID);
OSD element = queue.Dequeue(); // 15s timeout OSD element;
lock (queue)
element = queue.Dequeue(); // 15s timeout
Hashtable responsedata = new Hashtable(); Hashtable responsedata = new Hashtable();
@ -470,10 +468,14 @@ namespace OpenSim.Region.ClientStack.Linden
else else
{ {
array.Add(element); array.Add(element);
while (queue.Count > 0)
lock (queue)
{ {
array.Add(queue.Dequeue()); while (queue.Count > 0)
thisID++; {
array.Add(queue.Dequeue());
thisID++;
}
} }
} }
@ -520,6 +522,7 @@ namespace OpenSim.Region.ClientStack.Linden
AvatarID = m_QueueUUIDAvatarMapping[capUUID]; AvatarID = m_QueueUUIDAvatarMapping[capUUID];
} }
} }
if (AvatarID != UUID.Zero) if (AvatarID != UUID.Zero)
{ {
return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID)); return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID));