20. **Pools**: Controlling access to resources
**********************************************

The package **GNATCOLL.Pools** provides resource pools.

A pool contains a maximum number of resources, which are created on
demand. However, once a resource is no longer needed by the client, it
is not freed, but instead it is released to the pool, which will then
return it again the next time a client requests a resource.

The typical resource is when the creation of the resources is
expensive, for instance a connection to a database or a remote server.
The lazy creation then provides a faster startup time (as well as more
flexibility, since there is no need to allocate dozens of resources if
only one will be needed in the end), and more efficient retrieval
through the reuse of resources.

The pool in this package is task safe, and is intended as a global
variable (or field of a global variable) somewhere in your
application.

The resources are implemented as reference-counted types (through
*GNATCOLL.Refcount*). As a result, as soon as the client no longer has
a handle on them, they are automatically released to the pool and
there is no risk that the client forgets to do so.

*GNATCOLL.Pools* is a generic package where the formal parameters
describe the type of resources, how to create them on demand, what
should happen when a resource is released, and finally how to free a
resource when the pool itself is freed. See "gnatcoll-pools.ads" for a
full and up-to-date description of these parameters.
