Mercurial > pub > ImplabNet
diff Implab/SafePool.cs @ 61:90069a2ec20a
Added SafePool
author | cin |
---|---|
date | Thu, 19 Jun 2014 20:04:20 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab/SafePool.cs Thu Jun 19 20:04:20 2014 +0400 @@ -0,0 +1,40 @@ +using Implab.Parallels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; + +namespace Implab { + public class SafePool<T> where T : new() { + readonly MTQueue<T> m_queue = new MTQueue<T>(); + readonly int m_size; + int m_count = 0; + + public SafePool() : this(10) { + + } + + public SafePool(int size) { + Safe.ArgumentInRange(size,1,size,"size"); + + m_size = size; + } + + public T Allocate() { + T instance; + if (m_queue.TryDequeue(out instance)) { + Interlocked.Decrement(ref m_count); + return instance; + } + return new T(); + } + + public void Release(T instance) { + if (m_count < m_size) { + Interlocked.Increment(ref m_count); + m_queue.Enqueue(instance); + } + } + } +}