Safe Haskell | None |
---|---|
Language | Haskell2010 |
This module is designed to be imported qualified, e.g.
import qualified Control.Immortal as Immortal
- data Thread
- create :: MonadBaseControl IO m => (Thread -> m ()) -> m Thread
- createWithLabel :: MonadBaseControl IO m => String -> (Thread -> m ()) -> m Thread
- mortalize :: Thread -> IO ()
- immortalize :: Thread -> IO ()
- stop :: Thread -> IO ()
- wait :: Thread -> IO ()
- waitSTM :: Thread -> STM ()
- threadId :: Thread -> ThreadId
- onFinish :: MonadBaseControl IO m => (Either SomeException () -> m ()) -> m () -> m ()
- onUnexpectedFinish :: MonadBaseControl IO m => Thread -> (Either SomeException () -> m ()) -> m () -> m ()
Documentation
create :: MonadBaseControl IO m => (Thread -> m ()) -> m Thread Source
Spawn a new immortal thread running the given computation.
If the computation ever finishes (either normally or due to an exception), it will be restarted (in the same thread).
The monadic «state» (captured by the MonadBaseControl
instance) will
be preserved if the computation terminates normally, and reset when the
exception is thrown, so be cautious when m
is stateful.
It is completely safe, however, to instantiate m
with
something like ReaderT conf IO
to pass configuration to the new
thread.
createWithLabel :: MonadBaseControl IO m => String -> (Thread -> m ()) -> m Thread Source
Like create
, but also apply the given label to the thread
(using labelThread
).
mortalize :: Thread -> IO () Source
Make a thread mortal. Next time a mortal thread attempts to finish, nothing will prevent it from doing so.
Calling this on an already mortalized thread has no effect.
immortalize :: Thread -> IO () Source
If a thread was mortalize
d, this will make it immortal again. However,
if it finished while being in the mortal state, it won't be resurrected.
Calling this on an immortal thread has no effect.
stop :: Thread -> IO () Source
Stop (kill) an immortal thread.
This is equivalent to making it mortal, and then killing it with an exception.
Note that if the thread has installed its own exception handlers, it may not be killed immediately.
onFinish :: MonadBaseControl IO m => (Either SomeException () -> m ()) -> m () -> m () Source
Run a callback every time the action finishes. This can be used e.g. to log exceptions or attempts to exit when such attempts are not expected. Example usage:
Immortal.create $ \_ -> Immortal.onFinish print myAction
This is nothing more than a simple wrapper around try
.
onUnexpectedFinish :: MonadBaseControl IO m => Thread -> (Either SomeException () -> m ()) -> m () -> m () Source