using System; using System.Collections; using System.Collections.Generic; using System.Threading; namespace Svelto.DataStructures { public class ThreadSafeQueue { private readonly Queue m_Queue; private readonly ReaderWriterLockSlim LockQ = new ReaderWriterLockSlim(); public ThreadSafeQueue() { m_Queue = new Queue(); } public ThreadSafeQueue(int capacity) { m_Queue = new Queue(capacity); } public ThreadSafeQueue(IEnumerable collection) { m_Queue = new Queue(collection); } public IEnumerator GetEnumerator() { Queue localQ; LockQ.EnterReadLock(); try { localQ = new Queue(m_Queue); } finally { LockQ.ExitReadLock(); } foreach (T item in localQ) yield return item; } public void Enqueue(T item) { LockQ.EnterWriteLock(); try { m_Queue.Enqueue(item); } finally { LockQ.ExitWriteLock(); } } public T Dequeue() { LockQ.EnterWriteLock(); try { return m_Queue.Dequeue(); } finally { LockQ.ExitWriteLock(); } } public void EnqueueAll(IEnumerable ItemsToQueue) { LockQ.EnterWriteLock(); try { foreach (T item in ItemsToQueue) m_Queue.Enqueue(item); } finally { LockQ.ExitWriteLock(); } } public List DequeueAll() { LockQ.EnterWriteLock(); try { List returnList = new List(); while (m_Queue.Count > 0) returnList.Add(m_Queue.Dequeue()); return returnList; } finally { LockQ.ExitWriteLock(); } } public T Peek() { LockQ.EnterWriteLock(); try { T item = default(T); if (m_Queue.Count > 0) item = m_Queue.Peek(); return item; } finally { LockQ.ExitWriteLock(); } } public bool TryDequeue(out T item) { LockQ.EnterWriteLock(); try { if (m_Queue.Count > 0) { item = m_Queue.Dequeue(); return true; } else { item = default(T); return false; } } finally { LockQ.ExitWriteLock(); } } public int Count { get { LockQ.EnterWriteLock(); try { return m_Queue.Count; } finally { LockQ.ExitWriteLock(); } } } } }