##// END OF EJS Templates
fixed object pool
fixed object pool

File last commit:

r83:397fe8db0806 v2
r83:397fe8db0806 v2
Show More
ObjectPool.cs
92 lines | 3.1 KiB | text/x-csharp | CSharpLexer
cin
added object pool
r82 using System;
using Implab.Parallels;
using System.Threading;
namespace Implab {
public class ObjectPool<T> : IDisposable {
readonly Func<T> m_factory;
readonly Action<T> m_cleanup;
readonly int m_size;
readonly MTQueue<T> m_queue = new MTQueue<T>();
cin
fixed object pool
r83 bool m_disposed;
cin
added object pool
r82
cin
fixed object pool
r83 int m_count;
cin
added object pool
r82
public ObjectPool(Func<T> factory, Action<T> cleanup, int size) {
Safe.ArgumentNotNull(factory, "factory");
Safe.ArgumentInRange(size, 1, size, "size");
m_factory = factory;
m_cleanup = cleanup;
m_size = size;
}
public ObjectPool(Func<T> factory, Action<T> cleanup) : this(factory,cleanup,Environment.ProcessorCount+1) {
}
public ObjectPool(Func<T> factory) : this(factory,null,Environment.ProcessorCount+1) {
}
cin
fixed object pool
r83 public ObjectPoolWrapper<T> AllocateAuto() {
return new ObjectPoolWrapper<T>(Allocate(), this);
}
public T Allocate() {
cin
added object pool
r82 if (m_disposed)
throw new ObjectDisposedException(this.ToString());
T instance;
if (m_queue.TryDequeue(out instance)) {
Interlocked.Decrement(ref m_count);
} else {
instance = m_factory();
}
cin
fixed object pool
r83 return instance;
cin
added object pool
r82 }
public void Release(T instance) {
cin
fixed object pool
r83 Thread.MemoryBarrier();
cin
added object pool
r82 if (m_count < m_size && !m_disposed) {
Interlocked.Increment(ref m_count);
if (m_cleanup != null)
m_cleanup(instance);
m_queue.Enqueue(instance);
// пока элемент возвращался в кеш, была начата операция освобождения всего кеша
// и возможно уже законцена, в таком случае следует извлечь элемент обратно и
// освободить его. Если операция освобождения кеша еще не заврешилась, то будет
// изъят и освобожден произвольный элемен, что не повлияет на ход всего процесса.
cin
fixed object pool
r83 if (m_disposed && m_queue.TryDequeue(out instance) && instance is IDisposable)
((IDisposable)instance).Dispose() ;
cin
added object pool
r82
} else {
cin
fixed object pool
r83 if (instance is IDisposable)
((IDisposable)instance).Dispose();
cin
added object pool
r82 }
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
m_disposed = true;
T instance;
while (m_queue.TryDequeue(out instance))
cin
fixed object pool
r83 if (instance is IDisposable)
((IDisposable)instance).Dispose();
cin
added object pool
r82 }
}
#region IDisposable implementation
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
}