streamly-core-0.2.0: Streaming, parsers, arrays and more
Copyright(c) 2020 Composewell Technologies and Contributors
LicenseBSD-3-Clause
Maintainerstreamly@composewell.com
Stabilityexperimental
PortabilityGHC
Safe HaskellSafe-Inferred
LanguageHaskell2010

Streamly.Internal.Data.IOFinalizer

Description

A value associated with an IO action that is automatically called whenever the value is garbage collected.

Synopsis

Documentation

newtype IOFinalizer Source #

An IOFinalizer has an associated IO action that is automatically called whenever the finalizer is garbage collected. The action can be run and cleared prematurely.

You can hold a reference to the finalizer in your data structure, if the data structure gets garbage collected the finalizer will be called.

It is implemented using mkWeakIORef.

Pre-release

Constructors

IOFinalizer (IORef (Maybe (IO ()))) 

newIOFinalizer :: MonadIO m => IO a -> m IOFinalizer Source #

Create a finalizer that calls the supplied function automatically when the it is garbage collected.

/The finalizer is always run using the state of the monad that is captured at the time of calling newFinalizer./

Note: To run it on garbage collection we have no option but to use the monad state captured at some earlier point of time. For the case when the finalizer is run manually before GC we could run it with the current state of the monad but we want to keep both the cases consistent.

Pre-release

runIOFinalizer :: MonadIO m => IOFinalizer -> m () Source #

Run the action associated with the finalizer and deactivate it so that it never runs again. Note, the finalizing action runs with async exceptions masked.

If this function is called multiple times, the action is guaranteed to run once and only once.

Pre-release

clearingIOFinalizer :: MonadIO m => IOFinalizer -> IO a -> m a Source #

Run an action clearing the finalizer atomically wrt async exceptions. The action is run with async exceptions masked.

This function can be called at most once after setting the finalizer. If the finalizer is not set it is considered a bug.

Pre-release