-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | A high-performance striped resource pooling implementation
--
-- A high-performance striped pooling abstraction for managing
-- flexibly-sized collections of resources such as database connections.
@package resource-pool
@version 0.2.3.2
-- | A high-performance striped pooling abstraction for managing
-- flexibly-sized collections of resources such as database connections.
--
-- "Striped" means that a single Pool consists of several
-- sub-pools, each managed independently. A single stripe is fine for
-- many applications, and probably what you should choose by default.
-- More stripes will lead to reduced contention in high-performance
-- multicore applications, at a trade-off of causing the maximum number
-- of simultaneous resources in use to grow.
module Data.Pool
data Pool a
-- | A single striped pool.
data LocalPool a
-- | Create a striped resource pool.
--
-- Although the garbage collector will destroy all idle resources when
-- the pool is garbage collected it's recommended to manually
-- destroyAllResources when you're done with the pool so that the
-- resources are freed up as soon as possible.
createPool :: IO a -> (a -> IO ()) -> Int -> NominalDiffTime -> Int -> IO (Pool a)
-- | Temporarily take a resource from a Pool, perform an action with
-- it, and return it to the pool afterwards.
--
--
-- - If the pool has an idle resource available, it is used
-- immediately.
-- - Otherwise, if the maximum number of resources has not yet been
-- reached, a new resource is created and used.
-- - If the maximum number of resources has been reached, this function
-- blocks until a resource becomes available.
--
--
-- If the action throws an exception of any type, the resource is
-- destroyed, and not returned to the pool.
--
-- It probably goes without saying that you should never manually destroy
-- a pooled resource, as doing so will almost certainly cause a
-- subsequent user (who expects the resource to be valid) to throw an
-- exception.
withResource :: MonadBaseControl IO m => Pool a -> (a -> m b) -> m b
-- | Take a resource from the pool, following the same results as
-- withResource. Note that this function should be used with
-- caution, as improper exception handling can lead to leaked resources.
--
-- This function returns both a resource and the LocalPool it
-- came from so that it may either be destroyed (via
-- destroyResource) or returned to the pool (via
-- putResource).
takeResource :: Pool a -> IO (a, LocalPool a)
-- | Similar to withResource, but only performs the action if a
-- resource could be taken from the pool without blocking.
-- Otherwise, tryWithResource returns immediately with
-- Nothing (ie. the action function is not called).
-- Conversely, if a resource can be borrowed from the pool without
-- blocking, the action is performed and it's result is returned, wrapped
-- in a Just.
tryWithResource :: MonadBaseControl IO m => Pool a -> (a -> m b) -> m (Maybe b)
-- | A non-blocking version of takeResource. The
-- tryTakeResource function returns immediately, with
-- Nothing if the pool is exhausted, or Just (a,
-- LocalPool a) if a resource could be borrowed from the pool
-- successfully.
tryTakeResource :: Pool a -> IO (Maybe (a, LocalPool a))
-- | Destroy a resource. Note that this will ignore any exceptions in the
-- destroy function.
destroyResource :: Pool a -> LocalPool a -> a -> IO ()
-- | Return a resource to the given LocalPool.
putResource :: LocalPool a -> a -> IO ()
-- | Destroy all resources in all stripes in the pool. Note that this will
-- ignore any exceptions in the destroy function.
--
-- This function is useful when you detect that all resources in the pool
-- are broken. For example after a database has been restarted all
-- connections opened before the restart will be broken. In that case
-- it's better to close those connections so that takeResource
-- won't take a broken connection from the pool but will open a new
-- connection instead.
--
-- Another use-case for this function is that when you know you are done
-- with the pool you can destroy all idle resources immediately instead
-- of waiting on the garbage collector to destroy them, thus freeing up
-- those resources sooner.
destroyAllResources :: Pool a -> IO ()
instance Typeable LocalPool
instance Typeable Pool
instance Show (Pool a)