Bez popisu
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.

UnsafeQueueTests_InJobs.cs 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using NUnit.Framework;
  2. using System.Collections.Generic;
  3. using Unity.Jobs;
  4. using Unity.Burst;
  5. using Unity.Collections;
  6. using Unity.Collections.Tests;
  7. using Assert = FastAssert;
  8. internal class UnsafeQueueTests_InJobs : CollectionsTestCommonBase
  9. {
  10. struct NestedContainerJob : IJob
  11. {
  12. public UnsafeQueue<UnsafeQueue<int>> nestedContainer;
  13. public void Execute()
  14. {
  15. nestedContainer.Clear();
  16. }
  17. }
  18. [BurstCompile(CompileSynchronously = true)]
  19. struct ConcurrentEnqueue : IJobParallelFor
  20. {
  21. public UnsafeQueue<int>.ParallelWriter queue;
  22. [NativeDisableParallelForRestriction]
  23. public NativeArray<int> result;
  24. public int StartIndex;
  25. public void Execute(int index)
  26. {
  27. index += StartIndex;
  28. result[index] = 1;
  29. queue.Enqueue(index);
  30. }
  31. }
  32. [Test]
  33. public void Enqueue()
  34. {
  35. const int queueSize = 100 * 1024;
  36. var queue = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  37. var writeStatus = CollectionHelper.CreateNativeArray<int>(queueSize, CommonRwdAllocator.Handle);
  38. var enqueueJob = new ConcurrentEnqueue()
  39. {
  40. queue = queue.AsParallelWriter(),
  41. result = writeStatus,
  42. StartIndex = 0,
  43. };
  44. var enqueue = enqueueJob.Schedule(queueSize, 1);
  45. enqueue.Complete();
  46. Assert.AreEqual(queueSize, queue.Count, "Job enqueued the wrong number of values");
  47. var allValues = new NativeParallelHashSet<int>(queueSize, Allocator.Persistent);
  48. for (int i = 0; i < queueSize; ++i)
  49. {
  50. Assert.AreEqual(1, writeStatus[i], "Job failed to enqueue value");
  51. int enqueued = queue.Dequeue();
  52. Assert.IsTrue(enqueued >= 0 && enqueued < queueSize, "Job enqueued invalid value");
  53. Assert.IsTrue(allValues.Add(enqueued), "Job enqueued same value multiple times");
  54. }
  55. var disposeJob = queue.Dispose(enqueue);
  56. disposeJob.Complete();
  57. writeStatus.Dispose();
  58. allValues.Dispose();
  59. }
  60. [BurstCompile(CompileSynchronously = true)]
  61. struct EnqueueDequeueJob : IJob
  62. {
  63. public UnsafeQueue<int> queue;
  64. [ReadOnly] public NativeArray<int> arr;
  65. public int val;
  66. public void Execute()
  67. {
  68. for (int i = 0; i < 10000; ++i)
  69. {
  70. queue.Enqueue(0);
  71. val += arr[queue.Dequeue()];
  72. }
  73. }
  74. }
  75. [Test]
  76. public void EnqueueDequeueMultipleQueuesInMultipleJobs()
  77. {
  78. var handles = new NativeArray<JobHandle>(4, Allocator.Temp);
  79. for (int i = 0; i < 10; ++i)
  80. {
  81. var q1 = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  82. var q2 = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  83. var q3 = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  84. var q4 = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  85. var rangeCheck = CollectionHelper.CreateNativeArray<int>(1, CommonRwdAllocator.Handle);
  86. var j1 = new EnqueueDequeueJob {queue = q1, arr = rangeCheck, val = 0};
  87. var j2 = new EnqueueDequeueJob {queue = q2, arr = rangeCheck, val = 0};
  88. var j3 = new EnqueueDequeueJob {queue = q3, arr = rangeCheck, val = 0};
  89. var j4 = new EnqueueDequeueJob {queue = q4, arr = rangeCheck, val = 0};
  90. handles[0] = j1.Schedule();
  91. handles[1] = j2.Schedule();
  92. handles[2] = j3.Schedule();
  93. handles[3] = j4.Schedule();
  94. JobHandle.ScheduleBatchedJobs();
  95. JobHandle.CombineDependencies(handles).Complete();
  96. q1.Dispose();
  97. q2.Dispose();
  98. q3.Dispose();
  99. q4.Dispose();
  100. rangeCheck.Dispose();
  101. }
  102. handles.Dispose();
  103. }
  104. struct EnqueueJob : IJobParallelFor
  105. {
  106. public UnsafeQueue<int>.ParallelWriter Queue;
  107. public void Execute(int index)
  108. {
  109. Queue.Enqueue(index);
  110. }
  111. }
  112. [Test]
  113. public void ToArray_WorksFromJobs()
  114. {
  115. using (var queue = new UnsafeQueue<int>(CommonRwdAllocator.Handle))
  116. {
  117. new EnqueueJob
  118. {
  119. Queue = queue.AsParallelWriter()
  120. }.Schedule(100, 10).Complete();
  121. Assert.AreEqual(100, queue.Count);
  122. using (var arr = queue.ToArray(Allocator.Temp))
  123. {
  124. Assert.AreEqual(100, arr.Length);
  125. arr.Sort();
  126. for (int i = 0; i < arr.Length; i++)
  127. Assert.AreEqual(i, arr[i]);
  128. }
  129. }
  130. }
  131. [Test]
  132. public void UnsafeQueue_ParallelWriter()
  133. {
  134. const int queueSize = 100 * 1024;
  135. var queue = new UnsafeQueue<int>(CommonRwdAllocator.Handle);
  136. var writeStatus = CollectionHelper.CreateNativeArray<int>(queueSize, CommonRwdAllocator.Handle);
  137. var jobHandle = new ConcurrentEnqueue()
  138. {
  139. queue = queue.AsParallelWriter(),
  140. result = writeStatus,
  141. StartIndex = 0,
  142. }.Schedule(queueSize / 2, 1);
  143. jobHandle = new ConcurrentEnqueue()
  144. {
  145. queue = queue.AsParallelWriter(),
  146. result = writeStatus,
  147. StartIndex = queueSize / 2,
  148. }.Schedule(queueSize / 2, 1, jobHandle);
  149. jobHandle.Complete();
  150. Assert.AreEqual(queueSize, queue.Count, "Job enqueued the wrong number of values");
  151. var allValues = new NativeParallelHashSet<int>(queueSize, Allocator.Persistent);
  152. for (int i = 0; i < queueSize; ++i)
  153. {
  154. Assert.AreEqual(1, writeStatus[i], "Job failed to enqueue value");
  155. int enqueued = queue.Dequeue();
  156. Assert.IsTrue(enqueued >= 0 && enqueued < queueSize, "Job enqueued invalid value");
  157. Assert.IsTrue(allValues.Add(enqueued), "Job enqueued same value multiple times");
  158. }
  159. var disposeJob = queue.Dispose(jobHandle);
  160. disposeJob.Complete();
  161. writeStatus.Dispose();
  162. allValues.Dispose();
  163. }
  164. }