##// END OF EJS Templates
fixed object pool
cin -
r83:397fe8db0806 v2
parent child
Show More
@@ -9,9 +9,9 namespace Implab {
9 9 readonly int m_size;
10 10 readonly MTQueue<T> m_queue = new MTQueue<T>();
11 11
12 volatile bool m_disposed;
12 bool m_disposed;
13 13
14 volatile int m_count;
14 int m_count;
15 15
16 16 public ObjectPool(Func<T> factory, Action<T> cleanup, int size) {
17 17 Safe.ArgumentNotNull(factory, "factory");
@@ -28,21 +28,26 namespace Implab {
28 28 public ObjectPool(Func<T> factory) : this(factory,null,Environment.ProcessorCount+1) {
29 29 }
30 30
31 public ObjectPoolWrapper<T> Allocate() {
31 public ObjectPoolWrapper<T> AllocateAuto() {
32
33 return new ObjectPoolWrapper<T>(Allocate(), this);
34 }
35
36 public T Allocate() {
32 37 if (m_disposed)
33 38 throw new ObjectDisposedException(this.ToString());
34 39
35 40 T instance;
36 41 if (m_queue.TryDequeue(out instance)) {
37 42 Interlocked.Decrement(ref m_count);
38 return instance;
39 43 } else {
40 44 instance = m_factory();
41 45 }
42 return new ObjectPoolWrapper<T>(instance, this);
46 return instance;
43 47 }
44 48
45 49 public void Release(T instance) {
50 Thread.MemoryBarrier();
46 51 if (m_count < m_size && !m_disposed) {
47 52 Interlocked.Increment(ref m_count);
48 53
@@ -55,11 +60,12 namespace Implab {
55 60 // и возможно уже законцена, в таком случае следует извлечь элемент обратно и
56 61 // освободить его. Если операция освобождения кеша еще не заврешилась, то будет
57 62 // изъят и освобожден произвольный элемен, что не повлияет на ход всего процесса.
58 if (m_disposed && m_queue.TryDequeue(out instance))
59 Safe.Dispose(instance);
63 if (m_disposed && m_queue.TryDequeue(out instance) && instance is IDisposable)
64 ((IDisposable)instance).Dispose() ;
60 65
61 66 } else {
62 Safe.Dispose(instance);
67 if (instance is IDisposable)
68 ((IDisposable)instance).Dispose();
63 69 }
64 70 }
65 71
@@ -68,7 +74,8 namespace Implab {
68 74 m_disposed = true;
69 75 T instance;
70 76 while (m_queue.TryDequeue(out instance))
71 Safe.Dispose(instance);
77 if (instance is IDisposable)
78 ((IDisposable)instance).Dispose();
72 79 }
73 80 }
74 81
General Comments 0
You need to be logged in to leave comments. Login now