Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
4.4KB

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. namespace Svelto.DataStructures
  5. {
  6. public class ThreadSafeQueue<T>
  7. {
  8. private readonly Queue<T> m_Queue;
  9. private readonly ReaderWriterLockSlim LockQ = new ReaderWriterLockSlim();
  10. public ThreadSafeQueue()
  11. {
  12. m_Queue = new Queue<T>();
  13. }
  14. public ThreadSafeQueue(int capacity)
  15. {
  16. m_Queue = new Queue<T>(capacity);
  17. }
  18. public ThreadSafeQueue(IEnumerable<T> collection)
  19. {
  20. m_Queue = new Queue<T>(collection);
  21. }
  22. public IEnumerator<T> GetEnumerator()
  23. {
  24. Queue<T> localQ;
  25. LockQ.EnterReadLock();
  26. try
  27. {
  28. localQ = new Queue<T>(m_Queue);
  29. }
  30. finally
  31. {
  32. LockQ.ExitReadLock();
  33. }
  34. foreach (T item in localQ)
  35. yield return item;
  36. }
  37. public void Enqueue(T item)
  38. {
  39. LockQ.EnterWriteLock();
  40. try
  41. {
  42. m_Queue.Enqueue(item);
  43. }
  44. finally
  45. {
  46. LockQ.ExitWriteLock();
  47. }
  48. }
  49. public T Dequeue()
  50. {
  51. LockQ.EnterWriteLock();
  52. try
  53. {
  54. return m_Queue.Dequeue();
  55. }
  56. finally
  57. {
  58. LockQ.ExitWriteLock();
  59. }
  60. }
  61. public void EnqueueAll(IEnumerable<T> ItemsToQueue)
  62. {
  63. LockQ.EnterWriteLock();
  64. try
  65. {
  66. foreach (T item in ItemsToQueue)
  67. m_Queue.Enqueue(item);
  68. }
  69. finally
  70. {
  71. LockQ.ExitWriteLock();
  72. }
  73. }
  74. public FasterList<T> DequeueAll()
  75. {
  76. LockQ.EnterWriteLock();
  77. try
  78. {
  79. FasterList<T> returnList = new FasterList<T>();
  80. while (m_Queue.Count > 0)
  81. returnList.Add(m_Queue.Dequeue());
  82. return returnList;
  83. }
  84. finally
  85. {
  86. LockQ.ExitWriteLock();
  87. }
  88. }
  89. public void DequeueAllInto(FasterList<T> list)
  90. {
  91. LockQ.EnterWriteLock();
  92. try
  93. {
  94. while (m_Queue.Count > 0)
  95. list.Add(m_Queue.Dequeue());
  96. }
  97. finally
  98. {
  99. LockQ.ExitWriteLock();
  100. }
  101. }
  102. public FasterList<U> DequeueAllAs<U>() where U:class
  103. {
  104. LockQ.EnterWriteLock();
  105. try
  106. {
  107. FasterList<U> returnList = new FasterList<U>();
  108. while (m_Queue.Count > 0)
  109. returnList.Add(m_Queue.Dequeue() as U);
  110. return returnList;
  111. }
  112. finally
  113. {
  114. LockQ.ExitWriteLock();
  115. }
  116. }
  117. public T Peek()
  118. {
  119. LockQ.EnterWriteLock();
  120. try
  121. {
  122. T item = default(T);
  123. if (m_Queue.Count > 0)
  124. item = m_Queue.Peek();
  125. return item;
  126. }
  127. finally
  128. {
  129. LockQ.ExitWriteLock();
  130. }
  131. }
  132. public void Clear()
  133. {
  134. LockQ.EnterWriteLock();
  135. try
  136. {
  137. m_Queue.Clear();
  138. }
  139. finally
  140. {
  141. LockQ.ExitWriteLock();
  142. }
  143. }
  144. public bool TryDequeue(out T item)
  145. {
  146. LockQ.EnterWriteLock();
  147. try
  148. {
  149. if (m_Queue.Count > 0)
  150. {
  151. item = m_Queue.Dequeue();
  152. return true;
  153. }
  154. else
  155. {
  156. item = default(T);
  157. return false;
  158. }
  159. }
  160. finally
  161. {
  162. LockQ.ExitWriteLock();
  163. }
  164. }
  165. public int Count
  166. {
  167. get
  168. {
  169. LockQ.EnterWriteLock();
  170. try
  171. {
  172. return m_Queue.Count;
  173. }
  174. finally
  175. {
  176. LockQ.ExitWriteLock();
  177. }
  178. }
  179. }
  180. }
  181. }