1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.Activities.Runtime
{
using System;
using System.Runtime;
// Pool<T> defined below is a LIFO pool of Pool.IClearable objects.
// It is strongly typed to make the Acquire/Release methods more user
// friendly. To use this pool, subclass it with a concrete type and
// override the CreateNew method. Typically, the type of T will
// have a default ctor and will use an Initialize(...) method in order
// to configure it for use.
// NOTE: CreateNew is required because T : new() requires that the default
// ctor is public. We did not want to put public ctors on some of our
// pooled resources (like NativeActivityContext).
abstract class Pool<T>
{
const int DefaultPoolSize = 10;
T[] items;
int count;
int poolSize;
public Pool()
: this(DefaultPoolSize)
{
}
public Pool(int poolSize)
{
this.items = new T[poolSize];
this.poolSize = poolSize;
}
public T Acquire()
{
if (this.count > 0)
{
this.count--;
T item = this.items[this.count];
return item;
}
else
{
return CreateNew();
}
}
protected abstract T CreateNew();
public void Release(T item)
{
if (this.count < this.poolSize)
{
this.items[this.count] = item;
this.count++;
}
}
}
}
|