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);
+            }
+        }
+    }
+}