Simplify DoubleQueue to eliminate redundant sempahore work.

Exclusion is already guaranteed by the lock on m_syncRoot.
Semaphore could not allow more than one thread in these sections anyway since the underlying SDK structures are not thread-safe.
0.8.0.3
Justin Clark-Casey (justincc) 2014-03-19 00:48:13 +00:00
parent 1497b75361
commit 52b7b40034
1 changed files with 7 additions and 27 deletions

View File

@ -2296,11 +2296,6 @@ namespace OpenSim.Framework
private Queue<T> m_highQueue = new Queue<T>(); private Queue<T> m_highQueue = new Queue<T>();
private object m_syncRoot = new object(); private object m_syncRoot = new object();
private Semaphore m_s = new Semaphore(0, 1);
public DoubleQueue()
{
}
public virtual int Count public virtual int Count
{ {
@ -2329,11 +2324,7 @@ namespace OpenSim.Framework
private void Enqueue(Queue<T> q, T data) private void Enqueue(Queue<T> q, T data)
{ {
lock (m_syncRoot) lock (m_syncRoot)
{
q.Enqueue(data); q.Enqueue(data);
m_s.WaitOne(0);
m_s.Release();
}
} }
public virtual T Dequeue() public virtual T Dequeue()
@ -2363,39 +2354,28 @@ namespace OpenSim.Framework
public bool Dequeue(TimeSpan wait, ref T res) public bool Dequeue(TimeSpan wait, ref T res)
{ {
if (!m_s.WaitOne(wait)) if (!Monitor.TryEnter(m_syncRoot, wait))
return false; return false;
lock (m_syncRoot) try
{ {
if (m_highQueue.Count > 0) if (m_highQueue.Count > 0)
res = m_highQueue.Dequeue(); res = m_highQueue.Dequeue();
else if (m_lowQueue.Count > 0) else if (m_lowQueue.Count > 0)
res = m_lowQueue.Dequeue(); res = m_lowQueue.Dequeue();
if (m_highQueue.Count == 0 && m_lowQueue.Count == 0)
return true; return true;
try
{
m_s.Release();
} }
catch finally
{ {
} Monitor.Exit(m_syncRoot);
return true;
} }
} }
public virtual void Clear() public virtual void Clear()
{ {
lock (m_syncRoot) lock (m_syncRoot)
{ {
// Make sure sem count is 0
m_s.WaitOne(0);
m_lowQueue.Clear(); m_lowQueue.Clear();
m_highQueue.Clear(); m_highQueue.Clear();
} }