@@ -1,4 +1,5 | |||
|
1 | 1 | namespace Implab.Components { |
|
2 | ||
|
2 | 3 | public enum ExecutionState { |
|
3 | 4 | Uninitialized, |
|
4 | 5 | Initial, |
@@ -4,18 +4,17 using System.Threading; | |||
|
4 | 4 | |
|
5 | 5 | namespace Implab.Components { |
|
6 | 6 | /// <summary> |
|
7 | /// Базовый класс для создания пулов объектов. | |
|
7 | /// The base class for creating object pools. | |
|
8 | 8 | /// </summary> |
|
9 | 9 | /// <remarks> |
|
10 | /// <para>Пул объектов позволяет многократно использовать один и тотже объект, | |
|
11 | /// что актуально для объектов, создание которых требует существенных ресурсов. | |
|
12 | /// Пул объектов использует слабые ссылки, чтобы не препятствовать освобождению | |
|
13 | /// ресурсов и создает новые объекты при необходимости.</para> | |
|
10 | /// <para>The objects pool is offers frequently requested objects to be reused, this gives | |
|
11 | /// a gool speed improvement for the 'heavy' objects. To avoid memory overhead the pool uses | |
|
12 | /// weak references allowing CG to do it's work. If there are no free objects in the pool | |
|
13 | /// they are created on demand. </para> | |
|
14 | 14 | /// <para> |
|
15 | /// Наследники должны реализовывать метод <see cref="CreateInstance()"/> для создания | |
|
16 | /// новых экземпляров. | |
|
15 | /// Implementors need to defined a <see cref="CreateInstance()"/> method | |
|
17 | 16 | /// </para> |
|
18 | /// <para>Пул поддерживает обращения сразу из нескольких потоков.</para> | |
|
17 | /// <para>The instances of this class are thred-safe.</para> | |
|
19 | 18 | /// </remarks> |
|
20 | 19 | public abstract class ObjectPool<T> where T : class { |
|
21 | 20 | readonly AsyncQueue<WeakReference> m_queue = new AsyncQueue<WeakReference>(); |
@@ -32,11 +31,22 namespace Implab.Components { | |||
|
32 | 31 | m_size = size; |
|
33 | 32 | } |
|
34 | 33 | |
|
34 | /// <summary> | |
|
35 | /// Creates the instance if there are no free ones in the pool. | |
|
36 | /// </summary> | |
|
37 | /// <returns>The new instance.</returns> | |
|
35 | 38 | protected abstract T CreateInstance(); |
|
36 | 39 | |
|
40 | /// <summary> | |
|
41 | /// Cleanups the instance. | |
|
42 | /// </summary> | |
|
43 | /// <param name="instance">The instance to cleanup and prepare it for the next use.</param> | |
|
37 | 44 | protected virtual void CleanupInstance(T instance) { |
|
38 | 45 | } |
|
39 | 46 | |
|
47 | /// <summary> | |
|
48 | /// Allocate free instance from the pool or reates a new one. | |
|
49 | /// </summary> | |
|
40 | 50 | public T Allocate() { |
|
41 | 51 | WeakReference reference; |
|
42 | 52 | while (m_queue.TryDequeue(out reference)) { |
@@ -49,6 +59,11 namespace Implab.Components { | |||
|
49 | 59 | return CreateInstance(); |
|
50 | 60 | } |
|
51 | 61 | |
|
62 | /// <summary> | |
|
63 | /// Release the specified instance and returns it to the pool of free instances. | |
|
64 | /// </summary> | |
|
65 | /// <param name="instance">The instance to return to the pool.</param> | |
|
66 | /// <remarks>Before the instance is returned to the pool the <see cref="CleanupInstance(T)"/> is called.</remarks> | |
|
52 | 67 | public void Release(T instance) { |
|
53 | 68 | if (m_count < m_size && instance != null) { |
|
54 | 69 | Interlocked.Increment(ref m_count); |
General Comments 0
You need to be logged in to leave comments.
Login now