mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 01:35:46 +08:00
Port Avination's inventory send throttling
This commit is contained in:
@@ -2233,4 +2233,112 @@ namespace OpenSim.Framework
|
||||
return str.Replace("_", "\\_").Replace("%", "\\%");
|
||||
}
|
||||
}
|
||||
|
||||
public class DoubleQueue<T> where T:class
|
||||
{
|
||||
private Queue<T> m_lowQueue = new Queue<T>();
|
||||
private Queue<T> m_highQueue = new Queue<T>();
|
||||
|
||||
private object m_syncRoot = new object();
|
||||
private Semaphore m_s = new Semaphore(0, 1);
|
||||
|
||||
public DoubleQueue()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual int Count
|
||||
{
|
||||
get { return m_highQueue.Count + m_lowQueue.Count; }
|
||||
}
|
||||
|
||||
public virtual void Enqueue(T data)
|
||||
{
|
||||
Enqueue(m_lowQueue, data);
|
||||
}
|
||||
|
||||
public virtual void EnqueueLow(T data)
|
||||
{
|
||||
Enqueue(m_lowQueue, data);
|
||||
}
|
||||
|
||||
public virtual void EnqueueHigh(T data)
|
||||
{
|
||||
Enqueue(m_highQueue, data);
|
||||
}
|
||||
|
||||
private void Enqueue(Queue<T> q, T data)
|
||||
{
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
m_lowQueue.Enqueue(data);
|
||||
m_s.WaitOne(0);
|
||||
m_s.Release();
|
||||
}
|
||||
}
|
||||
|
||||
public virtual T Dequeue()
|
||||
{
|
||||
return Dequeue(Timeout.Infinite);
|
||||
}
|
||||
|
||||
public virtual T Dequeue(int tmo)
|
||||
{
|
||||
return Dequeue(TimeSpan.FromMilliseconds(tmo));
|
||||
}
|
||||
|
||||
public virtual T Dequeue(TimeSpan wait)
|
||||
{
|
||||
T res = null;
|
||||
|
||||
if (!Dequeue(wait, ref res))
|
||||
return null;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public bool Dequeue(int timeout, ref T res)
|
||||
{
|
||||
return Dequeue(TimeSpan.FromMilliseconds(timeout), ref res);
|
||||
}
|
||||
|
||||
public bool Dequeue(TimeSpan wait, ref T res)
|
||||
{
|
||||
if (!m_s.WaitOne(wait))
|
||||
return false;
|
||||
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
if (m_highQueue.Count > 0)
|
||||
res = m_highQueue.Dequeue();
|
||||
else
|
||||
res = m_lowQueue.Dequeue();
|
||||
|
||||
if (m_highQueue.Count == 0 && m_lowQueue.Count == 0)
|
||||
return true;
|
||||
|
||||
try
|
||||
{
|
||||
m_s.Release();
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Clear()
|
||||
{
|
||||
|
||||
lock (m_syncRoot)
|
||||
{
|
||||
// Make sure sem count is 0
|
||||
m_s.WaitOne(0);
|
||||
|
||||
m_lowQueue.Clear();
|
||||
m_highQueue.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user