@@ -1,4 +1,5 | |||||
1 | namespace Implab.Components { |
|
1 | namespace Implab.Components { | |
|
2 | ||||
2 | public enum ExecutionState { |
|
3 | public enum ExecutionState { | |
3 | Uninitialized, |
|
4 | Uninitialized, | |
4 | Initial, |
|
5 | Initial, |
@@ -4,18 +4,17 using System.Threading; | |||||
4 |
|
4 | |||
5 | namespace Implab.Components { |
|
5 | namespace Implab.Components { | |
6 | /// <summary> |
|
6 | /// <summary> | |
7 | /// ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ»ΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². |
|
7 | /// The base class for creating object pools. | |
8 | /// </summary> |
|
8 | /// </summary> | |
9 | /// <remarks> |
|
9 | /// <remarks> | |
10 | /// <para>ΠΡΠ» ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ, |
|
10 | /// <para>The objects pool is offers frequently requested objects to be reused, this gives | |
11 | /// ΡΡΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ². |
|
11 | /// a gool speed improvement for the 'heavy' objects. To avoid memory overhead the pool uses | |
12 | /// ΠΡΠ» ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»Π°Π±ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ |
|
12 | /// weak references allowing CG to do it's work. If there are no free objects in the pool | |
13 | /// ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.</para> |
|
13 | /// they are created on demand. </para> | |
14 | /// <para> |
|
14 | /// <para> | |
15 | /// ΠΠ°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ <see cref="CreateInstance()"/> Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ |
|
15 | /// Implementors need to defined a <see cref="CreateInstance()"/> method | |
16 | /// Π½ΠΎΠ²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ². |
|
|||
17 | /// </para> |
|
16 | /// </para> | |
18 | /// <para>ΠΡΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΠ°Π·Ρ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ².</para> |
|
17 | /// <para>The instances of this class are thred-safe.</para> | |
19 | /// </remarks> |
|
18 | /// </remarks> | |
20 | public abstract class ObjectPool<T> where T : class { |
|
19 | public abstract class ObjectPool<T> where T : class { | |
21 | readonly AsyncQueue<WeakReference> m_queue = new AsyncQueue<WeakReference>(); |
|
20 | readonly AsyncQueue<WeakReference> m_queue = new AsyncQueue<WeakReference>(); | |
@@ -32,11 +31,22 namespace Implab.Components { | |||||
32 | m_size = size; |
|
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 | protected abstract T CreateInstance(); |
|
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 | protected virtual void CleanupInstance(T instance) { |
|
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 | public T Allocate() { |
|
50 | public T Allocate() { | |
41 | WeakReference reference; |
|
51 | WeakReference reference; | |
42 | while (m_queue.TryDequeue(out reference)) { |
|
52 | while (m_queue.TryDequeue(out reference)) { | |
@@ -49,6 +59,11 namespace Implab.Components { | |||||
49 | return CreateInstance(); |
|
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 | public void Release(T instance) { |
|
67 | public void Release(T instance) { | |
53 | if (m_count < m_size && instance != null) { |
|
68 | if (m_count < m_size && instance != null) { | |
54 | Interlocked.Increment(ref m_count); |
|
69 | Interlocked.Increment(ref m_count); |
General Comments 0
You need to be logged in to leave comments.
Login now