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.

172 lines
3.4KB

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