summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs')
-rw-r--r--Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs47
1 files changed, 47 insertions, 0 deletions
diff --git a/Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs b/Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs
new file mode 100644
index 00000000..79bf9823
--- /dev/null
+++ b/Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+
+namespace DepthFirstScheduler
+{
+ /// <summary>
+ /// http://blogs.msdn.com/b/toub/archive/2006/04/12/blocking-queues.aspx
+ ///
+ /// 終了を通知するにはnullを投入する手が使える
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ public class MonitorQueue<T>
+ {
+ private Int32 _count = 0;
+ public Int32 Count
+ {
+ get
+ {
+ return _count;
+ }
+ }
+
+ private Queue<T> _queue = new Queue<T>();
+
+ public T Dequeue()
+ {
+ lock (_queue)
+ {
+ while (_count <= 0) Monitor.Wait(_queue);
+ _count--;
+ return _queue.Dequeue();
+ }
+ }
+
+ public void Enqueue(T data)
+ {
+ lock (_queue)
+ {
+ _queue.Enqueue(data);
+ _count++;
+ Monitor.Pulse(_queue);
+ }
+ }
+ }
+}