e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
67 lines
1.8 KiB
C#
67 lines
1.8 KiB
C#
//-----------------------------------------------------------------------------
|
|
// 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++;
|
|
}
|
|
}
|
|
}
|
|
}
|