# HG changeset patch # User cin # Date 1403193860 -14400 # Node ID 90069a2ec20aa8630765d546d6e2073b59ef0e39 # Parent 10c7337d29e76b8ac13e0b09718552b9cf9af860 Added SafePool diff -r 10c7337d29e7 -r 90069a2ec20a Implab/Implab.csproj --- a/Implab/Implab.csproj Thu Jun 19 03:41:28 2014 +0400 +++ b/Implab/Implab.csproj Thu Jun 19 20:04:20 2014 +0400 @@ -92,6 +92,7 @@ + diff -r 10c7337d29e7 -r 90069a2ec20a Implab/SafePool.cs --- /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 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); + } + } + } +}