diff options
Diffstat (limited to 'Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs')
-rw-r--r-- | Assets/ThirdParty/VRM/VRM/DepthFirstScheduler/MonitorQueue.cs | 47 |
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); + } + } + } +} |