using Implab.Parallels; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Implab { public class SafePool where T : new() { readonly MTQueue m_queue = new MTQueue(); 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); } } } }